ibatis一对多示例

时间:2021-06-08 11:55:50
1、在实际开发中,iBATIS框架已经很普遍的使用,然而我们常常遇到关联数据的情况,如User 对象拥有若干Address 对象,每个Address 对象描述了对应User 的一个联系地址,这种情况下,我们应该如何处理?通过单独的Statement操作固然可以实现(通过Statement 用于读取用户数据,再手工调用另外一个Statement 根据用户ID 返回对应的Address信息)。

2、构建数据库表,user表和address表,建表语句如下:(使用mysql数据库)
Java代码  ibatis一对多示例
  1. create table user(  
  2.    id int(10) not null auto_increment,  
  3.    userName varchar(20) ,  
  4.    passWord varchar(20),  
  5.    primary key(id)   
  6. );  
  7.   
  8. insert into user(userName,passWord) values('admin1','admin1');  
  9. insert into user(userName,passWord) values('admin2','admin2');  
  10. insert into user(userName,passWord) values('admin3','admin3');  
  11. insert into user(userName,passWord) values('admin4','admin4');  
  12.   
  13. create table address(  
  14.    user_id int(10) not null ,  
  15.    addressName varchar(20) ,  
  16.    addressCode varchar(20)  
  17. );  
  18.   
  19. insert into address(user_id,addressName,addressCode) values(1,'addressName1','addressCode1');  
  20. insert into address(user_id,addressName,addressCode) values(1,'addressName2','addressCode2');  
  21. insert into address(user_id,addressName,addressCode) values(2,'addressName3','addressCode3');  
  22. insert into address(user_id,addressName,addressCode) values(3,'addressName4','addressCode4');  


3、生成相应的JavaBean
User.java
Java代码  ibatis一对多示例
  1. package com.tonyj.pojo;  
  2.   
  3. import java.sql.Date;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. public class User {  
  8.     private int id;  
  9.     private String userName;  
  10.     private Date expireDate=null;  
  11.     private String passWord;  
  12.     private List<Address> address=new ArrayList<Address>();  
  13.     //相应的getter和setter方法,构造方法  
  14. }  


Address.java
Java代码  ibatis一对多示例
  1. package com.tonyj.pojo;  
  2.   
  3. public class Address {  
  4.     private String addressName;  
  5.     private String addressCode;  
  6.     private String user_id;  
  7.     //相应的getter和setter方法,构造方法  
  8. }  


4、ibatis配置文件的配置
SqlMapConfig.xml
Java代码  ibatis一对多示例
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE sqlMapConfig  
  3. PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"  
  4. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  5. <sqlMapConfig>  
  6.     <properties resource="jdbc.properties"/>  
  7.     <settings   
  8.         cacheModelsEnabled="true"  
  9.         enhancementEnabled="true"  
  10.         lazyLoadingEnabled="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="${jdbc.driverClassName}"/>  
  18.              <property name="JDBC.ConnectionURL" value="${jdbc.url}"/>  
  19.              <property name="JDBC.Username" value="${jdbc.userName}"/>  
  20.              <property name="JDBC.Password" value="${jdbc.password}"/>  
  21.         </dataSource>  
  22.     </transactionManager>  
  23.     <sqlMap resource="one2many.xml"/>  
  24. </sqlMapConfig>  


配置连接数据库的资源文件:
jdbc.properties
Java代码  ibatis一对多示例
  1. jdbc.driverClassName=com.mysql.jdbc.Driver  
  2. jdbc.url=jdbc:mysql://localhost:3306/vin  
  3. jdbc.userName=root  
  4. jdbc.password=sa  


一对多映射文件one2many.xml的配置:
Java代码  ibatis一对多示例
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE sqlMap  
  3. PUBLIC "-//ibatis.apache.org//DTD SQL MAP 2.0//EN"  
  4. "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  5. <sqlMap>  
  6.     <typeAlias alias="User"    type="com.tonyj.pojo.User"/>  
  7.     <typeAlias alias="Address" type="com.tonyj.pojo.Address"/>  
  8.     <resultMap class="User" id="get-user-result">  
  9.         <result property="id" column="id"/>  
  10.         <result property="userName" column="userName"/>  
  11.         <result property="passWord" column="passWord"/>  
  12.         <result property="expireDate" column="expiredate" />  
  13.         <result property="address" column="id" select="getAddressByUserId"/>  
  14.     </resultMap>  
  15.     <select id="getUser" parameterClass="int" resultMap="get-user-result">  
  16.         <![CDATA[  
  17.             select id,userName,passWord,expiredate  
  18.             from user  
  19.             where id=#id#  
  20.         ]]>  
  21.     </select>  
  22.     <select id="getAddressByUserId" parameterClass="int" resultClass="Address">  
  23.         select user_id,addressName,addressCode  
  24.         from address  
  25.         where user_id=#user_id#  
  26.     </select>  
  27. </sqlMap>  


5、测试类的编写
IbatisOne2Many.java
Java代码  ibatis一对多示例
  1. package com.tonyj.test;  
  2.   
  3. import java.io.Reader;  
  4. import java.util.List;  
  5.   
  6. import com.ibatis.common.resources.Resources;  
  7. import com.ibatis.sqlmap.client.SqlMapClient;  
  8. import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
  9. import com.tonyj.pojo.Address;  
  10. import com.tonyj.pojo.User;  
  11.   
  12. public class IbatisOne2Many {  
  13.     public static void main(String[] args) throws Exception {  
  14.         Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");  
  15.         SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  
  16.         // sqlMap系统初始化完毕  
  17.         User user=(User) sqlMap.queryForObject("getUser"new Integer(1));  
  18.         System.out.println("user_id:"+user.getId()+",userName:"  
  19.                             +user.getUserName());  
  20.         List<Address> addresss=user.getAddress();  
  21.         for(int i=0;i<addresss.size();i++){  
  22.             System.out.println(addresss.get(i).getUser_id()+"-->"  
  23.                             +addresss.get(i).getAddressName());  
  24.         }  
  25.     }  
  26. }  


6、执行结果如下:
Java代码  ibatis一对多示例
  1. log4j:WARN No appenders could be found for logger (com.ibatis.common.jdbc.SimpleDataSource).  
  2. log4j:WARN Please initialize the log4j system properly.  
  3. user_id:1,userName:admin1  
  4. 1-->addressName1  
  5. 1-->addressName2