ibatis实战之中的一个对多关联

在实际开发中,我们经常遇到关联数据的情况,如User对象拥有若干Book对象

每一个Book对象描写叙述了归属于一个User信息,这样的情况下,我们应该怎样处理?

通过单独的Statement操作固然能够实现(通过Statement用于读取用户数据,再手工调用另外一个Statement

依据用户ID返回相应的book信息).只是这样未免失之繁琐.以下我们就看看在ibatis中,怎样对关联数据进行操。

ibatis中,提供了Statement嵌套支持,通过Statement嵌套,我们就可以实现关联数据的操作。

例如以下步骤演示一对多关联

1、创建user(id,name,age)表和book(id,name,uid)表

2、POJO类

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	private int id;
	private String name;
	private int age;
	/**
	 * ibatis一对多关联
	 */
	private Set<Book> books = new HashSet<Book>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public Set<Book> getBooks() {
		return books;
	}
	public void setBooks(Set<Book> books) {
		this.books = books;
	}
}
public class Book {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

3、创建User.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
	<typeAlias alias="user" type="com.itmyhome.User" />
	<typeAlias alias="book" type="com.itmyhome.Book"/>

 	<!-- 一对多查询,一个User相应多个Book -->
	<resultMap id="get_user_result" class="user">
		<result property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<result property="books" column="id" select="User.getBookByUserId"/>
	</resultMap>

	<!-- 查询主表 -->
	<select id="getUser" parameterClass="java.lang.String" resultMap="get_user_result">
		<![CDATA[
			select * from user where id = #id#
		]]>
	</select>

	<!-- 查询子表 -->
	<select id="getBookByUserId" parameterClass="int" resultClass="book">
		<![CDATA[
		select *
		from book
		where uid = #uid#
		]]>
	</select>

</sqlMap>

4、SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings
		cacheModelsEnabled="true"
		enhancementEnabled="true"
		lazyLoadingEnabled="true"
		errorTracingEnabled="true"
		maxRequests="32"
		maxSessions="10"
		maxTransactions="5"
		useStatementNamespaces="true" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
			<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis" />
			<property name="JDBC.Username" value="root" />
			<property name="JDBC.Password" value="root" />
			<property name="Pool.MaximumActiveConnections" value="10" />
			<property name="Pool.MaximumIdleConnections" value="5" />
			<property name="Pool.MaximumCheckoutTime" value="120000" />
			<property name="Pool.TimeToWait" value="500" />
			<property name="Pool.PingQuery" value="select 1 from ACCOUNT" />
			<property name="Pool.PingEnabled" value="false" />
			<property name="Pool.PingConnectionsOlderThan" value="1" />
			<property name="Pool.PingConnectionsNotUsedFor" value="1" />
		</dataSource>
	</transactionManager>
	<sqlMap resource="com/itmyhome/User.xml" />
</sqlMapConfig>

以上可能须要改动ConnectionURL,Username,Password

5、MyAppSqlConfig.java

import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class MyAppSqlConfig {
	private static final SqlMapClient sqlMap;
	static {
		try {
			String resource = "SqlMapConfig.xml";
			Reader reader = Resources.getResourceAsReader(resource); //读取配置文件
			sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);
		}
	}
	public static SqlMapClient getSqlMapInstance() {
		return sqlMap;
	}
}


6、測试类

