Mybatis -- MyBatis的注解实现复杂映射开发
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis -- MyBatis的注解实现复杂映射开发相关的知识,希望对你有一定的参考价值。
1. MyBatis的注解实现复杂映射开发
Mybatis – Mybatis多表查询:一对一(resultmap、association匹配)、一对多(collection集合)、多对多(中间表)
1.1 一对一查询
一对一查询的模型:
一对一查询的语句:
对应的sql语句: select * from orders o,user u where o.uid=u.id;
查询的结果如下:
创建Order和User实体:
创建OrderMapper接口:
配置OrderMapper.xml:
方式一:手动指定字段与实体属性的映射关系
- column:数据表的字段名称
- property:实体的属性名称
@Select("select *,o.id oid from orders o,user u where o.uid=u.id")
@Results({
@Result(column = "oid", property = "id"),
@Result(column = "ordertime", property = "ordertime"),
@Result(column = "total", property = "total"),
// 直接通过 user.属性 的方式去给user注入值
@Result(column = "uid", property = "user.id"),
@Result(column = "username", property = "user.username"),
@Result(column = "password", property = "user.password")
})
public List<Order> findAll();
方式二:@One注解配置
@Select("select * from orders")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "ordertime", property = "ordertime"),
@Result(column = "total", property = "total"),
@Result(
property = "user", //要封装的属性名称
column = "uid", //根据哪个字段去查询user表的数据
javaType = User.class, //要封装的实体类型
//@One里面方法的返回值有多个
//select属性 代表查询那个接口的方法获得数据
one = @One(select = "com.itheima.mapper.UserMapper.findById")
)
})
public List<Order> findAll();
测试:
1.2 一对多查询
1.2.1 一对多查询的模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。
一对多查询的需求:
查询一个用户,与此同时查询出该用户具有的订单。
1.2.2 一对多查询的语句
对应的sql语句: select * from orders o,user u where o.uid=u.id;
查询的结果如下:
1.2.3 修改User实体
1.2.4 创建UserMapper接口
1.2.5 使用注解配置Mapper
@Select("select * from user")
@Results({
// id= true 代表当前的字段是user表的主键
@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "password", property = "password"),
@Result(
//要封装的属性名称
property = "orderList",
// 根据哪个字段去查询order表的数据
column = "id",
//要封装的实体类型
javaType = List.class,
// @Many里面方法的返回值是有多个
//select属性 代表查询那个接口的方法获得数据
many = @Many(select = "com.itheima.mapper.OrderMapper.findByUid")
)
})
public List<User> findUserAndOrderAll();
1.2.6 测试
1.3 多对多查询(多对多和一对多类似,只是多了一张中间表)
1.3.1 多对多查询的模型
用户表和角色表的关系为:一个用户有多个角色,一个角色被多个用户使用。
多对多查询的需求:
查询用户同时查询出该用户的所有角色
1.3.2 多对多查询的语句
对应的sql语句:
SELECT *
FROM USER u,
user_role ur,
role r
WHERE u.id = ur.userId
AND ur.roleId = r.id
查询的结果如下:
1.3.3 创建Role实体,修改User实体
1.3.4 添加UserMapper接口方法
1.3.5 使用注解配置Mapper
@Select("SELECT * FROM USER")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "password", property = "password"),
@Result(
//要封装的属性名称
property = "roleList",
// 根据哪个字段去查询role表的数据
column = "id",
//要封装的实体类型
javaType = List.class,
// @Many里面方法的返回值是有多个
//select属性 代表查询那个接口的方法获得数据
many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid")
)
})
1.3.6 测试结果
2. 补充:@ResultMap
@ResultMap可以引用定义好的ResultMap,实现代码的复用。
以上是关于Mybatis -- MyBatis的注解实现复杂映射开发的主要内容,如果未能解决你的问题,请参考以下文章