MyBatis之多對多關聯查詢
阿新 • • 發佈:2018-12-31
多對多關聯
myBatis的多對多關聯,是通過兩個一對多間接實現的
實體類:Card1-- 使用者表 CREATE TABLE `user2`( `id` INT PRIMARY KEY AUTO_INCREMENT, `user_name` VARCHAR(20),-- 使用者姓名 `address` VARCHAR(60)-- 聯絡地址 ) ENGINE INNODB CHARSET utf8; INSERT INTO `user2` VALUES(1,'陳大','深圳市南山區'); INSERT INTO `user2` VALUES(2,'王二','深圳市福田區'); INSERT INTO `user2` VALUES(3,'張三','深圳市龍華新區'); INSERT INTO `user2` VALUES(4,'李四','深圳市龍崗區'); -- 卡表 CREATE TABLE `card2`( `id` INT PRIMARY KEY AUTO_INCREMENT, `card_no` VARCHAR(18), `remark` VARCHAR(100) ) ENGINE=INNODB CHARSET=utf8; INSERT INTO `card2` VALUES(1,'420001','會員卡'); INSERT INTO `card2` VALUES(2,'420002','會員卡'); INSERT INTO `card2` VALUES(3,'420003','會員卡'); INSERT INTO `card2` VALUES(4,'420004','會員卡'); -- 使用者、卡的中間表 CREATE TABLE `card2_user2`( `id` INT PRIMARY KEY AUTO_INCREMENT, `user_id` INT, `card_id` INT, `remark` VARCHAR(100) ); INSERT INTO `card2_user2` VALUES(1,1,1,''); INSERT INTO `card2_user2` VALUES(2,1,2,''); INSERT INTO `card2_user2` VALUES(3,2,1,''); INSERT INTO `card2_user2` VALUES(4,2,2,''); INSERT INTO `card2_user2` VALUES(5,3,1,''); INSERT INTO `card2_user2` VALUES(6,4,2,''); -- SELECT * FROM `user2`; -- SELECT * FROM `card2`; -- SELECT * FROM `card2_user2`; SELECT t1.`id`, t2.`id` `user_id`,t2.`user_name`,t2.`address`, t3.`id` `card_id`,t3.`card_no`,t3.`remark` `card_info`, t1.`remark` FROM `card2_user2` t1,`user2` t2,`card2` t3 WHERE t1.`user_id`=t2.`id` AND t1.`card_id`=t3.`id`;
實體類:User1package com.chensan.m2m.entity; import java.util.List; public class Card1 { private int id; private String cardNo; private String remark; private List<User1> users; public String toString(){ return "[ id = " + id + ", cardNo = " + cardNo + ", remark = " + remark + "]"; } //...省略setter、getter方法 }
實體類Card1對映檔案package com.chensan.m2m.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方法 }
<?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.m2m.entity.Card1Mapper">
<resultMap id="card1Map" type="com.chensan.m2m.entity.Card1">
<id property="id" column="card_id"/>
<result property="cardNo" column="card_no"/>
<result property="remark" column="card_info"/>
</resultMap>
<resultMap id="cardUserMap" type="com.chensan.m2m.entity.Card1" extends="card1Map">
<collection property="users" ofType="com.chensan.m2m.entity.User1">
<id property="id" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="address" column="address"/>
</collection>
</resultMap>
<select id="query" parameterType="int" resultMap="cardUserMap">
SELECT t1.`id`,
t2.`id` `card_id`,t2.`card_no`,t2.`remark` `card_info`,
t3.`id` `user_id`,t3.`user_name`,t3.`address`,
t1.`remark`
FROM `card2_user2` t1,`card2` t2,`user2` t3
WHERE t1.`user_id`=t2.`id` AND t1.`card_id`=t3.`id`
AND t2.`id`=#{id}
</select>
</mapper>
實體類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.m2m.entity.User1Mapper">
<resultMap id="user1Map" type="com.chensan.m2m.entity.User1">
<id property="id" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="address" column="address"/>
</resultMap>
<resultMap id="userCardMap" type="com.chensan.m2m.entity.User1" extends="user1Map">
<collection property="cards" ofType="com.chensan.m2m.entity.Card1">
<id property="id" column="card_id"/>
<result property="cardNo" column="card_no"/>
<result property="remark" column="card_info"/>
</collection>
</resultMap>
<select id="query" parameterType="int" resultMap="userCardMap">
SELECT t1.`id`,
t2.`id` `user_id`,t2.`user_name`,t2.`address`,
t3.`id` `card_id`,t3.`card_no`,t3.`remark` `card_info`,
t1.`remark`
FROM `card2_user2` t1,`user2` t2,`card2` t3
WHERE t1.`user_id`=t2.`id` AND t1.`card_id`=t3.`id`
AND t2.`id`=#{id}
</select>
</mapper>
使用extends實體類的方法是為了保留和擴充套件實體的操作;
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/m2m/mapper/User1Mapper.xml"/>
<mapper resource="com/chensan/m2m/mapper/Card1Mapper.xml"/>
</mappers>
</configuration>
測試類
package com.chensan.m2m.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.m2m.entity.Card1;
import com.chensan.m2m.entity.User1;
public class TestM2M {
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.m2m.entity.User1Mapper.query", 1);
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 void getCardUser(){
SqlSession sqlSession = sqlSessionFactory.openSession();
Card1 card = sqlSession.selectOne("com.chensan.m2m.entity.Card1Mapper.query", 1);
System.out.println(card);
for(User1 user : card.getUsers()){
System.out.println(
"[ " +
"cardId = " + card.getId() + ", " +
"cardNo = " + card.getCardNo() + ", " +
"remark = " + card.getRemark() + ", " +
"userId = " + user.getId() + ", " +
"userName = " + user.getUserName() + ", " +
"address = " + user.getAddress() +
" ]"
);
}
sqlSession.close();
}
public static void main(String[] args) {
TestM2M testMyBatisManyToMany = new TestM2M();
testMyBatisManyToMany.getUserCard();
testMyBatisManyToMany.getCardUser();
}
}
結果如下:
[ id = 1, userName = 陳大, address = 深圳市南山區]
[ userId = 1, userName = 陳大, address = 深圳市南山區, cardId = 1, cardNo = 420001, remark = 會員卡 ]
[ userId = 1, userName = 陳大, address = 深圳市南山區, cardId = 2, cardNo = 420002, remark = 會員卡 ]
[ id = 1, cardNo = 420001, remark = 會員卡]
[ cardId = 1, cardNo = 420001, remark = 會員卡, userId = 1, userName = 陳大, address = 深圳市南山區 ]
[ cardId = 1, cardNo = 420001, remark = 會員卡, userId = 2, userName = 王二, address = 深圳市福田區 ]
請給同名列取別名