javaEE Mybatis,一對一、一對多關聯查詢,resultMap配置關聯屬性的對映
阿新 • • 發佈:2018-12-10
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>