1. 程式人生 > >javaEE Mybatis,一對一、一對多關聯查詢,resultMap配置關聯屬性的對映

javaEE Mybatis,一對一、一對多關聯查詢,resultMap配置關聯屬性的對映

OrderMapper.xml(實體類的Sql配置檔案,resultMap配置一對一、一對多關聯屬性的對映):

<?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">

<!-- 配置原生Sql語句   -->
<mapper namespace="com.xxx.mybatis.mapper.OrderMapper">
	
	<!-- 一對一關聯查詢  (一個訂單關聯一個使用者) -->
	<!-- 手動配置資料庫表的列名與返回物件屬性的對映關係 (有關聯屬性) -->
	<resultMap type="Order" id="order">
		<result column="id" property="id"/>  <!-- order物件的屬性 -->
		<result column="user_id" property="userId"/>
		<result column="number" property="number"/>  <!-- 關聯查詢時(多表查詢),列名和屬性名相同時,不可以省略不寫。 單表查詢時(沒有關聯屬性)列名和屬性名相同時,可以省略 -->
		<!-- 關聯屬性的對映(一對一) -->
		<association property="user" javaType="User" >  <!-- user是Order類中的關聯屬性。  javaType:必須指定user屬性的型別 -->
			<id column="user_id" property="id"/>  <!-- User物件的屬性 -->
			<result column="username" property="username"/>
		</association>
	</resultMap>
	
	<select id="selectOrders" resultMap="order">  <!-- 返回物件有關聯屬性時,必須用resultMap手動配置對映關係 -->
		SELECT 
		o.id,
		o.user_id, 
		o.number,
		o.createtime,
		u.username 
		FROM orders o 
		left join user u 
		on o.user_id = u.id
	</select>
	
	<!-- 一對多關聯查詢 (一個使用者關聯多個訂單)-->
	<resultMap type="User" id="user">
		<id column="user_id" property="id"/>  <!-- User物件的屬性 -->
		<result column="username" property="username"/>  <!-- id標籤表示主鍵屬性;result表示非主鍵屬性 -->
		<!-- 關聯屬性的對映(一對多) -->
		<collection property="orderList" ofType="Order" >  <!-- orderList是User類中的關聯屬性。 ofType:必須指定orderList屬性是什麼型別的集合 -->
			<id column="id" property="id"/>    <!-- order物件的屬性 -->
			<result column="number" property="number"/>
		</collection>
	</resultMap>
	
	<select id="selectUserList" resultMap="user">
		SELECT 
		o.id,
		o.user_id, 
		o.number,
		o.createtime,
		u.username 
		FROM user u
		left join orders o 
		on o.user_id = u.id
	</select>

</mapper>

OrderMapper.java(遵循四個原則的Dao層介面):

package com.xxx.mybatis.mapper;

import java.util.List;

import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;

public interface OrderMapper {
	
	//遵循四個原則:
	//User.xml中配置的名稱空間要與該介面的全類名保持一致(com.xxx.mybatis.mapper.UserMapper) 
	//介面中的方法名  == User.xml中配置的sql語句的id名
	//返回值型別  與  User.xml檔案中配置的返回值型別(resultType)要一致
	//方法的輸入引數型別 與User.xml中配置的輸入引數的型別(parameterType)要一致
	
	//一對一關聯 查詢  以訂單為中心 關聯使用者
	public List<Order> selectOrders();
	
	//一對多關聯
	public List<User> selectUserList();
	
}

Test.java(測試類):

package com.xxx.mybatis.junit;

import java.io.InputStream;
import java.util.List;

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 org.junit.Test;

import com.xxx.mybatis.mapper.OrderMapper;
import com.xxx.mybatis.pojo.Order;
import com.xxx.mybatis.pojo.User;

public class Test {

	@Test
	//一對一
	public void testOrderList() throws Exception {
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//---------------------------------------------------------------------
		
		//SqlSession會根據介面自動生成這個介面的實現類  (動態代理)。
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		List<Order> selectOrdersList = orderMapper.selectOrders();
		
		for (Order order : selectOrdersList) {
			System.out.println(order);
		}
	}
	
	@Test
	//一對多
	public void testUserList() throws Exception {
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//---------------------------------------------------------------------
		
		//SqlSession會根據介面自動生成這個介面的實現類  (動態代理)。
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		List<User> users = orderMapper.selectUserList();
		for (User user : users) {
			System.out.println(user);
		}
	}
	
}

Order.java(實體類):

package com.xxx.mybatis.pojo;

import java.io.Serializable;
import java.util.Date;

public class Order  implements Serializable{
    
	private static final long serialVersionUID = 1L;
	private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    
    //關聯使用者物件User
    private User user;
    
    
    //.....getter和setter方法..........
    
}

User.java(實體類):

package com.xxx.mybatis.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

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; //地址
	
	//關聯訂單 (List)
	private List<Order> orderList;
	
	
	//.....getter和setter方法..........
	
}

src/sqlMapConfig.xml(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>
 
	<properties resource="jdbc.properties"/>
	
	<!-- 為型別配置別名 -->
	<typeAliases>
		<!-- 該包及其子包下的所有類都會自動取簡單類名為別名,且別名首字母大小寫都可以 -->
		<package name="com.xxx.mybatis.pojo"/>
	</typeAliases>
	
	<!-- 連線資料庫的引數配置。和spring整合後 environments配置將廢除    -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事務管理 -->
			<transactionManager type="JDBC" />
			<!-- 資料庫連線池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="123" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 載入外部實體類的Sql對映檔案 -->
	<mappers>
		<package name="com.xxx.mybatis.mapper" />  <!-- 該包下的所有類對應的xml對映檔案都會包含進來(推薦)。必須滿足該包下的xml檔案的名字和位置與對應類相同 -->
	</mappers>
	
</configuration>