MyBatis關聯 查詢之多對多查詢
一對一查詢、 一對多查詢兩篇文章分別講了關聯查詢中的一對一查詢和一對多查詢,假設有兩個表A和B,那麼一對一就是A表中的每行記錄僅對應B表的一條記錄,同理B表的一條記錄只對應A表的一條記錄;一對多則是A表中的單行可以與B表中的一個或多個行相關,但B表中的一個行只可以與A表中的一個行相關;那麼多對多則是A表中的單行可以與B表中的一個或多個行相關,B表中的單行可以與A表中的一個或多個行相關。本文通過舉例子的方式進行介紹多對多的情況。
1.案例準備
本文的例子採用人借書(一對多),書分種類(多對多),種類對應種類名字(一對一)的複雜關係來講解多對多的關係。涉及的表分別命名為user、book、booktype、type。首先在MySQL上進行建表。
1.建立第一個表示借書者的表,即user,代碼即數據如下圖所示:
2.建立book表:
3.建立booktype表:
4.建立type表:
5.根據需要實現的要求,進行sql查詢,代碼如下:
- select user.id user_id,user.name user_name,book.id book_id,book.name book_name,booktype.type typeid,type.name type_name
- from book,booktype,user,type
- where user.id=book.user_id
- and book.id=booktype.book_id
- and booktype.type=type.id;
查詢結果如下圖所示:
2.使用MyBatis框架關聯查詢
1.根據數據表以及表之間的關聯建立相應的實體類
1.User1類,每一個user可以借多本書,因此在User1類中添加集合屬性List<Book1> book,其餘屬性與數據表對應即可。
- package com.mybatis.model.impl;
- import java.util.*;
- import java.io.Serializable;
- public class User1 {
- public Integer id;
- public String name;
- public List<Book1> book;//借的書本
- public Integer getId()
- {
- return this.id;
- }
- public void setId(Integer id)
- {
- this.id=id;
- }
- public String getName()
- {
- return this.name;
- }
- public void setName(String name)
- {
- this.name=name;
- }
- public List<Book1> getBook()
- {
- return this.book;
- }
- public void setBook(List<Book1> book)
- {
- this.book=book;
- }
- public String toString()
- {
- return "User [user_id="+id+",name="+name+",book="+book+"]";
- }
- }
2.建立一個Book1類,這裡每一本書可以有多個種類,添加集合屬性List<BookType>bookType來表示兩者的關聯。
- package com.mybatis.model.impl;
- import java.util.*;
- public class Book1 {
- public Integer id;
- public String user_id;
- public String name;
- public List<BookType> bookType;//書劃分種類的集合,一本書可以被劃分為好幾種類,
- public Integer getBook_id()
- {
- return this.id;
- }
- public void setBook_id(Integer id)
- {
- this.id=id;
- }
- public String getUser_id()
- {
- return this.user_id;
- }
- public void setUser_id(String user_id)
- {
- this.user_id=user_id;
- }
- public String getBook_name()
- {
- return this.name;
- }
- public void setBook_name(String name)
- {
- this.name=name;
- }
- public List<BookType> getBookType()
- {
- return this.bookType;
- }
- public void setUser(List<BookType> bookType)
- {
- this.bookType=bookType;
- }
- public String toString()
- {
- return "Book [book_id="+id+",user_id="+user_id+",book_name="+name+",bookType="+bookType+"]";
- }
- }
3.建立BookType類,這裡需要添加一個關聯對象屬性types,即typeid屬性與type對象對應
- package com.mybatis.model.impl;
- public class BookType {
- public Integer id;
- public String book_id;
- public Integer type;
- public Type types;
- public Integer getId()
- {
- return this.id;
- }
- public void setId(Integer id)
- {
- this.id=id;
- }
- public String getBook_id()
- {
- return this.book_id;
- }
- public void setBook_id(String book_id)
- {
- this.book_id=book_id;
- }
- public Integer getType()
- {
- return this.type;
- }
- public void setTypeid(Integer type)
- {
- this.type=type;
- }
- public Type getTypes()
- {
- return this.types;
- }
- public void setTypes(Type types)
- {
- this.types=types;
- }
- public String toString()
- {
- return "BookType [book_id="+book_id+",type_id="+type+",typename="+types.getName()+"]";
- }
- }
4.建立Type類
- package com.mybatis.model.impl;
- public class Type {
- public Integer id;
- public String name;
- public Integer getId()
- {
- return this.id;
- }
- public void setId(Integer id)
- {
- this.id=id;
- }
- public String getName()
- {
- return this.name;
- }
- public void setName(String name)
- {
- this.name=name;
- }
- }
2.建立mapper介面
這裡暫時只需要查詢每個人對應的書及其種類的關係,因此一個方法即可搞定。介面定義如下:
- package com.mybatis.mapper;
- import java.util.*;
- import com.mybatis.model.impl.*;
- public interface BookOfUserMapper {
- public List<User1> getInfo();
- }
3.mapper文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.mybatis.mapper.BookOfUserMapper">
- <select id="getInfo" resultMap="user1">
- select user.id user_id,user.name,book.id book_id,book.name book_name,booktype.type typeid,type.name type_name
- from book,booktype,user,type
- where user.id=book.user_id
- and book.id=booktype.book_id
- and booktype.type=type.id;
- </select>
- <resultMap type="com.mybatis.model.impl.User1" id="user1">
- <id property="id" column="user_id"/>
- <result property="name" column="user_name"/>
- <collection property="book" ofType="com.mybatis.model.impl.Book1">
- <id property="id" column="book_id"/>
- <result property="name" column="book_name"/>
- <collection property="bookType" ofType="com.mybatis.model.impl.BookType">
- <id property="book_id" column="book_id"/>
- <result property="type" column="typeid"/>
- <association property="types" javaType="com.mybatis.model.impl.Type">
- <id property="id" column="typeid"/>
- <result property="name" column="type_name"/>
- </association>
- </collection>
- </collection>
- </resultMap>
- </mapper>
上述mapper文件需要注意的是collection的填寫,需要看其屬性的層次,比如book是user的集合屬性,是最外層的,而book中有個booktype集合屬性,那麼需要在外圍的<collection...>元素中嵌套一個<collection元素>,又因為在內層collection中有一個關聯對象type,則需要在內層<collection>元素中嵌套一個<association...>元素。注意嵌套與屬性映射的關係。另外每個屬性對應的column值則需要與sql查詢語句中查詢結果對應的列名相等。通過這個mapper文件,就相當於將整個複雜的表之間的關係全部映射到了User1對象中。
4.mybatis配置文件
將相應的mapper文件載入進去即可:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <!-- XML配置文件包含對MyBatis系統的核心設置 -->
- <configuration>
- <!-- 指定MyBatis所用日誌的具體實現 -->
- <settings>
- <setting name="logImpl" value="LOG4J"/>
- <setting name="cacheEnabled" value="false"/>
- </settings>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC">
- </transactionManager>
- <dataSource type="POOLED">
- <property name="driver" value="org.gjt.mm.mysql.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/mybatisquery?characterEncoding=UTF-8"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="mapper/BookOfUserMapper.xml"/>
- </mappers>
- </configuration>
5.測試
測試程序如下:
- package com.mybatis.test;
- import java.util.*;
- import java.io.InputStream;
- import org.apache.ibatis.io.*;
- import org.apache.ibatis.session.*;
- import com.mybatis.mapper.*;
- import com.mybatis.model.impl.*;;
- public class QueryTest {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- // TODO Auto-generated method stub
- //讀取MyBatis配置文件
- InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
- //初始化mybatis,創建SqlSessionFactory類的實例。
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
- //創建Session實例
- SqlSession session=sqlSessionFactory.openSession();
- BookOfUserMapper bookOfUserMapper=session.getMapper(BookOfUserMapper.class);
- List<User1> list3=bookOfUserMapper.getInfo();
- System.out.println(list3);
- }
- }
運行程序,結果如下:
- DEBUG [main] - <== Total: 10
- [User [user_id=1001,name=null,book=[Book [book_id=2001,user_id=null,book_name=演算法導論,bookType=[BookType [book_id=2001,type_id=2,typename=演算法]]], Book [book_id=2002,user_id=null,book_name=西遊記,bookType=[BookType [book_id=2002,type_id=1,typename=名著]]]]], User [user_id=1002,name=null,book=[Book [book_id=2003,user_id=null,book_name=設計模式,bookType=[BookType [book_id=2003,type_id=2,typename=演算法]]], Book [book_id=2004,user_id=null,book_name=編程思想,bookType=[BookType [book_id=2004,type_id=2,typename=演算法]]]]], User [user_id=1003,name=null,book=[Book [book_id=2005,user_id=null,book_name=MySQL,bookType=[BookType [book_id=2005,type_id=2,typename=演算法]]]]]]
該運行結果以集合的形式保存的,仔細查看會發現該結果與之前在sql中查詢的結果一致。
6.實例文件結構
※jQuery中的層級選擇器:後代元素、子元素、相鄰元素、兄弟元素
※Http客戶端工具類
TAG:程序員小新人學習 |