1. 程式人生 > 實用技巧 >模組一-第5部分-Mybatis複雜對映開發

模組一-第5部分-Mybatis複雜對映開發

【1】一對一查詢

一、一對一查詢模型

例:使用者和訂單之間的關係,查詢一個訂單所屬的一個使用者

二、一對一查詢語句

select * from orders o,user u where o.uid=u.id;

三、建立實體類

/*
*	Order類
*/
public class Order {
    private int id;
    private String orderinfo;
    // 訂單所屬的使用者
    private User user;
}
/*
*	User類
*/
public class User {
    private int id;
    private String name;
}

四、建立Mapper介面

public interface OrderMapper { 
	List<Order> findAll(); 
}

五、配置xml檔案(OrderMapper.xml)

<mapper namespace="com.Zhou.mapper.OrderMapper">
    <!--容器封裝對映-->
    <resultMap id="orderMap" type="com.Zhou.Pojo.Order">
        <result column="uid" property="user.id"></result>
        <result column="name" property="user.name"></result>
    </resultMap>
    <!--SQL語句查詢-->
    <select id="findAll" resultMap="orderMap">
        select * from orders o,user u where o.uid=u.id
    </select>
</mapper>

其中還可以配置如下:

<mapper namespace="com.Zhou.mapper.OrderMapper">
    <!--容器封裝對映-->
    <resultMap id="orderMap" type="com.Zhou.Pojo.Order">
        <result property="id" column="id"></result>
        <result property="orderinfo" column="orderinfo"></result>
        <association property="user" javaType="com.Zhou.Pojo.User">
            <result column="uid" property="id"></result>
            <result column="name" property="name"></result>
        </association>
    </resultMap>
    <!--SQL語句查詢-->
    <select id="findAll" resultMap="orderMap">
        select * from orders o,user u where o.uid=u.id
    </select>
</mapper>

六、測試結果

/**
* 查詢一個訂單對應的一個使用者
*/
@Test
public void findOrders(){
    OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    List<Order> all = mapper.findAll();
    for (Order order :
         all) {
        System.out.println(order);
    }
}

【2】一對多查詢

一、一對多查詢模型

例:使用者和訂單之間的關係,查詢一個使用者的所有訂單

二、一對多查詢語句

select *,o.id oid from user u left join orders o on u.id=o.uid;

三、修改User實體

/*
*	Order類
*/
public class Order { 
	private int id; 
	private Date ordertime; 
	private double total;
	
	//代表當前訂單從屬於哪一個客戶 
	private User user; 
}
/*
*	User類
*/
public class User { 
	private int id; 
	private String name; 
	 
    // 當前使用者擁有的所有訂單
    private  List<Order> orders;
}

四、建立Mapper介面

public interface UserMapper { 
	List<Order> findAll(); 
}

五、配置xml檔案(UserMapper.xml)

<mapper namespace="com.Zhou.mapper.UserMapper">
    <resultMap id="userMap" type="com.Zhou.Pojo.User">
        <result column="id" property="id"></result>
        <result column="name" property="name"></result>
        <collection property="orders" ofType="com.Zhou.Pojo.Order">
            <result column="oid" property="id"></result>
            <result column="orderinfo" property="orderInfo"></result>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="userMap">
        select *,o.id oid from user u left join orders o on u.id=o.uid;
    </select>
</mapper>

六、測試結果

@Test
public void findAll(){
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> all = mapper.findAll();
    for (User user :
         all) {
        System.out.println(user);
    }
    sqlSession.close();
}

【3】多對多查詢

一、多對多查詢模型

例:使用者和角色的關係,查詢使用者的同時查詢該使用者的所有角色。

二、多對多查詢語句

select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id inner join role r on ur.role_id=r.id;

三、建立Role實體、修改User實體

/*
*	User類
*/
public class User {
    private int id;
    private String name;

    private List<Order> orders;
    
    private List<Role>  roles;

}
/*
*	Role類
*/
public class Role {
    private int id;
    private String roleName;
}

四、新增UserMapper介面方法

public interface UserMapper {
    List<User> findAll();
	// 新增查詢所有使用者的對應的角色的介面方法
    List<User> findAllUserAndRole();
}

五、配置UserMapper.xml檔案

<resultMap id="userRoleMap" type="com.Zhou.Pojo.User">
        <result column="id" property="id"></result>
        <result column="name" property="name"></result>
        <collection property="roles" ofType="com.Zhou.Pojo.Role">
            <result column="rid" property="id"></result>
            <result column="roleName" property="roleName"></result>
        </collection>
    </resultMap>
    <select id="findAllUserAndRole" resultMap="userRoleMap">
        select u.*,r.*,r.id rid 
        from user u 
        	left join user_role ur on u.id=ur.user_id 
        	inner join role r on ur.role_id=r.id;
    </select>

六、測試結果

@Test
public void findAllUserAndRole(){
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> allUserAndRole = mapper.findAllUserAndRole();
    for (User user :
         allUserAndRole) {
        System.out.println(user);
    }
    sqlSession.close();
}

【4】個人理解

通過xml檔案配置進行對映開發的完整步驟:

  1. 【MySQL】根據需求建立對應的表;
  2. 【MySQL】寫好對應的查詢語句,並驗證結果;
  3. 【IDE】根據表建立(或修改)實體類;
  4. 【IDE】建立對應的介面方法;
  5. 【IDE】配置對應的xml檔案;
    1. 配置對映關係;
    2. 配置查詢語句。
  6. 【IDE】建立測試方法,測試結果。