在实际开发中,我们常常遇到关联数据的情况,如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

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

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

    ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...

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

    在实际开发中,我们经常遇到关联数据的情况,如User对象拥有若干Book对象 每一个Book对象描写叙述了归属于一个User信息,这样的情况下,我们应该怎样处理? 通过单独的Statement操作固然 ...

  3. MyBatis初级实战之五:一对一关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. ibatis实战之OR映射

    相对Hibernate等ORM实现而言,ibatis的映射配置更为简洁直接,以下是一个典型的配置文件. <?xml version="1.0" encoding=" ...

  5. ibatis实战之基础环境搭建

    关于ibatis的介绍.优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料. 一.准备工作 1.下载ibatis软件包http://download.csdn.net/de ...

  6. Jmeter+Badboy实战经验三 Jmeter关联相关知识

    1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...

  7. mysql实战优化之八:关联查询优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHE ...

  8. MyBatis初级实战之六:一对多关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Ibatis教程

    Ibatis教程 |字号     转自:http://blog.csdn.net/lhminjava/article/details/1871136 ibatis 开发指南ibatis Quick S ...

随机推荐

  1. Matlab基于学习------------------函数微分学

    <span style="font-size:18px;">% 函数微分学 % 函数微分学难比功能区,中的积分函数的性质整体叙述性说明.在某些时候差描述叙事的斜率功能 ...

  2. 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询

    这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...

  3. asp.net 操作XML

    using System.Xml; using System.Data; using System.IO;   string xmlpath = HttpRuntime.AppDomainAppPat ...

  4. C# 获取与解析枚举类型的 DescriptionAttribute

    原文:C# 获取与解析枚举类型的 DescriptionAttribute System.ComponentModel.DescriptionAttribute 这个 Attribute,经常被用来为 ...

  5. 在线Youtube视频下载,修改文本,剪切制作动画的最新方法

    刚刚(减去编写本文章的时间,大概20分钟前吧)在看国外最新技术资讯的时候发现有个方法可以让我们快速去下载Youtube上面的视频,不敢独享,我自己都没有怎么玩就所以立刻post上来广而告之,希望对大家 ...

  6. php rsa 加密、解密、签名、验签

    由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...

  7. oracle 存储过程的基本语法

    原文:oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) I ...

  8. ASP.NET 5 Hello World

    ASP.NET 5系列教程 (二):Hello World   本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下: 创建ASP.NET 5 工程 添加 T ...

  9. 终于有人把O2O、C2C、B2B、B2C的区别讲透了!

    终于有人把O2O.C2C.B2B.B2C的区别讲透了! 一.O2O.C2C.B2B.B2C的区别在哪里? O2O是online to offline分为四种运营模式: 1.online to offl ...

  10. 【原版的:参赛作品】窥秘懒---android打开下拉手势刷新时代

    小飒的成长史原创作品:窥视懒人的秘密---android下拉刷新开启手势的新纪元转载请注明出处 **************************************************** ...