当前位置: 首页 > news >正文

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

  

目录

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

 一对一注解查询

查询用户时也查询出订单信息

 另一种,分两次查询

 一对多注解查询

多对多查询


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

实现复杂关系映射之前哦我们可以在映射文件中通过配置<resultMap>来实现,使用注解来发后,我们可以使用@Results注解,@Result注解,@Many注解组合完成复杂关系的

 一对一注解查询

查询用户时也查询出订单信息

order类下

public class Order {

    private int id;
    private Date ordertime;
    private double total;

    //当前订单属于哪一个用户
    private User user;

//get和set、toString方式省略
}

User类下 

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
//get和set、toString方式省略
}

OrderMapper接口下

public interface OrderMapper {
    @Select("select *,o.id oid from orders o,user u where o.uid=u.id")
  //配置user的信息
    @Results({
            @Result(column = "oid",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(column = "uid",property = "user.id"),
            @Result(column = "username",property = "user.username"),
            @Result(column = "password",property = "user.password")
    })
public List<Order> findAll();
}

 测试类下



public class MybatisTest2 {

private OrderMapper oMapper;
//    提前运行,抽取出来
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

       oMapper = sqlSession.getMapper(OrderMapper.class);
    }

    @Test
    public void testAll(){
        List<Order> all = oMapper.findAll();
        for (Order order : all) {
            System.out.println(order);
        }

    }
}

运行结果 

 另一种,分两次查询

以下这种格式

 select *from orders
  select *from user where id=?

orderMapper接口中 


public interface OrderMapper {
   @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, //要封装的实体类型
                   //select属性 代表查询那个接口的方法获得数据
                   one = @One(select = "com_mybatis_ann.mapper.UserMapper.findById")//这个是UserMapper接口中的方法根据id查询
           )
   })
public List<Order> findAll();
}

运行结果也是一致的

 一对多注解查询

用户表和订单表的关系为,一个用户有多个订单,一个订单只属于一个用户

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

在userMapper接口下


    @Select("select *from user")
//给user封数据
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "username",property = "username"),
            @Result(column = "password",property = "password"),
//给order封数据
            @Result(
                    property = "orderList",
                    column = "id",
                    javaType = List.class,
                    //写对方的根据id查询的方法(先在orderMapper中写一个根据id查询的方法)
                    many = @Many(select = "com_mybatis_ann.mapper.OrderMapper.findById")
            )
    })
    public List<User> findUserAndOrderAll();

orderMapper加上


   @Select("select *from orders where uid=#{uid}")
public List<Order> findById(int id);

user实体类中加上order实体类的信息

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
private List<Order> orderList;
}

 test包下测试

public class MybatisTest {
    private UserMapper mapper;

//    提前运行,抽取出来
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void testById(){
        List<User> userAndOrderAll = mapper.findUserAndOrderAll();
        for (User user : userAndOrderAll) {
            System.out.println(user);
        }

    }
}

运行结果 

多对多查询

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

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

 新建一个Role实体类

public class Role {

    private int id;
    private String roleName;
    private String roleDesc;
//get、set、toString省略

}

User实体类下

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
private List<Role> roleList;
//get、set、toString省略
}

UserMapper接口下

    @Select("Select *from user")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "username",property = "username"),
            @Result(column = "password" ,property = "password"),
            @Result(
                    property = "roleList",
                    column = "id",
                    javaType = List.class,//对次方法的全限定名
                    many = @Many(select ="com_mybatis_ann.mapper.RoleMapper.findByUid" )
            )
    })
    public List<User> findUserAndRoleAll();

 RoleMapper接口下

public interface RoleMapper {
@Select("select *from sys_user_role ur,sys_role r where ur.roleId=r.id and ur.userId=#{uid}")
   public List<Role> findByUid(int uid);
}

 test类下的测试下

public class MybatisTest2 {

private OrderMapper oMapper;


    @Test
    public void testAll(){
        List<Order> all = oMapper.findAll();
        for (Order order : all) {
            System.out.println(order);
        }

    
}

运行结果

相关文章:

  • 【Games101 作业6 + 附加题】渲染兔子 BVH SAH 代码
  • 全球最强智算来了:12000000000000000000(别数了18个0)FLOPS!
  • 轻量级神经网络算法系列文章-ShuffleNet v2
  • 4-20mA 电压控制电流输出电路浅析
  • java+python+vue高校竞赛报名系统
  • 7 张图解 CrashLoopBackOff,如何发现问题并解决它?
  • 面试前“啃完”这份Java架构全栈知识点,金九银十过五关斩六将!
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第12章 Vue3.X新特性解析 12.1 Vue3.0 新特性
  • 深入Spring Boot :打包解决方案
  • SE38 SE10 程序/事务码修改日志报表/TR日志/请求号日志
  • CC2642打开例程
  • 【原创】ZLMediaKit学习(二):Android播流 - 大盘站
  • NGINX基础知识:从零开始配置高性能服务器
  • 华为od德科面试数据算法解析 2022-8-29 24按身高和体重排队
  • 确保企业物联网部署安全的5个基本步骤
  • @angular/forms 源码解析之双向绑定
  • eclipse的离线汉化
  • gf框架之分页模块(五) - 自定义分页
  • iOS小技巧之UIImagePickerController实现头像选择
  • JS 面试题总结
  • Redux 中间件分析
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue学习系列(二)vue-cli
  • 安装python包到指定虚拟环境
  • 初探 Vue 生命周期和钩子函数
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给第三方使用接口的 URL 签名实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何合理的规划jvm性能调优
  • 小程序 setData 学问多
  • 小程序开发中的那些坑
  • 优化 Vue 项目编译文件大小
  • 智能合约开发环境搭建及Hello World合约
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (三分钟)速览传统边缘检测算子
  • (十六)一篇文章学会Java的常用API
  • (一)Linux+Windows下安装ffmpeg
  • (一)Neo4j下载安装以及初次使用
  • (原)本想说脏话,奈何已放下
  • (正则)提取页面里的img标签
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Remoting学习笔记(三)信道