zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛
    VC++中的头文件包含问题
    php调用com组件配置 以openoffice为例
    Android 进程和线程
    文件队列 QueueFile
    Android zip文件压缩解压缩
    Internet Explorer 11(IE11)无法切换第三方输入法
    非递归实现快速排序
    class_create()
    字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/3808207.html
Copyright © 2011-2022 走看看