一、resultMap实现一对多映射
需求
:查询某一个用户的所有信息及其订单的编号和订单的创建日期。
对应sql语句为:
SELECTuser.id,user.username,user.sex,user.address,user.birthday,orders.idreders_id,orders.number,orders.creattime FROM USER LEFT JOIN orders ON user.id=orders.user_id WHERE user.id=1;
1. 两张表的pojo
在User表的pojo中加入了一个Orders的链表,将订单对象封装到了User对象中。
User表的pojo。
package com.gql.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 类说明:
* User_JavaBean
* @guoqianliang1998.
*/
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String sex;
private String address;
private Date birthday;
//用户关联多个订单对象
private List<Orders> orderList;
public List<Orders> getOrderList() {
return orderList;
}
public void setOrderList(List<Orders> orderList) {
this.orderList = orderList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
Orders表的pojo。
package com.gql.pojo;
import java.io.Serializable;
import java.util.Date;
/**
* 类说明:
* Orders_JavaBean
* @guoqianliang1998.
*/
public class Orders implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private Date creattime;
private String number;
private int user_id;
private int count;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getCreattime() {
return creattime;
}
public void setCreattime(Date creattime) {
this.creattime = creattime;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
2.dao层接口
package com.gql.mapper;
import java.util.List;
import com.gql.pojo.Orders;
import com.gql.pojo.User;
/**
* 类说明:
* Orders订单的dao层接口
* @guoqianliang1998.
*/
public interface OrdersMapper {
//一对多查询某一个用户
User getUserById(int id);
}
3.dao层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="com.gql.mapper.OrdersMapper">
<select id="getUserById" parameterType="int" resultMap="getUserByIdResultMap">
SELECT
user.id,
user.username,
user.sex,
user.address,
user.birthday,
orders.id reders_id,
orders.number,
orders.creattime
FROM USER
LEFT JOIN orders ON user.id=orders.user_id
WHERE user.id=#{id};
</select>
<resultMap type="com.gql.pojo.User" id="getUserByIdResultMap">
<id column="id" property="id"/>
<result column="username" property="username"></result>
<result column="sex" property="sex"></result>
<result column="address" property="address"></result>
<result column="birthday" property="birthday"></result>
<collection property="orderList" ofType="com.gql.pojo.Orders">
<id column="orders_id" property="id"/>
<result column="number" property="number"></result>
<result column="creattime" property="creattime"></result>
</collection>
</resultMap>
</mapper>
4.使用resultMap实现一对多测试
package com.gql.mapper;
import java.io.IOException;
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 com.gql.mapper.custom.OrdersMapperCustom;
import com.gql.pojo.Orders;
import com.gql.pojo.User;
import com.gql.pojo.custom.OrdersCustom;
public class OrderMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testGetUserById(){
SqlSession session = sqlSessionFactory.openSession();
OrdersMapper mapper = session.getMapper(OrdersMapper.class);
User user = mapper.getUserById(1);
System.out.println(user.getOrderList().size());
}
}
成功打印出对象的链表属性的大小为3,说明成功将3个订单绑定到一个用户上。
DEBUG [main] - ==> Preparing: SELECT user.id, user.username, user.sex, user.address, user.birthday, orders.id reders_id, orders.number, orders.creattime FROM USER LEFT JOIN orders ON user.id=orders.user_id WHERE user.id=?;
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 3
在debug界面也可以看到成功绑定: