【簡述】
數據庫模型和數據等信息與上一篇博文相同。
需求也同上一篇博文。
【工程截圖】
【User.java】POJO
package cn.higgin.mybatis.po; import java.util.Date; public class User { //屬性名和數據庫表的字段對應 private int id; private String username; private String sex; private Date birthday; private String address; //省略get/set方法 }
【Orders.java】
package cn.higgin.mybatis.po; import java.util.Date; public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //注意!!!這里引入了User private User user; //省略get/set方法...... }
【OrdersMapperCustomer.java】
package cn.higgin.mybatis.mapper; import java.util.List; import cn.higgin.mybatis.po.Orders; public interface OrdersMapperCustom { //查詢訂單關聯查詢用戶信息,使用resultMap方式 public List<Orders> findOrdersUserResultMap() throws Exception; }
【OrdersMapperCustom.xml】
<?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="cn.higgin.mybatis.mapper.OrdersMapperCustom"> <!-- 訂單查詢關聯用戶的resultMap 將整個查詢的結果映射到cn.higgin.mybatis.po.Orders中 --> <resultMap type="cn.higgin.mybatis.po.Orders" id="OrdersUserResultMap"> <!-- 配置訂單的映射信息 --> <!-- id:指定查詢列中的唯一標識,訂單信息中的唯一標識,若有多個列組成唯一標識,需配置多個id column: 訂單信息的唯一標識列 property: 訂單信息的唯一標識列所映射到的 Orders的對應的屬性 --> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number" /> <result column="createtime" property="createtime"/> <result column="note" property="note" /> <!-- 配置映射的關聯的用戶信息 --> <!-- association:用於映射關聯查詢單個對象的信息 property:要將關聯查詢的用戶信息映射到Orders中的對應屬性 --> <association property="user" javaType="cn.higgin.mybatis.po.User"> <!-- id:關聯查詢用戶的唯一標識 column:指定唯一標識用戶信息的列 javaType:映射到user的對應屬性 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap> <!-- 查詢訂單關聯查詢用戶信息,使用resultMap --> <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap"> SELECT orders.*, USER.username, USER.sex, USER.address FROM orders,USER WHERE orders.user_id=user.id </select> </mapper>
【SqpMapperConfig.java和db.properties同上一篇博文】
【OrderMapperCustomTest.java】
package cn.higgin.mybatis.mapper; 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.Before; import org.junit.Test; import cn.higgin.mybatis.po.Orders; public class OrdersMapperCustomTest { private SqlSessionFactory sqlSessionFactory; // 此方法是在執行testFindUserById之前執行 @Before public void setUp() throws Exception { // 創建sqlSessionFactory // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創建會話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFindOrdersUser() throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); //創建代理對象 OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class); //調用mapper的方法 List<Orders> list=ordersMapperCustom.findOrdersUserResultMap(); System.out.println(list.size()); sqlSession.close(); } }
【運行結果】
【小結】
實現一對一查詢的情況下:
[ resultType ]
使用resultType較為方便,如果pojo中沒有包含查詢出來的列名,需要增加列名對應的屬性,即可完成映射。
如果沒有查詢結果的特殊要求建議使用resultType。
[ resultMap ]
需要單獨定義resultMap,實現有點麻煩。如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射到pojo的屬性中。
[ 注意 ]
resultMap可以實現延遲加載,resultType無法實現延遲加載。