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

public class Card1 {  
    private int id;  
    private String cardNo;  
    private String remark;  

    //...省略setter、getter方法  
}  

實體類:User1

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>  

測試類

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 = 工資卡 ]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章