resultType可以把查詢的結果分裝到pojo類型對象中,但pojo類的屬性名和查詢到的數據庫表的字段名必須保持一致。如果sql查詢到的字段與pojo的屬性名不一致,則需要使用resultMap將字段名和屬性名對應起來,進行手動配置封裝,將結果映射到pojo中。
數據庫表的結構:
create table sys_user( user_id int(5) auto_increment primary_key, user_name nvarchar(20), user_sex nvarchar(2), user_age int(3), user_address nvarchar(50) );
而pojo下的User類
public class User { private int id; private String name; private String sex; private int age; private String address; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + ", address='" + address + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
UserMapper.xml
<mapper namespace="com.company.mapper.UserMapper"> <!--resultMap:填入配置resultMap標簽的id值--> <select id="queryUserById" resultMap="userResultMap" parameterType="int"> select * from sys_user where user_id=#{id} </select> <!-- 配置resultMap 映射不同的字段名和屬性名 id屬性:resultMap唯一標識 type屬性:指定映射到哪一個pojo中 --> <resultMap id="userResultMap" type="com.company.pojo.User"> <!-- id標簽定義主鍵,非常重要,如果是多個字段,則定義多個id標簽 column屬性:主鍵在數據庫中的列名 property屬性:主鍵在pojo中的屬性名 --> <id column="user_id" property="id"></id> <!-- result標簽定義普通屬性 column屬性:非主鍵列名在數據庫中的列名 property屬性:非主鍵列名在pojo中對應的屬性名 --> <result column="user_name" property="name"></result> <result column="user_sex" property="sex"></result> <result column="user_age" property="age"></result> <result column="user_address" property="address"></result> </resultMap> </mapper>
這樣結果就可以封裝到pojo中。
使用resultMap進行關聯查詢
一個訂單信息只會是一個人下的訂單,所以從查詢訂單信息出發關聯查詢用戶信息為一對一查詢。如果從用戶信息出發查詢用戶下的訂單信息,則為一對多查詢,一個用戶可以下多個訂單。
一對一查詢
一對一數據模型:訂單用戶
1)改動pojo類
在訂單類中添加User屬性,User屬性是一個引用類型,用於存儲關聯查詢的用戶信息,因為關聯關系是一對一,所以只需要添加單個屬性即可。
Orders.java
public class Orders { //訂單id private int id; //用戶id private int userId; //訂單號 private String number; //訂單創建時間 private Date createTime; //備注 private String remark; //關聯用戶信息 private User user; @Override public String toString() { return "Orders{" + "id=" + id + ", userId=" + userId + ", number='" + number + '\'' + ", createTime=" + createTime + ", remark='" + remark + '\'' + ", user=" + user + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
2)配置Mapper.xml文件
先使用id和result屬性,映射orders類的結果集,然后使用association映射關聯對象User的結果集
OrdersMapper.xml
<mapper namespace="com.company.mapper.OrdersMapper"> <select id="queryOrdersUserList" resultMap="ordersResultMap"> select * from orders as a left join sys_user as b on a.user_id=b.user_id </select> <resultMap id="ordersResultMap" type="com.company.pojo.Orders"> <id property="id" column="id"></id> <result property="userId" column="user_id"></result> <result property="number" column="number"></result> <result property="createTime" column="createtime"></result> <result property="remark" column="remark"></result> <!-- association:配置一對一關系 property屬性:關聯對象在Orders里面的屬性名 javaType屬性:關聯對象類型 --> <association property="user" javaType="com.company.pojo.User"> <id property="id" column="user_id"></id> <result property="name" column="user_name"></result> <result property="sex" column="user_sex"></result> <result property="age" column="user_age"></result> <result property="address" column="user_address"></result> </association> </resultMap> </mapper>
3)測試
@Test public void test() throws Exception{ SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); inputStream.close(); SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class); List<Orders> ordersList = ordersMapper.queryOrdersUserList(); ordersList.forEach(System.out::println); sqlSession.close(); }
一對多查詢
查詢所有用戶信息及相關訂單
1)修改pojo類,在pojo類添加訂單集合屬性
User.java
public class User { //用戶id private int id; //姓名 private String name; //性別 private String sex; //年齡 private int age; //地址 private String address; private List<Orders> orders; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + ", address='" + address + '\'' + ", orders=" + orders + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List<Orders> getOrders() { return orders; } public void setOrders(List<Orders> orders) { this.orders = orders; } }
2)修改Mapper.xml文件
先使用id和result配置映射User類的結果,然后使用一對多關系的collection標簽配置orders結果
UserMapper.xml
<mapper namespace="com.company.mapper.UserMapper"> <select id="queryUserOrdersList" resultMap="userOrdersResultMap"> select * from sys_user as a left join orders as b on a.user_id=b.user_id </select> <resultMap id="userOrdersResultMap" type="com.company.pojo.User"> <id column="user_id" property="id"></id> <result column="user_name" property="name"></result> <result column="user_sex" property="sex"></result> <result column="user_age" property="age"></result> <result column="user_address" property="address"></result> <!-- collection:配置一對多關系 property屬性:關聯對象在Users里面的屬性名 ofType屬性:集合中pojo對象類型 --> <collection property="orders" ofType="com.company.pojo.Orders"> <id property="id" column="id"></id> <result property="userId" column="user_id"></result> <result property="number" column="number"></result> <result property="createTime" column="createtime"></result> <result property="remark" column="remark"></result> </collection> </resultMap> </mapper>
3)測試
@Test public void test() throws Exception{ SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); inputStream.close(); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.queryUserOrdersList(); userList.forEach(System.out::println); sqlSession.close(); }
resultMap包含的元素
<!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性--> <resultMap id="唯一的標識" type="映射的pojo對象"> <id column="表的主鍵字段,或者可以為查詢語句中的別名字段" jdbcType="字段類型" property="映射pojo對象的主鍵屬性" /> <result column="表的一個字段(可以為任意表的一個字段)" jdbcType="字段類型" property="映射到pojo對象的一個屬性(須為type定義的pojo對象中的一個屬性)"/> <association property="pojo的一個對象屬性" javaType="pojo關聯的pojo對象"> <id column="關聯pojo對象對應表的主鍵字段" jdbcType="字段類型" property="關聯pojo對象的主席屬性"/> <result column="任意表的字段" jdbcType="字段類型" property="關聯pojo對象的屬性"/> </association> <!-- 集合中的property須為oftype定義的pojo對象的屬性--> <collection property="pojo的集合屬性" ofType="集合中的pojo對象"> <id column="集合中pojo對象對應的表的主鍵字段" jdbcType="字段類型" property="集合中pojo對象的主鍵屬性" /> <result column="可以為任意表的字段" jdbcType="字段類型" property="集合中的pojo對象的屬性" /> </collection> </resultMap>
如果collection標簽是使用嵌套查詢,格式如下:
<collection column="傳遞給嵌套查詢語句的字段參數" property="pojo對象中集合屬性" ofType="集合屬性中的pojo對象" select="嵌套的查詢語句" > </collection>
注意:<collection>標簽中的column:要傳遞給select查詢語句的參數,如果傳遞多個參數,格式為column="{參數名1=表字段1,參數名2=表字段2}"