ibatis實戰之一對多關聯

來源:互聯網
上載者:User

在實際開發中,我們常常遇到關聯資料的情況,如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 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


歡迎加入JAVA技術交流群:74955800

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.