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 = 工資卡 ]