1. 一对一查询
查询订单信息,关联查询创建订单的用户信息
确定查询主表:订单表
确定查询关联表:用户表
内连接查询:选择订单。*,`user`.username,`user`.sex,`user`.address
from orders,user where orders.user_id = user.id
原始POJO不满足我们的需求,故新建一个pojoCustom类继承POJO,来实现关联查询的功能多张表的关联,pojoCustom应该继承包括我们查询字段最多的那个类:
插一段理念中的一个坑:
新建的mapper.xml文件必须要把文件的后缀名加上,即.XML不能省略,最好是新建文件,然后自己加上的.XML后缀,使用建XML的形式建mapper.xml,文件在想法显示为没有后缀,回导致找不到mapper.xml的问题,:
截图对比,错误的命名:
报错如下:
正确文件命名:
现在放上我的代码:
Orders实体类:
public class Orders {
private Integer id;
private String userId;
private String number;
private Date createtime;
private String note;
//省略getter,setter
}
关联查询的自定义OrdersCustom类,用于映射查询结果:
public class OrdersCustom extends Orders {
private String name;
private String sex;
private String address;
//省略getter,setter
}
OrdersMapperCustom接口:
public interface OrdersMapperCustom {
public List<OrdersCustom>findOrdersUser()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="com.lmj.ssm.mapper.OrdersMapperCustom" >
<select id="findOrdersUser" resultType="OrdersCustom">
select orders.*,`user`.username,`user`.sex,`user`.address
from orders,user where orders.user_id=user.id
</select>
</mapper>
测试类:测试:
public class Test {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
@org.junit.Test
public void findOrdersUser() throws Exception {
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
//创建包装对象,设置查询条件
List<OrdersCustom> orderslist= ordersMapperCustom.findOrdersUser();
System.out.println(orderslist);
sqlSession.close();
}
public Test() throws IOException {
}
}
一对一的结果映射的实现:
在OrdersCustom中添加代码:
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
orderMapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >
<!-- 一对一的实现-->
<resultMap id="OrdersPlusUser" type="OrdersCustom">
配置订单列column与订单类的属性的映射关系
<id column="id" property="id"/>
<result column="note" property="note"/>
<!-- 配置与订单一对一关系的User的映射,association 表示它们之间一对一的关系-->
<association property="user" javaType="User">
<!-- 指定外键所映射的类型-->
<id column="user_id" property="id"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
select orders.*,`user`.username,`user`.sex,`user`.address
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id
</select>
</mapper>
接口类OrdersMapperCustom的代码:
public interface OrdersMapperCustom {
public List<OrdersCustom>findOrdersPlusUser()throws Exception;
}
测试类的主代码:
public void findOrdersUser() throws Exception {
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
//创建包装对象,设置查询条件
List<OrdersCustom> orderslist= ordersMapperCustom.findOrdersPlusUser();
System.out.println(orderslist);
sqlSession.close();
}
运行图:
2. 一对多查询:
查询的结果集这里应该用结果映射来作映射(因为有重复的列名)
主查询表:订单表,关联查询表:订单明细表。
先对比一下区别:先执行三表的查询:
select orders.*,`user`.username,`user`.sex,`user`.address
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id
运行截图:你会发现有重复,但重复的记录并不一样:
修改语句检验:
select orders.*,`user`.username,`user`.sex,`user`.address,orderdetail.id,orderdetail.items_num
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id
结果如下:
发现有重复的列名,并且有重复的记录数,故在订单类中添加列表<的的OrderDetail>订单明细来解决映射重复的问题,使映射的记录为两条:
处理如下:
在OrdersCustom类中添加集合属性:
public class OrdersCustom extends Orders {
private String name;
private String sex;
private String address;
//一对一的集合user类
private User user;
//一对多的集合Orderdetail类
private List<Orderdetail> orderDetails;
省略getter,setter方法
}
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="com.lmj.ssm.mapper.OrdersMapperCustom" >
<!--订单和订单的明细resultMap-->
<!-- 使用继承extends,不用再配订单信息和用户信息的映射-->
<!-- 一对一的实现-->
<resultMap id="OrdersPlusUser" type="OrdersCustom">
<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="user" javaType="User">
<!-- 指定外键所映射的类型-->
<id column="user_id" property="id"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
<collection property="orderDetails" ofType="Orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="items_num" property="itemsNum"/>
<result column="items_id" property="itemsId"/>
</collection>
</resultMap>
<select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
select orders.*,`user`.username,`user`.sex,`user`.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders.id
</select>
</mapper>
编写OrdersMapperCustom接口:
public interface OrdersMapperCustom {
public List<OrdersCustom>findOrdersPlusUser()throws Exception;
}
编写测试方法:
public class Test {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
@org.junit.Test
public void findOrdersUser() throws Exception {
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
//创建包装对象,设置查询条件
List<OrdersCustom> orderslist= ordersMapperCustom.findOrdersPlusUser();
System.out.println(orderslist);
sqlSession.close();
}
public Test() throws IOException {
}
}
结果如下:
多对多查询:
主表:用户表,,,关联表:用户商品没有直接关联,所以要关联订单和订单详细表。
映射思路:将用户信息映射到user中,
在user类中添加订单列表属性List<Order>orderslist
在Orders中添加订单明细表属性List<Ordertail>orderdetails
在orderdetail中添加item属性,将订单明细所对应商品映射到items
运行截图:
最后贴一下完整的代码:
ordermapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >
<resultMap id="OrdersPlusUser" type="UserCustom">
<!-- 用户信息-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<!--订单信息-->
<!-- 一个用户多个订单,用collection-->
<collection property="ordersList" ofType="OrdersCustom">
<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"/>
<!--订单明细
一个订单多个明细-->
<collection property="orderDetails" ofType="Orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="items_num" property="itemsNum"/>
<result column="items_id" property="itemsId"/>
<!--一个订单明细对应一个商品-->
<association property="items" javaType="Items">
<id column="items_id" property="id"/>
<result column="detail" property="detail"/>
<result column="name" property="name"/>
</association>
</collection>
</collection>
</resultMap>
<!--查询用户和购买的商品信息-->
<select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
select orders.*,`user`.username,`user`.sex,`user`.address,
orderdetail.id orderdetail_id,orderdetail.items_id,
orderdetail.items_num,
items.name,items.detail
from orders,user,orderdetail,items
where orders.user_id=user.id and orderdetail.orders_id=orders.id and orderdetail.items_id=items.id
</select>
</mapper>
在Orderdetail类中添加Item类:
public class Orderdetail {
private Integer id;
private Integer ordersId;
private Integer itemsId;
private Integer itemsNum;
private Items items;
在OrdersCustom中添加user类和orderdetail集合:
public class OrdersCustom extends Orders {
private String name;
private String sex;
private String address;
private User user;
private List<Orderdetail> orderDetails;
省略getter,setter方法
}
UserCustom类中添加订单order类集合:
public class UserCustom extends User {
private List<Orders> ordersList;
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
}
测试类代码:
public class Test {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
@org.junit.Test
public void findOrdersUser() throws Exception {
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
//创建包装对象,设置查询条件
List<OrdersCustom> orderslist= ordersMapperCustom.findOrdersPlusUser();
System.out.println(orderslist);
sqlSession.close();
}
public Test() throws IOException {
}
}
一切ok