Mybatis中的映射结果resutType和resultMap
需求:查询订单信息, 关联查询用户信息
分析:共有订单表和用户表两张表,其中订单表是主表,用户表是从表
关系:一个订单对应着一个用户,从订单到用户是一对一, 从订单到用户是一对一的关联关系
sql:
SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER
POJO类:
Orders.java:
private Integer id; private String orderName; private Date crateTime; 加上 getter/setter 方法
User.java:
private Integer id; private String username; private String password; private String sex; private String address; 加上 getter/setter 方法
(一) 使用resultType实现
为了系统的可扩展性, 需要另外创建一个POJO类的扩展类(扩展类是继承订单POJO还是用户POJO,具体看SQL语句的查询列中查询出来的字段在哪个POJO中占得多, 哪个映射的字段多扩展类就继承哪个POJO类),这里就继承Orders类了,当然继承User类也是可以的:
OrdersUser.java: (这个类将是resultType的映射结果类型)
public class OrdersUser extends Orders { // 继承这个类,Orders类中的属性全都有了 // 把User的查询列字段加上 private String username; private String sex; private String address; 加上 getter/setter 方法 }
Mapper接口(这里使用的是动态代理接口),OrdersUserMapper.java:
public interface OrdersUserMapper { List<OrdersUser> findOrdersUser() throws Exception(); }
Mapper接口对应的映射文件, OrdersUserMapper.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="包.OrdersUserMapper"> <select id="findOrdersUser" resultType="包.OrdersUser"> SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER </select> </mapper>
(二) 使用resultMap实现
POJO类:直接在Orders.java类中添加User对象属性,比如:
Orders.java:
private Integer id; private String orderName; private Date createTime; private User user; // 这里直接引入User对象属性 加上 getter/setter 方法
Mapper接口, OrdersUserMapper.xml:
public interface OrdersUserMapper { List<Orders> findOrdersUser() throws Exception(); }
Mapper映射文件(要和Mapper接口同名且在同一个目录下),OrdersUserMapper.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="包.OrdersUserMapper"> <resultMap id="findOrdersUserResultMap" type="包.Orders"> <!-- 映射的Orders类的属性 --> <id column="id" property="id"/><!-- USER表字段列的唯一标识 --> <result column="order_name" property="orderName"/> <result column="create_time" property="createTime"/> <!-- 关联映射的User类的属性 --> <association property="user" javaType="包.User"> <id column="id" /><!-- orders表字段列的唯一标识 --> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> </resultMap> <select id="findOrdersUser" resultMap="findOrdersUserResultMap"> SELECT orders.* USER.username, USER.sex, USER.address FROM orders, USER </select> </mapper>
------------<完>---------------------------------------------------------------------------------
以上是一对一, 下面是一对多的关联关系的映射
需求:查询订单关联查询订单明细的信息
分析:有两张表,订单表orders表和订单明细表ordersdetail
关系:一个订单对应多个订单明细, 从订单到订单明细是一对多的关联关系
用户表和订单表有关系, 订单表和订单明细表有关系, 订单表是中间表
做法:在以上一对一的基础上添加订单明细的映射即可
sql:
SELECT orders.* USER.username, USER.sex, USER.address, orderdetail.items_id, orderdetail.items_num FROM orders, USER ordersdetail WHERE orders.user_id=user.id AND orderdetail.orders_id=orders.id
在Orders.java中添加List<OrderDetail> orderDetails
接下的做法请参考:http://www.cnblogs.com/josephcnblog/articles/6442030.html