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类
- 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>
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,我们实现了关联数据的读取。
项目结构图:
0 0
- ibatis实战之一对多关联
- ibatis实战之一对多关联
- ibatis实战之一对多关联
- Hibernate之一对多关联
- Hibernate关联关系之一对多关联
- Ibatis的多对多关联
- Hibernate关联关系之一对多
- 05-MyBatis_关联映射之一对多
- Hibernate之一对多关联映射
- hibernate之一对多单向关联
- hibernate之一对多双向关联
- Hibernate学习之一对多关联
- Hibernate之一对多关联映射
- Hibernate学习之一对多关联
- Hibernate关联关系之一对多
- MyBatis之一对多关联查询
- (5)MyBatis之一对多关联
- MyBatis 关联映射之一对多
- source insight的查找功能
- 数据结构--串--定长顺序存储表示
- orcl导入导出 exp imp 方式
- 委托与事件小结——转载
- JAVA程序获取Tomcat的运行状态
- ibatis实战之一对多关联
- 如何配置IIS服务器
- Reverse Integer
- HDU 1257 最少拦截系统
- nutch-1.7-学习笔记(1)-org.apache.nutch.crawl.Injector.java-Configuration
- Linux系统编程(7)—— 进程之进程概述
- HDU 1671 Phone List 字典树
- Uva 10719 - Quotient Polynomial (多项式求解)
- 一个c回调函数的例子