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 = 1Lprivate 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 sqlMapConfigPUBLIC "-//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



           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/hffygc/article/details/87629433
今日推荐