IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 15.使用MyBatis注解实现复杂映射查询数据 -> 正文阅读

[Java知识库]15.使用MyBatis注解实现复杂映射查询数据

15.使用注解实现复杂映射查询数据

1.使用注解实现复杂映射开发

  • 之前我们在映射文件中通过配置 、、 来实现复杂关系映射。

  • 使用注解开发后,我们可以使用 @Results、@Result,@One、@Many 注解组合完成复杂关系的配置。

  • 下图为注解重点,请记住:

    image-20220224211625626

1.1一对一查询—两表查询

  • 需求:查询一个订单,与此同时查询出该订单所属的用户

  • 一对一查询语句:

    //嵌套查询
    SELECT * FROM orders;
    SELECT * FROM `user` WHERE id = #{订单的uid};
    

1.1.1代码实现

(1)OrderMapper接口

  • @One代替了标签,使用时需要Result(one = @One(select = “namespace.id”) 表示。
  • javaType:表示返回的对象类型。
 /**
     * 一对一查询:
     * 查询订单所对应的用户
     */
    @Select(" select * from orders ")
    @Results({
            //id = true 表示该字段为主键 类似于 <id property="id" column="id"></id>
            @Result( id = true, property ="id", column = "id" ),
            @Result(  property ="id", column = "id" ),
            @Result(  property ="orderTime", column = "orderTime" ),
            @Result(  property ="total", column = "total" ),
            @Result(  property ="uid", column = "uid" ),
                //Result(one = @One(select = "namespace.id") 代替了<assocation>标签
                @Result(one = @One(select = "com.weihong.mapper.UserMapper.findUserById") ,property = "user" , javaType = com.weihong.domain.User.class , column = "uid")
    })
    List<Orders> findAllWithUser();
  • 上面语句等价于使用xml映射文件的sql,如下代码所示:
   <resultMap id="userOrdersMapper" type="orders">
        <id property="id" column="id"></id>
        <result property="orderTime" column="orderTime"></result>
        <result property="total" column="total"></result>
        <result property="uid" column="uid"></result>
        <association property="user" javaType="com.lagou.domain.User"         		 select="com.lagou.mapper.UserMapper.findUserOrderByNested" column="uid">
        </association>
    </resultMap>
    <select id="findUserOrders" resultMap="userOrdersMapper">
            select * from orders
    </select>

(2)UserMapper接口

   /**
     * 根据id找用户
     * @param id
     * @return
     */
    @Select(" select * from `user` where id = #{userId} ")
   User findUserById(@Param("userId") Integer id);

(3)测试代码

    @Test
    public void test2(){
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        List<Orders> orders = ordersMapper.findAllWithUser();
        for (Orders order : orders) {
            System.out.println(order);
        }
    }

(4)测试结果

image-20220224212414329

1.2一对多查询—》两表查询

  • 需求:查询一个用户,与此同时查询出该用户具有的订单
SELECT * FROM `user`;
SELECT * FROM orders where uid = #{用户id};

1.2.1代码实现

(1)UserMapper接口

特别注意:

  1. 此时查询为一对多查询,使用collection来关联查询,对应注解为@Many属性。
  2. 一个用户可能有多个订单,所以返回类型为List类型。javaType = List.class(这是与一对一查询不同的)
 /**
     * 查找用户所对应的订单:一对多
     * 一个用户对应多个订单
     * @return
     */
    @Select("select * from `user` ")
    @Results({
            @Result(id = true, property = "id" , column="id"),
            @Result(property = "birthday" , column = "birthday"),
            @Result(property = "sex" , column = "sex"),
            @Result(property = "address" , column = "address"),
                @Result(column = "id" ,many = @Many(select = "com.weihong.mapper.OrdersMapper.findByUid"), property = "ordersList" ,  javaType = List.class )
    })
    List<User> findAllWithOrder();

(2)OrderMapper接口

 /**
     * 根据用户id查找订单信息
     * @param uid
     * @return
     */
    @Select("select * from orders where uid = #{uid} ")
    List<Orders> findByUid(@Param("uid") Integer uid);

(3)测试类

 @Test
    public void test3(){
        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
        List<User> allUser = usermapper.findAllWithOrder();
        for (User user : allUser) {
            System.out.println(user);
        }
    }

(4)测试结果

image-20220226115753263

1.3多对多查询

  • 需求:查询所有用户,同时查询出该用户的所有角色

  • 多对多查询语句

    select * from sys_role r left join sys_user_role ur on r.id = ur.roleid where ur.userid in (
    select id from `user`
    )
    

1.3代码实现

(1)UserMapper接口

    /**
     * 查询用户所对应的角色信息:
     * 多对多查询:
     * 借用到关联表
     * 先查询用户表的用户id,后和角色信息表及中间表做关联查询
     */

    @Select("select * from `user` ")
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "birthday", column = "birthday"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "address", column = "address"),
              @Result(column = "id" , many = @Many ( select = "com.weihong.mapper.RoleMapper.getUserRoleInfo" , fetchType = FetchType.EAGER ) , property = "roleList" ,javaType = List.class)
    })
    List<User> findUserofRole();

(2)RoleMapper接口

    @Select(" select * from sys_role r left join sys_user_role ur on r.id = ur.roleid where ur.userid = #{id}")
    List<Role> getUserRoleInfo(Integer id);

(3)测试类

    @Test
    public void test4(){
        UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
        List<User> allUser = usermapper.findUserofRole();
        for (User user : allUser) {
            System.out.println(user);
        }
    }

(4)测试结果

image-20220226125450407

2.注解延迟加载

不管是一对一还是一对多 ,在注解配置中都有fetchType的属性

  • fetchType = FetchType.LAZY 表示懒加载
  • fetchType = FetchType.EAGER 表示立即加载
  • fetchType = FetchType.DEFAULT 表示使用全局配置

3.小结

  • 注解开发和xml配置优劣分析
    1.注解开发和xml配置相比,从开发效率来说,注解编写更简单,效率更高。
    2.从可维护性来说,注解如果要修改,必须修改源码,会导致维护成本增加。xml维护性更强。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:14:49  更:2022-02-28 15:17:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:04:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码