ibatis实战之一对多关联

来源:互联网 发布:仿猪八戒源码 编辑:程序博客网 时间:2024/06/05 10:10

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类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class User implements Serializable {  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.     private int id;  
  5.     private String name;  
  6.     private int age;  
  7.     /** 
  8.      * ibatis一对多关联 
  9.      */  
  10.     private Set<Book> books = new HashSet<Book>();  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(int id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public int getAge() {  
  24.         return age;  
  25.     }  
  26.     public void setAge(int age) {  
  27.         this.age = age;  
  28.     }  
  29.   
  30.     public Set<Book> getBooks() {  
  31.         return books;  
  32.     }  
  33.     public void setBooks(Set<Book> books) {  
  34.         this.books = books;  
  35.     }  
  36. }  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Book {  
  2.     private int id;  
  3.     private String name;  
  4.       
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.       
  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.       
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.       
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20. }  

3、创建User.xml文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <!DOCTYPE sqlMap    
  3. PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"    
  4. "http://www.ibatis.com/dtd/sql-map-2.dtd">  
  5. <sqlMap namespace="User">  
  6.     <typeAlias alias="user" type="com.itmyhome.User" />  
  7.     <typeAlias alias="book" type="com.itmyhome.Book"/>  
  8.       
  9.     <!-- 一对多查询,一个User对应多个Book -->  
  10.     <resultMap id="get_user_result" class="user">  
  11.         <result property="id" column="id"/>  
  12.         <result property="name" column="name"/>  
  13.         <result property="age" column="age"/>  
  14.         <result property="books" column="id" select="User.getBookByUserId"/>  
  15.     </resultMap>  
  16.       
  17.     <!-- 查询主表 -->  
  18.     <select id="getUser" parameterClass="java.lang.String" resultMap="get_user_result">  
  19.         <![CDATA[ 
  20.             select * from user where id = #id#  
  21.         ]]>  
  22.     </select>  
  23.       
  24.     <!-- 查询子表 -->  
  25.     <select id="getBookByUserId" parameterClass="int" resultClass="book">  
  26.         <![CDATA[ 
  27.         select * 
  28.         from book  
  29.         where uid = #uid#  
  30.         ]]>  
  31.     </select>  
  32.       
  33. </sqlMap>  

4、SqlMapConfig.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMapConfig  
  3. PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"  
  4. "http://www.ibatis.com/dtd/sql-map-config-2.dtd">  
  5. <sqlMapConfig>  
  6.     <settings   
  7.         cacheModelsEnabled="true"   
  8.         enhancementEnabled="true"  
  9.         lazyLoadingEnabled="true"  
  10.         errorTracingEnabled="true"  
  11.         maxRequests="32"  
  12.         maxSessions="10"  
  13.         maxTransactions="5"  
  14.         useStatementNamespaces="true" />  
  15.     <transactionManager type="JDBC">  
  16.         <dataSource type="SIMPLE">  
  17.             <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />  
  18.             <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis" />  
  19.             <property name="JDBC.Username" value="root" />  
  20.             <property name="JDBC.Password" value="root" />  
  21.             <property name="Pool.MaximumActiveConnections" value="10" />  
  22.             <property name="Pool.MaximumIdleConnections" value="5" />  
  23.             <property name="Pool.MaximumCheckoutTime" value="120000" />  
  24.             <property name="Pool.TimeToWait" value="500" />  
  25.             <property name="Pool.PingQuery" value="select 1 from ACCOUNT" />  
  26.             <property name="Pool.PingEnabled" value="false" />  
  27.             <property name="Pool.PingConnectionsOlderThan" value="1" />  
  28.             <property name="Pool.PingConnectionsNotUsedFor" value="1" />  
  29.         </dataSource>  
  30.     </transactionManager>  
  31.     <sqlMap resource="com/itmyhome/User.xml" />  
  32. </sqlMapConfig>  
以上可能需要修改ConnectionURL,Username,Password

5、MyAppSqlConfig.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.io.Reader;  
  2. import com.ibatis.common.resources.Resources;  
  3. import com.ibatis.sqlmap.client.SqlMapClient;  
  4. import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
  5.   
  6. public class MyAppSqlConfig {  
  7.     private static final SqlMapClient sqlMap;  
  8.     static {  
  9.         try {  
  10.             String resource = "SqlMapConfig.xml";  
  11.             Reader reader = Resources.getResourceAsReader(resource); //读取配置文件   
  12.             sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.             throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);  
  16.         }  
  17.     }  
  18.     public static SqlMapClient getSqlMapInstance() {  
  19.         return sqlMap;  
  20.     }  
  21. }  

6、测试类

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class UserTest {  
  2.     public static void main(String[] args) {  
  3.         SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();  
  4.         try {  
  5.             /** 
  6.              * 查询ID为5的用户,以下查询假设有数据存在 
  7.              */  
  8.             List list = sqlMap.queryForList("User.getUser","5");  
  9.             for(int i=0;i<list.size();i++){  
  10.                 User user = (User)list.get(i);  
  11.                 /** 
  12.                  * 得到User所拥有的Book 
  13.                  */  
  14.                 Set<Book> books = (Set<Book>)user.getBooks();  
  15.                 Iterator ite = books.iterator();  
  16.                 while(ite.hasNext()){  
  17.                     Book book = (Book)ite.next();  
  18.                     System.out.println("用户:"+user.getName()+",书籍: "+book.getName());  
  19.                 }  
  20.             }  
  21.         } catch (SQLException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.     }  
  25. }  

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


项目结构图:


0 0
原创粉丝点击