1. 程式人生 > >MyBatis之一對多關聯查詢

MyBatis之一對多關聯查詢

一對多關聯

一對多關聯和多對一關聯的區別:是從一的一端取多的一端,還是從多的一端取一的一端。

表結構(一對多、多對一、一對一的表結構相同):

-- 使用者表
CREATE TABLE `user1`(
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `user_name` VARCHAR(20),-- 使用者姓名
    `address` VARCHAR(60)-- 聯絡地址
) ENGINE INNODB CHARSET utf8;
INSERT INTO `user1` VALUES(1,'陳大','深圳市南山區');
INSERT INTO `user1` VALUES(2,'王二','深圳市福田區');
INSERT INTO `user1` VALUES(3,'張三','深圳市龍華新區');
INSERT INTO `user1` VALUES(4,'李四','深圳市龍崗區');


-- 卡表
CREATE TABLE `card1`(
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `card_no` VARCHAR(18),
    `remark` VARCHAR(100),
    `user_id` INT-- 用於關聯user1的主鍵id(不設定外來鍵,避免級聯問題)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO `card1` VALUES(1,'420001','工資卡',1);
INSERT INTO `card1` VALUES(2,'420002','工資卡',2);
INSERT INTO `card1` VALUES(3,'420003','工資卡',3);
INSERT INTO `card1` VALUES(4,'420004','工資卡',3);


-- SELECT * FROM `user1`;
-- SELECT * FROM `card1`;

實體類:Card1

package com.chensan.o2m.entity;

public class Card1 {
	private int id;
	private String cardNo;
	private String remark;
	
	//...省略setter、getter方法
}
實體類:User1
package com.chensan.o2m.entity;

import java.util.List;

public class User1 {
	private int id;
	private String userName;
	private String address;
	private List<Card1> cards;
	
	public String toString(){
		return "[ id = " + id  + ", userName = " 
			+ userName + ", address = " + address + "]";
	}
	//...省略setter、getter方法
}

實體類User1對映檔案

<?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.chensan.o2m.entity.User1Mapper">
  <resultMap id="user1" type="com.chensan.o2m.entity.User1">
  	<id property="id" column="user_id"/>
  	<result property="userName" column="user_name"/>
  	<result property="address" column="address"/>
  	
  	<collection property="cards" column="user_id" ofType="com.chensan.o2m.entity.Card1">
  		<id property="id" column="id"/>
  		<result property="cardNo" column="card_no"/>
  		<result property="remark" column="remark"/>
  	</collection>
  </resultMap>
  
  <select id="query" parameterType="int" resultMap="user1">
  	SELECT t1.`id` `user_id`,t1.`user_name`,t1.`address`,t2.`id`,t2.`card_no`,t2.`remark` 
	FROM `user1` t1,`card1` t2 
	WHERE t1.`id`=t2.`user_id` AND t1.`id`=#{id}
  </select>
</mapper>
myBatis配置檔案
<?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">

<configuration>
  <!-- 和spring整合後 environments配置將廢除-->
  <environments default="development">
	<environment id="development">
	  <!-- 使用jdbc事務管理  或者JTA事務管理-->
	  <transactionManager type="JDBC" />
	  <!-- 資料庫連線池  第三方元件:c3p0-->
	  <dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis01"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
	  </dataSource>
	</environment>
  </environments>

  <!-- 載入實體類的對映檔案 -->
  <mappers>
    <mapper resource="com/chensan/o2m/mapper/User1Mapper.xml"/>
  </mappers>
</configuration>
測試類
package com.chensan.o2m.test;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.chensan.o2m.entity.Card1;
import com.chensan.o2m.entity.User1;

public class TestO2M {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader resource;
    
    //建立會話工廠
    static{
        try{
        	resource = Resources.getResourceAsReader("myBatisConfig.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }
    
    //一對多:查詢使用者對應卡(銀行卡)
    public void getUserCard(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	User1 user = sqlSession.selectOne("com.chensan.o2m.entity.User1Mapper.query", 3);
    	System.out.println(user);
    	for(Card1 card : user.getCards()){
    		System.out.println(
				"[ " + 
				"userId = " + user.getId() + ", " + 
				"userName = " + user.getUserName() + ", " + 
				"address = " + user.getAddress() + ", " + 
				"cardId = " + card.getId() + ", " + 
				"cardNo = " + card.getCardNo() + ", " + 
				"remark = " + card.getRemark() + 
				" ]"
			);
    	}
    	
    	sqlSession.close();
    }

    public static void main(String[] args) {
    	TestO2M testMyBatisOneToMany = new TestO2M();
    	testMyBatisOneToMany.getUserCard();
    }
}
結果:

[ id = 3, userName = 張三, address = 深圳市龍華新區]
[ userId = 3, userName = 張三, address = 深圳市龍華新區, cardId = 3, cardNo = 420003, remark = 工資卡 ]
[ userId = 3, userName = 張三, address = 深圳市龍華新區, cardId = 4, cardNo = 420004, remark = 工資卡 ]

user1和card1的id列同名,如果不對其中一列取別名,則user只關聯一個card物件,只有一條記錄:

[ id = 3, userName = 張三, address = 深圳市龍華新區]
[ userId = 3, userName = 張三, address = 深圳市龍華新區, cardId = 3, cardNo = 420003, remark = 工資卡 ]
之前很奇怪只有一條記錄,參考:http://blog.csdn.net/rain097790/article/details/13615291後才知道是列同名問題。

相關推薦

MyBatis之一關聯查詢

一對多關聯 一對多關聯和多對一關聯的區別:是從一的一端取多的一端,還是從多的一端取一的一端。 表結構(一對多、多對一、一對一的表結構相同): -- 使用者表 CREATE TABLE `user1`( `id` INT PRIMARY KEY AUTO_INCREM

MyBatis入門實驗(7)之一關聯查詢

實驗內容 執行一對多關聯查詢 操作步驟 一、安裝 新增Maven依賴(本文使用版本為3.4.6) <dependency> <groupId>org.mybatis</groupId> &

mybatis實現表一對一,一對關聯查詢

轉自:https://blog.csdn.net/m0_37787069/article/details/79247321 1、一對一 關鍵字:association 作用:針對pojo物件屬性的對映       property:pojo的屬性名   &

MyBatis的學習(七)——關聯對映之一關聯

本次部落格其它相關可以檢視之前的部落格的內容。 一對多使用到的主要是:collection 根據classes的id查詢對應的班級資訊,包括學生,老師 上一篇部落格已經建立classes和teacher表,這裡不再多說,本次建立student表即可: 定義student實

mybatis 之三:關聯查詢

MyBatis 本是apache的一個開源專案iBatis,它 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資

Mybatis關聯查詢

mybatis3.0添加了association和collection標籤專門用於對多個相關實體類資料進行級聯查詢,但仍不支援多個相關實體類資料的級聯儲存和級聯刪除操作。因此在進行實體類多對多對映表設計時,需要專門建立一個關聯物件類對相關實體類的關聯關係進行描述

MyBatis關聯查詢

多對多關聯 myBatis的多對多關聯,是通過兩個一對多間接實現的 -- 使用者表 CREATE TABLE `user2`( `id` INT PRIMARY KEY AUTO_INCREMENT, `user_name` VARCHAR(20),-- 使

mybatis學習筆記(十一)關聯查詢/級聯操作

package com.mybatis.test; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessi

MyBatis入門實驗(9)之關聯查詢

實驗內容 執行多對多關聯查詢 前兩章分別實現了一對多查詢以及多對一查詢。其中多對一查詢,對於整體而言是多對一,但我們操作的是一個實體,所以對於多方的個體而言可以看成是一對一。同理,多對多查詢針對個體而言就可以看成是一對多,所以多對多查詢的處理跟一對多查詢的處

mybatis11--關聯查詢

div 3.0 ctype his prop 1.0 加載 hash oct 多對多關聯! 其實就是兩個一對多的關聯! 比如說 一個學生可以有多個老師!一個老師可以有多個學生! 那麽 學生和老師之間的關系 可以理解為 多對多的關聯關系! 關鍵是怎麽建立數據庫中兩個表之

NHibernate教程(11)--關聯查詢

true 這一 -m hive 原生 .html etime virtual 及其 本節內容 多對多關系引入 多對多映射關系 多對多關聯查詢 1.原生SQL關聯查詢 2.HQL關聯查詢 3.Criteria API關聯查詢 結語 多對多關系引入 讓我們再次回顧在第

springmvc-mybatis之一對映

1.首先來個需求 1.一個訂單表和一個訂單詳情表,一個訂單可以有多個訂單詳情,訂單詳情裡面主要記錄了購買商品的名稱以及數量。那麼,現在要查詢一個訂單的詳細情況。也就是說這是一對多查詢,從訂單表裡用其id查詢訂單詳情表的所有記錄。 2. 實現 2.1首先實現

15、Mybatis之一多級聯查詢

<1>通過一個表的一個欄位去查詢另一個表的多條記錄 一對多的級聯查詢表示一個表中一條記錄對應另一個表中多條記錄,例如一種型號的手機有多個人使用。 手機對應的表為PHONE: 人對應的表PERSON: 建立PHONE表對應的實體類,一個

Mybatis關聯查詢之一一XML配置詳解

平時在開發過程中dao、bean和XML檔案都是自動生成的,很少寫XML的配置關係,今天記錄一下mybatis的關聯查詢中的多對一和一對多的情況。 首先是有兩張表(學生表Student和老師Teacher表),為了更易懂,這裡只設置了最簡單的幾個必要欄位。表結構如下圖

(十六)mybatis關聯查詢

注:程式碼已託管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,專案是mybatis-12-many2one,需要自取,需要配置maven環境以及mysql環境(sql語句在resource下的test.sql中),覺得有

JavaEE MyBatis關聯對映之一(教材學習筆記)

在實際應用中,應用更多的是一對多,例如每一個使用者可以有多個訂單,在使用MyBatis中是怎樣處理一對多的關係呢,在MyBatis對映檔案中有一個resultMap元素,此元素包含一個<collection>子元素,MyBatis就是通過他來處理一對多關係的, 下面通過一個案例瞭

Mybatis表聯合查詢關聯查詢

有兩張表,一張表為業務賬戶表,一張為資費表,業務賬戶表其中有一個外來鍵為資費型別id,引用了資費表的主鍵id。建表語句:/*資費表*/ create table sys_charge( id int(11) auto_increment, name varchar

MyBatis入門實驗(8)之關聯查詢

實驗內容 執行多對一關聯查詢 上一章實現了一對多查詢,以一為發起點,是一對多,以多為起點,則為多對一。 操作步驟 一、安裝 新增Maven依賴(本文使用版本為3.4.6) <dependency> <groupI

Mybatis_關聯查詢

llb system add mod ext public java asstream 圖片 訂單表對人員表就是多對一。 在Orders.java類中加一行private Person person; 並生成setter getter。 在OrdersMapper.x

mybatis-高階結果對映之一(你知道一對的結果是如何合併的嗎)

在一對多的關係中, 主表的資料回對應關聯表中的多條資料。 因此, 查詢時就會查詢出多條結果, 所以, 向類似的情況我們會使用 List 來進行儲存關聯表中獲取到的資訊。 1 資料準備 建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。 在此就不貼出來建表的 SQL 語句了 , 感興趣的