Mybatis -- MyBatis的注解实现复杂映射开发

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis -- MyBatis的注解实现复杂映射开发相关的知识,希望对你有一定的参考价值。

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的注解实现复杂映射开发的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis注解开发之多对多查询

MyBatis注解开发之一对一查询

MyBatis

MyBatis

Mybatis -- Mybatis注解开发:基本开发

MyBatis-09-笔记