1. 程式人生 > >Mybatis學習筆記(七)--關聯查詢,一對一,一對多

Mybatis學習筆記(七)--關聯查詢,一對一,一對多

關聯查詢

改造User實體類

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username;
	private String sex;
	private Date birthday;
	private String address;

	//一對多
	private List<Orders> ordersList;
。。。省略了get/set
}

改造Orders實體類

public class Orders  implements Serializable{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //一對一
    private User user;
...省略了get/set
}

一對一

編寫Mapper.xml

<!-- 
	一對一對映 
	這裡的一對一要使用的不是基本型別,這裡需要手動對映型別,這裡使用的是resultMaps
	type 是要對映的型別  也就是這裡的orders這個類
	id  就是select中的resultMap的對應的值  
-->
<resultMap type="Orders" id="order">
	<id column="id" property="id"/>
	<result column="user_id" property="userId"/>
	<!-- 
		一對一的使用標籤 
		property是orders中的User宣告的那個名字  private User user;
		javaType是user對應的java型別
	-->
	<association property="user" javaType="User">
		<!-- id:宣告主鍵,表示user_id是關聯查詢物件的唯一標識 -->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
	</association>
</resultMap>
<select id="getOrdersList" resultMap="order">
	select o.id,o.user_id,o.number,o.createtime,o.note,u.username from orders o left join user u on o.user_id = u.id;
</select>

編寫mapper介面

測試程式碼

//一對一
@Test
public void testGetOrdersList() throws Exception {
	String res = "SqlMapConfig.xml";
	InputStream inputSteam = Resources.getResourceAsStream(res);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputSteam);
	SqlSession sqlSession = sqlSessionFactory.openSession();
	OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
	List<Orders> ordersList = mapper.getOrdersList();
	for (Orders orders : ordersList) {
		System.out.println(orders);
		System.out.println(orders.getUser());
	}
}

測試結果

一對多

編寫mapper介面

編寫mapper.xml

<!-- 
	一對多的對映
 -->
 <resultMap type="User" id="user">
 	<id column="id" property="id"/>
 	<result column="username" property="username"/>
 	<result column="birthday" property="birthday"/>
 	<result column="sex" property="sex"/>
 	<result column="address" property="address"/>
 	<!-- 
 		一對多對映
 		property  這裡是User類中的List的宣告  ofType這裡是List中的泛型類
 	-->
 	<collection property="ordersList" ofType="orders">
 		<id column="id" property="id"/>
 		<result column="number" property="number"/>
 		<result column="user_id" property="userId"/>
 		<result column="createtime" property="createtime"/>
 		<result column="note" property="note"/>
 	</collection>
 </resultMap>
 <select id="getUserList" resultMap="user">
 	select 
 	o.id,o.user_id,o.number,o.createtime,o.note,
 	u.username,u.birthday,u.sex,u.address 
 	from user u left join orders o on o.user_id = u.id;
 </select>

測試方法

//一對多
@Test
public void testGetUserList() throws Exception {
	String res = "SqlMapConfig.xml";
	InputStream inputSteam = Resources.getResourceAsStream(res);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputSteam);
	SqlSession sqlSession = sqlSessionFactory.openSession();
	OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
	List<User> userList = mapper.getUserList();
	for (User user : userList) {
		System.out.println(user);
		if(user.getOrdersList().size()>0) {
			for (Orders o : user.getOrdersList()) {
				System.out.println(o);
			}
		}
		
	}
}

測試結果