一,商品订单数据模型
多角度看,一个订单可以关联一个一个用户,这是一对一。从用户角度的看,一个用户可以有多个订单,这是一对多关系。
二,一对一查询
查询所有订单信息,关联查询下单用户信息
1.方法一
使用resultType,定义订单信息pojo类,此pojo类中包括了订单信息和用户信息
1)定义一个pojo类:
public class OrdersUser {
private int id;
private int user_id;
private String number;
private Date createtime;
private String note;
private String username;
private Date birthday;
private String sex;
private String address;
//get/set方法。。。。
2)映射文件
<mapper namespace="com.djc.mybatis.mapper.OrdersMapper">
<select id="findOrdersUserList" resultType="ordersUser" >
SELECT o.*,u.username,u.birthday,u.sex,u.address FROM orders o LEFT JOIN USER u ON o.user_id = u.id
</select>
</mapper>
3)接口
public List<OrdersUser> findOrdersUserList();
4)测试
@Test
public void testFindOrdersUserList() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
List<OrdersUser> ordersUserList = mapper.findOrdersUserList();
System.out.println(ordersUserList);
sqlSession.close();
}
2.方法二
使用resultMap,定义专门的resultMap用于映射一对一查询结果。
1)定义一个订单pojo类
在Orders类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
public class Orders {
private int id;
private int user_id;
private String number;
private Date createtime;
private String note;
private User user;
//get/set方法。。。。
2)映射文件
<resultMap id="ordersResultMap" type="orders" >
<id column="id" property="id"/>
<result column="" property="user_id"/>
<result column="" property="number"/>
<result column="" property="createtime"/>
<result column="" property="note"/>
<!-- 构建一对一关系 -->
<association property="user" javaType="com.djc.mybatis.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersList" resultMap="ordersResultMap">
select o.*,u.username,u.birthday,u.sex,u.address FROM orders o LEFT JOIN USER u ON o.user_id = u.id
</select>
3)解释
association:表示进行关联查询单条记录
property:表示关联查询的结果存储在com.djc.mybatis.pojo.Orders的user属性中
javaType:表示关联查询的结果类型
< id property=“id” column=“user_id”/>:查询结果的user_id列对应关联对象的id属性,这里是< id />表示user_id是关联查询对象的唯一标识。
< result property=“username” column=“username”/>:查询结果的username列对应关联对象的username属性。
三,一对多查询
查询所有用户信息及关联的订单信息,用户信息和订单信息为一对多关系。
1)定义一个订单pojo类
在user类中加入一个属性
public class User implements Serializable {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
private List<Orders> orders;
//get/set方法。。。。
2)映射文件
<resultMap type="user" id="userResultMap">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<collection property="orders" ofType="orders">
<id column="oid" property="id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
</collection>
</resultMap>
<select id="findUserList" resultMap="userResultMap">
SELECT u.*,o.id oid,o.number,o.createtime,o.note FROM USER u LEFT JOIN orders o ON u.id = o.user_id
</select>
3)解释
collection:部分定义了用户关联的订单信息。表示关联查询结果集
property=“orders”:关联查询的结果集存储在User对象的上哪个属性。
ofType=“orders”:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
< id />及< result/>的意义同一对一查询。
来源:https://blog.csdn.net/weixin_42340305/article/details/101225250