商品订单数据模型
一对一查询
通过订单信息查询订单和用户信息,因为一个订单只能属于一个用户,所以属于一对一查询。
前期准备
使用resultType的思路
创建一个pojo并继承order类,在写上user类的一些属性
- 编写mapper.xml
- 编写mapper.java接口
- 编写测试方法
- 测试
使用resultMap的思路
- 在order类中添加user类的属性
- 编写mapper.xml
- 编写mapper.java接口
- 编写测试方法
- 测试
代码
使用resultType
实体类(UserOrder.java):
package www.tl.entity;
public class OrderUser extends Order {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "OrderUser ["+"id="+id+", username=" + username + ", address=" + address + "id=" + super.id + ", number=" + super.number + ", createtime=" + super.createtime
+ "]";
}
}
mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.OrderUserMapper">
<!-- 一对多查询 -->
<select id="queryOrderUser" resultType="OrderUser">
select o.id,u.id,u.username,o.number,u.address,o.createtime
from orders o left join user u
on o.user_id = u.id
</select>
</mapper>
接口(mapper.java)
package www.tl.dao;
import java.util.List;
import www.tl.entity.OrderUser;
public interface OrderUserMapper {
public List<OrderUser> queryOrderUser();
}
测试方法
package www.tl.daotest;
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 www.tl.dao.OrderUserMapper;
import www.tl.entity.OrderUser;
public class OrderUserTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
/*加载资源文件*/
String resource = "SqlMapConfig.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
/*创建SqlSessionFactoryBuilder*/
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
/*创建SqlSessionFactory*/
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
@Test
public void queryOrderUser() {
/*创建会话(sqlSession)*/
SqlSession sqlSession = this.sqlSessionFactory.openSession();
/*创建OrderMapper*/
OrderUserMapper orderUserMapper = sqlSession.getMapper(OrderUserMapper.class);
/*调用sql并输出结果*/
List<OrderUser> list = orderUserMapper.queryOrderUser();
for (OrderUser orderUser : list) {
System.out.println(orderUser);
}
sqlSession.close();
}
}
使用resultMap
实体类(order.java)
package www.tl.entity;
import java.io.Serializable;
import java.util.Date;
public class Order implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public Integer id;
public Integer userId;
public String number;
public Date createtime;
public String note;
private User user;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Order [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
+ ", note=" + note + ", user=" + user + "]";
}
}
Mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.OrderMapper">
<!-- 一对一查询 -->
<resultMap type="Order" id="OrderUserResultMap">
<!-- 声明主键 -->
<id property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<!-- 配置一对一属性
property:Order类里的User属性名
javaType:属性类型 -->
<association property="user" javaType="User">
<!-- 声明主键 表示user_id是关联查询对象的唯一标识,列名的确定不来自于数据表而来自于查询语句 -->
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
</association>
</resultMap>
<select id="queryOrderUser" resultMap="OrderUserResultMap">
select o.id,o.user_id,o.number,o.createtime,u.username,u.address
from orders o left join user u
on o.user_id = u.id
</select>
</mapper>
接口(Mapper.java)
package www.tl.dao;
import java.util.List;
import www.tl.entity.Order;
import www.tl.entity.User;
public interface OrderMapper {
public List<Order> queryOrderUser();
}
测试方法
package www.tl.daotest;
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 www.tl.dao.OrderMapper;
import www.tl.dao.UserMapper;
import www.tl.entity.Order;
public class OderTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
/*加载资源文件*/
String resource = "SqlMapConfig.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
/*创建SqlSessionFactoryBuilder*/
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
/*创建SqlSessionFactory*/
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
}
@Test
public void queryOrderUser() {
/*创建会话(sqlSession)*/
SqlSession sqlSession = this.sqlSessionFactory.openSession();
/*创建OrderMapper*/
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
/*调用sql并输出结果*/
List<Order> list = orderMapper.queryOrderUser();
for (Order order : list) {
System.out.println(order);
}
}
}
一对多查询
通过用户信息查询订单信息,一个用户可以有多个订单,所以采用一对多查询。
开发思路
- 在user类中添加order类属性(因为是一对多查询,返回的一定是个结果集,最好用集合进行封装)
- 编写mapper.xml
- 编写mapper.java接口
- 编写测试方法
- 测试
代码
实体类(User.java)
package www.tl.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String sex;
private Date birthday;
private String address;
private List<Order> order;
public List<Order> getOrder() {
return order;
}
public void setOrder(List<Order> order) {
this.order = order;
}
public Integer getId() {
return id;
}
public void setId(Integer 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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + ", order=" + order + "]";
}
}
mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.UserMapper">
<!--一对多查询 -->
<resultMap type="User" id="UserOrderResultMap">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<!-- 一对多关联
property:Usre类中order属性
javaType:java泛型
ofType:list集合里的数据类型
-->
<collection property="order" javaType="List" ofType="Order">
<id property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
</collection>
</resultMap>
<select id="queryUserOrders" resultMap="UserOrderResultMap">
select u.id,u.username,u.address,o.number,o.createtime
from user u left join orders o
on u.id=o.user_id
</select>
</mapper>
接口(mapper.java)
package www.tl.dao;
import java.util.List;
import www.tl.entity.QueryVo;
import www.tl.entity.User;
public interface UserMapper {
public List<User> queryUserOrders();
}
测试方法
package www.tl.daotest;
import java.io.InputStream;
import java.util.ArrayList;
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 www.tl.dao.UserMapper;
import www.tl.entity.QueryVo;
import www.tl.entity.User;
public class MapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init()throws Exception {
/*加载资源*/
String resource = "SqlMapConfig.xml";
InputStream ins = Resources.getResourceAsStream(resource);
/*创建SqlSessionFactoryBulider*/
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
/*创建SqlSessionFactory*/
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(ins);
}
@Test
public void queryUserOrders() {
SqlSession sqlSession = this.sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.queryUserOrders();
for (User user : users) {
System.out.println(user);
}
}
}