1. 程式人生 > >JavaEE MyBatis關聯對映之一對多(教材學習筆記)

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

在實際應用中,應用更多的是一對多,例如每一個使用者可以有多個訂單,在使用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的中文亂碼問題,但是我現在還不會處理(尷尬,,以後一定處理)