以前的博客在MyBatis第三章節中介紹了多表查詢多對1、一對多的狀況,這裏再對一對1、多堆多的狀況作一下說明,也算是將MyBatis這部分的知識作一個補充和完整收尾的工做。java
這裏基於一個簡單的用戶購買商品訂單表的案例來進行說明一對一查詢的模型:git
用戶表user和訂單表的關係爲:一個用戶有多個訂單,一個訂單隻從屬於一個用戶。github
一對一查詢的需求:查詢一個訂單,與此同時查詢出該訂單所屬的用戶:sql
對應數據庫中表的設計:數據庫
orders訂單表:mybatis
user用戶表:app
對應建立實體類:dom
Order類:函數
public class Order { private int id; private String orderTime; private int total; private User user; //一個訂單從屬於一個用戶,針對於訂單與用戶這裏是一對一的關係 }
User類:ui
public class User { private int id; private String username; private String password; private Date birthday; }
對應OrderMapper接口及xml中查詢sql封裝,須要注意的是使用Date_Format函數進行格式封裝輸出到對應實體order類,
能夠將Date類型的ordertime進行標準格式化輸出:
public interface OrderMapper { //查詢出全部訂單,並一併查詢出訂單對應的用戶 List<Order> findAll(); }
<resultMap id="orderMap" type="order"> <id column="oid" property="id"></id> <result column="ordertime" property="orderTime"></result> <result column="total" property="total"></result> <result column="uid" property="user.id"></result> <result column="username" property="user.username"></result> <result column="password" property="user.password"></result> <result column="birthday" property="user.birthday"></result> </resultMap> <select id="findAll" resultMap="orderMap"> SELECT o.id oid, DATE_FORMAT(o.ordertime, '%Y-%m-%d %H:%i:%S') ordertime, o.total, u.id uid, u.username, u.password, u.birthday FROM orders o JOIN USER u ON o.uid = u.id </select>
其中<resultMap>還能夠配置成以下,使用<association>進行User類的單獨封裝映射,注意這裏使用了別名簡化配置,這裏就再也不累述:
<resultMap id="orderMap" type="order"> <id column="oid" property="id"></id> <result column="ordertime" property="orderTime"></result> <result column="total" property="total"></result> <association property="user" javaType="user"> <id column="uid" property="id"></id> <result column="username" property="username"></result> <result column="password" property="password"></result> <result column="birthday" property="birthday"></result> </association> </resultMap>
多對多查詢通常設立中間表來關聯兩張主表,常見的模型是用戶User和對應的角色Role。
用戶表User和角色表Role的關係爲,一個用戶有多個角色,一個角色被多個用戶使用。
多對多基於查詢需求來實現:查詢用戶表的同時查詢出該用戶對應的全部角色
數據庫表的簡單設計以下:
sys_user表(用戶表):
sys_role表(角色表):
sys_user_role表(中間表)
對應實體類建立,主要是在用戶domain中設計出多方角色的List<Role>屬性:
User類:
public class User { private int id; private String username; private String password; private Date birthday; /** * 查詢用戶同時查詢出它全部的角色 */ private List<Role> roleList; }
Role類:
public class Role { private int id; private String roleName; private String roleDesc; }
對應Mapper接口和xml中的sql封裝以下:
public interface UserMapper { /** * 查詢出全部用戶及其對應的角色 * @return */ List<User> findAllUserRole(); }
<?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.fengye.mapper.UserMapper"> <resultMap id="userRoleMap" type="user"> <id column="id" property="id"></id> <result column="username" property="username"></result> <result column="password" property="password"></result> <result column="birthday" property="birthday"></result> <!--用戶對應多個角色List使用collection: property是實體類對應的屬性, ofType是List中每一個元素的類型 注意:使用ofType時,下面封裝的property中不能使用role.屬性; 注意區分一對一中type屬性的封裝恰好相反--> <collection property="roleList" ofType="role"> <id column="roleId" property="id"></id> <result column="roleName" property="roleName"></result> <result column="roleDesc" property="roleDesc"></result> </collection> </resultMap> <select id="findAllUserRole" resultMap="userRoleMap"> select * from sys_user u join sys_user_role ur on u.id = ur.userId join sys_role r on r.id = ur.roleId </select> </mapper>
其實基本上對應sql鏈接寫好了,封裝注意一下表與錶鏈接的邏輯關係、從屬性,鏈接標籤條件的使用,基本上就是熟能生巧的問題了。
本節代碼示例已上傳至github地址:
https://github.com/devyf/MyBatisReview/tree/master/fengye_mybatis_multi