public class UserTest {
	public static void main(String[] args) {
		SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();
		try {
			/**
			 * 查询ID为5的用户,以下查询如果有数据存在
			 */
			List list = sqlMap.queryForList("User.getUser","5");
			for(int i=0;i<list.size();i++){
				User user = (User)list.get(i);
				/**
				 * 得到User所拥有的Book
				 */
				Set<Book> books = (Set<Book>)user.getBooks();
				Iterator ite = books.iterator();
				while(ite.hasNext()){
					Book book = (Book)ite.next();
					System.out.println("用户:"+user.getName()+",书籍: "+book.getName());
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

这里通过在resultMap中定义嵌套查询getBookByUserId,我们实现了关联数据的读取。


项目结构图:

项目源代码下载:http://download.csdn.net/detail/itmyhome/7495501

欢迎增加JAVA技术交流群:74955800

ibatis实战之中的一个对多关联

时间: 2024-11-05 15:00:09

ibatis实战之中的一个对多关联的相关文章

ibatis实战之一对多关联

在实际开发中,我们常常遇到关联数据的情况,如User对象拥有若干Book对象 每个Book对象描述了归属于一个User信息,这种情况下,我们应该如何处理? 通过单独的Statement操作固然可以实现(通过Statement用于读取用户数据,再手工调用另外一个Statement 根据用户ID返回对应的book信息).不过这样未免失之繁琐.下面我们就看看在ibatis中,如何对关联数据进行操. ibatis中,提供了Statement嵌套支持,通过Statement嵌套,我们即可实现关联数据的操作

ibatis实战之基础环境搭建

关于ibatis的介绍.优缺点,以及ibatis和hibernate的比較再此不在赘述.可參阅其它资料. 一.准备工作 1.下载ibatis软件包http://download.csdn.net/detail/itmyhome/7473661 所需jar包为:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar 2.创建測试数据库.并新建user表,当中包括三个字段: id(int)   name(varchar)   age(int) ps:以mysq

ibatis实战之插入数据(自动生成主键)

--------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert>元素的一个专用子元素)来获取这些自动生成的主键的值并将其保存在对象中.完成这项工作可以有两种方式,具体选择何种方式由你所使用的具体的主键生成技术来确定. 第一种方式是,当你把记录插入到数据库中并且数据库为该记录自动生成了主键值之后,就立即抓取该键值.此时要注意的是,必须确保所使用的数据库驱动程序确实能返回你执行上一条insert语句所得到的键值.

ibatis实战之OR映射

http://blog.csdn.net/asmcos/article/details/46676101 http://blog.csdn.net/asmcos/article/details/46676087 http://blog.csdn.net/asmcos/article/details/46676073 http://blog.csdn.net/asmcos/article/details/46676053 http://blog.csdn.net/asmcos/article/de

spring+ibatis实战

一:需要的jar 二:实体Demo 三:相关配置文件 四:接口 五:测试

Ibatis组合键关联查询

在使用Ibatis时,会经常遇到关联查询,一般有两种解决方案: 使用代码进行关联查询 使用Ibatis配置文件进行关联查询 使用代码进行关联查询不作解释,本次主要是针对Ibatis配置文件进行关联查询进行探究,如发现有问题或不当之处还请不吝赐教! 对于Ibatis配置文件进行关联查询,下面举一个例子进行辅助描述: 假设有这样一个需求:某一网站页面需要展示文章,文章有两种不同的类别,分别为A1.A2,在每篇文章后都会跟随一些相关的商品,同一商品可关联任意类别文章. 分析该需求可得知,文章一张表,相

[Java聊天室server]实战之二 监听类

前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更想和广大程序猿分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比方近期在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字...

实战分析《五星定位胆稳赚技巧》命中率高达99%值得收藏

五星定位胆稳赚技巧 ┿导师Q[8285655]精准一对一指导, 长久盈利轻松賸率95%,已助上千人成功翻盘,欢迎增加,沟通交流!我分享这些不为别的,只为像我一样的人能早日翻盘! 五星9跨的出现关注豹子的开出 期数 5期内 (注意要根据9跨出现的频率 如果九跨出现的次数 10期开奖号中有四期以上出现九跨这个时候就要重点关注这个豹子的开出).五星重三码 连续重三期以上 关注豹子的开出 周期 15期内五星前中后号码相同 也就是前中后号码的跨度相同是 关注豹子的开出 周期 13期内前中后组三扎堆开过于频

入门实战《深度学习技术图像处理入门》+《视觉SLAM十四讲从理论到实践》

学习图像识别处理,想在数据分析竞赛中取得较高的排名,看了<深度学习技术图像处理入门>电子书,一边看电子书一边做标记,对配套的代码也做了测试,收获颇多. 从机器学习.图像处理的基本概念入手,逐步阐述深度学习图像处理技术的基本原理以及简单的实现. 学习理论后做实验,使用卷积神经网络进行端到端学习,构建深度卷积神经网络,使用循环神经网络改进模型,评估模型,测试模型.最关键的是可以将模型运用于实战之中,将深度学习模型导入到工程中,数据类型转换函数,实施CAM可视化,这是我最需要的. 视觉和图形学真是一