mybatis:多表操作
1. 一对一查询
-
关键:如何在mapper中定义一个对象的映射
-
解决:resultMap(+association)
-
实体:
order.class
public class Order {
private int id;
private Date ordertime;
private double total;
private User user; ♥
} -
模型:
-
查询数据库语句:select *,o.oid oid from orders o,user u where o.oid=u.uid
-
mapper文件中:
1. 错误示范(因为查询到的结果无法自动填充到order的成员变量User中)
<select id="findAll" resultType="order">
SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id
</select>
2. 正确示范(添加resultMap)
<!--1.resultMap标签:
id:方便select标签引用
type:要封装的java对象,即order的路径
-->
<resultMap id="orderMap" type="order">
<!--2.手动指定字段与实体属性的映射关系:
标签: 主键有id标签,其它字段用result标签
属性: column: 数据表的字段名称
property:实体的属性名称
-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
<!--法一:直接法,user.属性-->
<result column="uid" property="user.id"></result>
<result column="username" property="user.username"></result>
<result column="password" property="user.password"></result>
<result column="birthday" property="user.birthday"></result>
<!--法二:为user添加一个association
property: 当前实体(order)中的属性名称(private User user)
javaType: 当前实体(order)中的属性的类型(User)
-->
<association property="user" javaType="user">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<select id="findAll" resultMap="orderMap">
SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id
</select>
2. 一对多查询
- 关键:如何在mapper中定义一个对象集合的映射
- 解决:resultMap+collection
- 模型:查询一个用户,与此同时查询出该用户具有的订单。一个用户的多个订单
- 实体:
User:
private int id;
private String username;
private String password;
private Date birthday;
//描述的是当前用户存在哪些订单
private List orderList;♥
} - mapper定义
- collection标签:配置集合信息
- property:集合名称
- ofType:当前集合中的数据类型
- collection标签:配置集合信息
<resultMap id="userMap" type="user">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!--配置集合信息
property:集合名称
ofType:当前集合中的数据类型
-->
<collection property="orderList" ofType="order">
<!--封装order的数据-->
<id column="oid" property="id"></id>
<result column="ordertime" property="ordertime"></result>
<result column="total" property="total"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="userMap">
SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
</select>
3. 多对多查询(三个表)
-
关键:如何在mapper中定义一个对象集合的映射,涉及三个表
-
解决:resultMap+collection
-
模型:用户表和角色表关系为:一个用户有多个角色,一个角色被多个人使用。查询用户,与此同时查询出该用户的所有角色。三表查询
-
实体:
Role:
private int id;
private String roleName;
private String roleDesc;User:
private int id;
private String username;
private String password;
private Date birthday;
//描述的是当前用户具备哪些角色
private List(Role) roleList; -
sql语句:
SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id -
mapper定义
<resultMap id="userRoleMap" type="user">
<!--user的信息-->
<id column="userId" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<!--user内部的roleList信息-->
<collection property="roleList" ofType="role">
<id column="roleId" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
</resultMap>
<select id="findUserAndRoleAll" resultMap="userRoleMap">
SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id
</select>
mybatis:注解开发
1. 常用注解
注解名称 | 作用 |
---|---|
@Insert | 增 |
@Upadte | 改 |
@Delete | 删 |
@Select | 查 |
@Result | 实现结果集封装 |
@Results | 封装多个结果集 |
@One | 一对一结果集封装 |
@Many | 一对多结果集封装 |
2. 开发步骤
- 在核心文件SqlMapConfig.xml中加载映射关系
(之前xml方式是加载映射文件UserMapper.xml)
-
在UserMapper接口中的方法上添加注解
- 简单增删改查
- 复杂查询
1).自定义为Order封装一个User对象
法一:
标明为主键:id=true法二:
其中one = @One(…)中的为已经实现的操作
findById:要传参数2).自定义为User封装一个List(Order)集合find
3).多对多查询(三表的一对多)
- 简单增删改查