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-08-05 16:56:38

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

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

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

机器学习day16 机器学习实战Apriori算法进行关联分析

上一章学习了非监督学习的聚类,聚类算法可以将不同性质的分类分开.这两天学习了apriori算法进行关联分析,感觉是目前最难理解的一章了,并且书中还有个很坑爹的错误,作者存在很大的疏忽. Apriori算法关联分析:从大规模数据集中寻找物品间的隐含关系被称作关联分析或者关联规则学习. 关联分析应用1:我们以前学习的是根据特性进行分类或者回归预测,并没有挖掘特性之间的关系,关联分析可以用于分析数据集中特性之间的关系,可以得到哪些特性频繁的共同出现或者特性之间的关系(比如出现特性A就会很大几率出现特性

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

Loadrunner VuGen实战---集合点、关联(四)

一.集合点: 1.我们可以通过以下举例来理解这个概念: 10名运动员从起点出发,要跑3圈,规定再次通过起点时要等带所有运动员全部到达后,才能进行第二圈赛跑.   2.实战操作; 1)脚本中点击“Insert--Rendezvous”进行对应位置集合点插入. 2)Controller中点击“Scenario--Rendezvous”,其中进行Policy的设置,在这里可以对集合点的触发条件进行调整. 二.关联: 1.什么条件下使用关联呢? 首先,如果多次回放都报错,且自身感觉录制并没有任何问题.

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 三:相关配置文件 四:接口 五:测试

hibernate基础知识

Hibernate 1.orm和hibernate orm (object relation mapping)对象关系数据库映射 ,是面向对象编程和数据库的桥梁.当我们采用ORM框架以后,应用程序不在直接访问底层数据库,而是以面向对象的方式操作持久化对象(PO),而orm将面向对象的操作转化成Sql操作 orm的映射关系:: 数据表映射类,即持久化类被映射到表中 数据表行映射对象(实例)即表的每一行是一个实例 数据表的列对应类的属性 目前流行的orm框架: JPA:官方标准 Hibernate 

基于JavaEE的网新恒天人事管理系统的设计与实现

获取项目源文件,技术交流与指导联系Q:1225467431 摘要:随着网络技术的不断发展及其在企业管理工作中的应用,在企业建立企业人事管理系统就显得十分必要.所以设计一个企业人事管理系统可以更方便的帮助管理者管理一家企业.本系统的开发正是适应了这一需求,经过实际的需求分析,本系统采用了JavaEE平台中最为流行的Spring+Spring MVC+MyBatis框架,以Tomcat作为应用并选择MySQL数据库管理系统作为工具进行开发.系统包含管理员.HR.领导.普通员工四种不同的用户.操作简便