JavaEE MyBatis關聯對映之一對多(教材學習筆記)
阿新 • • 發佈:2018-12-03
在實際應用中,應用更多的是一對多,例如每一個使用者可以有多個訂單,在使用MyBatis中是怎樣處理一對多的關係呢,在MyBatis對映檔案中有一個resultMap元素,此元素包含一個<collection>子元素,MyBatis就是通過他來處理一對多關係的,
下面通過一個案例瞭解一下如何處理
1.在mybatis資料庫中建立兩個資料表,分別為tb_user tb_orders,同時在表中預先插入幾條資料,執行的SQL語句如下所示:
create table tb_user( id int(32) primary key auto_increment, username varchar(32), address varchar(256) ); insert into tb_user values('1','詹姆斯','克利夫蘭'); insert into tb_user values('2','科比','洛杉磯'); insert into tb_user values('3','保羅','洛杉磯'); create table tb_orders( id int(32) primary key auto_increment, number varchar(32) not null, user_id int(32) not null, foreign key(user_id) references tb_user(id) ); insert into tb_orders values('1','1000011','1'); insert into tb_orders values('2','1000012','2'); insert into tb_orders values('3','1000013','3'); insert into tb_orders values('4','1000014','1');
2.在com.itheima.po包中,建立持久化類Orders和User,並在兩個類中定義相關屬性和方法,如下所示
package com.itheima.po; public class Orders { private Integer id; private String number; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "IdCard [id="+id+",number="+number+"]"; } }
package com.itheima.po; import java.util.List; public class User { private Integer id; private String username; private String address; private List<Orders> ordersList; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List<Orders> getOrders() { return ordersList; } public void setOrders(List<Orders> ordersList) { this.ordersList = ordersList; } @Override public String toString() { return "Customer [id="+id+",username="+username+",address="+address+",ordersList="+ordersList+"]"; } }
3.在com.itheima.mapper包中,建立使用者實體對映檔案UserMapper.xml,並在檔案中編寫一對多關聯對映查詢的配置
<?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.itheima.mapper.UserMapper">
<select id="findUserWithOrders" parameterType="Integer" resultMap="UserWithOrdersResult">
select u.*,o.id as orders_id,o.number
from tb_user u,tb_orders o
where u.id=o.user_id
and u.id=#{id}
</select>
<resultMap type="User" id="UserWithOrdersResult">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<collection property="ordersList" ofType="Orders">
<id property="id" column="orders_id"/>
<result property="number" column="number"/>
</collection>
</resultMap>
</mapper>
4.將對映檔案UserMapper.xml的路徑配置到核心配置檔案mybatis—config.xml中
<mapper resource="com/itheima/mapper/UserMapper.xml"/>
5.編寫測試方法,
@Test
public void findUserTest() {
SqlSession session = MybatisUtils.getSession();
User user = session.selectOne("com.itheima.mapper.UserMapper.findUserWithOrders",1);
System.out.println(user);
//關閉SqlSession
session.close();
}
6.檢視結果
可以看到SQL語句已經拼接完成了,但是查詢結果中username顯示???還有address顯示為空,這可能是mysql的中文亂碼問題,但是我現在還不會處理(尷尬,,以後一定處理)