MyBatis多表查询和注解开发
作者:mmseoamin日期:2023-12-20

文章目录

  • Mybatis多表查询
    • 一对一查询
      • 一对一查询的模型
      • 一对一查询的语句
      • 创建Order和User实体
      • 创建OrderMapper接口
      • 配置OrderMapper.xml
      • 测试结果
      • 一对多查询
        • 一对多查询的模型
        • 一对多查询的语句
        • 修改User实体
        • 创建UserMapper接口
        • 配置UserMapper.xml
        • 测试结果
        • 多对多查询
          • 多对多查询的模型
          • 多对多查询的语句
          • 创建Role实体,修改User实体
          • 添加UserMapper接口方法
          • 配置UserMapper.xml
          • 测试结果
          • Mybatis的注解开发
            • MyBatis的常用注解
            • MyBatis的增删改查
            • MyBatis的注解实现复杂映射开发
            • 一对一查询
              • 一对一查询的模型
              • 一对一查询的语句
              • 创建Order和User实体
              • 创建OrderMapper接口
              • 使用注解配置Mapper
              • 测试结果
              • 一对多查询
                • 一对多查询的模型
                • 一对多查询的语句
                • 修改User实体
                • 创建UserMapper接口
                • 使用注解配置Mapper
                • 测试结果
                • 多对多查询
                  • 多对多查询的模型
                  • 多对多查询的语句
                  • 创建Role实体,修改User实体
                  • 添加UserMapper接口方法
                  • 使用注解配置Mapper
                  • 测试结果

                    Mybatis多表查询

                    一对一查询

                    一对一查询的模型

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

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

                    MyBatis多表查询和注解开发,在这里插入图片描述,第1张

                    一对一查询的语句

                    对应的sql语句:

                    SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id;
                    

                    查询的结果如下:

                    MyBatis多表查询和注解开发,在这里插入图片描述,第2张

                    创建Order和User实体

                    public class Order {
                        private int id;
                        private Date ordertime;
                        private double total;
                        //代表当前订单从属于哪一个客户
                        private User user;
                    }
                    public class User {
                        
                        private int id;
                        private String username;
                        private String password;
                        private Date birthday;
                    }
                    

                    创建OrderMapper接口

                    public interface OrderMapper {
                        List findAll();
                    }
                    

                    配置OrderMapper.xml

                    
                        
                            
                            
                            
                            
                        
                        
                    
                    

                    其中还可以配置如下:

                    
                        
                        
                        
                        
                            
                            
                            
                            
                        
                    
                    

                    测试结果

                    OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
                    List all = mapper.findAll();
                    for(Order order : all){
                        System.out.println(order);
                    }
                    

                    输出:

                    MyBatis多表查询和注解开发,在这里插入图片描述,第3张

                    一对多查询

                    一对多查询的模型

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

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

                    MyBatis多表查询和注解开发,在这里插入图片描述,第4张

                    一对多查询的语句

                    对应的sql语句:

                    select *,o.id oid from user u left join orders o on u.id=o.uid;
                    

                    查询的结果如下:

                    MyBatis多表查询和注解开发,在这里插入图片描述,第5张

                    修改User实体

                    public class Order {
                        private int id;
                        private Date ordertime;
                        private double total;
                        //代表当前订单从属于哪一个客户
                        private User user;
                    }
                    public class User {
                        
                        private int id;
                        private String username;
                        private String password;
                        private Date birthday;
                        //代表当前用户具备哪些订单
                        private List orderList;
                    }
                    

                    创建UserMapper接口

                    public interface UserMapper {
                        List findAll();
                    }
                    

                    配置UserMapper.xml

                    
                        
                            
                            
                            
                            
                            
                                
                                
                                
                            
                        
                        
                    
                    

                    测试结果

                    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                    List all = mapper.findAll();
                    for(User user : all){
                        System.out.println(user.getUsername());
                        List orderList = user.getOrderList();
                        for(Order order : orderList){
                            System.out.println(order);
                        }
                        System.out.println("----------------------------------");
                    }
                    

                    输出:

                    15:00:24,330 DEBUG findAll:159 - ==>  Preparing: select u.id uid,u.username ,o.id oid,o.ordertime,o.total from user u left join orders o on u.id=o.uid 
                    15:00:24,360 DEBUG findAll:159 - ==> Parameters: 
                    15:00:24,393 DEBUG findAll:159 - <==      Total: 5
                    User{id=1, username='admin', password='null', birthday=null, roleList=null, orderList=[Order{id=1, ordertime=Sun Apr 16 14:23:50 CST 2023, total=2000.0, user=null}]}
                    User{id=2, username='共饮一杯无666', password='null', birthday=null, roleList=null, orderList=[Order{id=2, ordertime=Sun Apr 16 14:23:50 CST 2023, total=8888.0, user=null}]}
                    User{id=3, username='共饮一杯无', password='null', birthday=null, roleList=null, orderList=[Order{id=3, ordertime=Sun Apr 16 14:23:50 CST 2023, total=3699.0, user=null}]}
                    User{id=4, username='共饮一杯无', password='null', birthday=null, roleList=null, orderList=[]}
                    User{id=5, username='共饮一杯无', password='null', birthday=null, roleList=null, orderList=[]}
                    

                    多对多查询

                    多对多查询的模型

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

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

                    MyBatis多表查询和注解开发,在这里插入图片描述,第6张

                    多对多查询的语句

                    对应的sql语句:

                    select u.*,r.*,r.id rid from user u left join sys_user_role ur on u.id=ur.userid
                    inner join sys_role r on ur.roleid=r.id;
                    

                    查询的结果如下:

                    MyBatis多表查询和注解开发,在这里插入图片描述,第7张

                    创建Role实体,修改User实体

                    public class User {
                        private int id;
                        private String username;
                        private String password;
                        private Date birthday;
                        //代表当前用户具备哪些订单
                        private List orderList;
                        //代表当前用户具备哪些角色
                        private List roleList;
                    }
                    public class Role {
                        private int id;
                        private String rolename;
                    }
                    

                    添加UserMapper接口方法

                    List findAllUserAndRole();
                    

                    配置UserMapper.xml

                    
                        
                        
                        
                        
                        
                            
                            
                        
                    
                    
                    

                    测试结果

                    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                    List all = mapper.findAllUserAndRole();
                    for(User user : all){
                        System.out.println(user.getUsername());
                        List roleList = user.getRoleList();
                        for(Role role : roleList){
                            System.out.println(role);
                        }
                        System.out.println("----------------------------------");
                    }
                    
                    11:45:51,443 DEBUG findUserAndRoleAll:159 - ==>  Preparing: SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id 
                    11:45:51,572 DEBUG findUserAndRoleAll:159 - ==> Parameters: 
                    User{id=1, username='zjq', password='abc', birthday=Wed Jul 28 00:00:00 GMT+08:00 2021, roleList=[Role{id=1, roleName='CTO', roleDesc='CTO'}, Role{id=2, roleName='COO', roleDesc='COO'}]}
                    User{id=2, username='jack', password='123456', birthday=Fri Aug 20 00:00:00 GMT+08:00 2021, roleList=[Role{id=1, roleName='CTO', roleDesc='CTO'}, Role{id=2, roleName='COO', roleDesc='COO'}]}
                    11:45:51,610 DEBUG findUserAndRoleAll:159 - <==      Total: 4
                    11:45:51,618 DEBUG JdbcTransaction:123 - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6ec8211c]
                    11:45:51,619 DEBUG JdbcTransaction:91 - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6ec8211c]
                    11:45:51,619 DEBUG PooledDataSource:363 - Returned connection 1858609436 to pool.
                    

                    Mybatis的注解开发

                    MyBatis的常用注解

                    这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper

                    映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。

                    • @Insert:实现新增

                    • @Update:实现更新

                    • @Delete:实现删除

                    • @Select:实现查询

                    • @Result:实现结果集封装

                    • @Results:可以与@Result 一起使用,封装多个结果集

                    • @One:实现一对一结果集封装

                    • @Many:实现一对多结果集封装

                      MyBatis的增删改查

                      我们完成简单的user表的增删改查的操作

                      private UserMapper userMapper;
                      @Before
                      public void before() throws IOException {
                          InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
                          SqlSessionFactory sqlSessionFactory = new 
                                       SqlSessionFactoryBuilder().build(resourceAsStream);
                          SqlSession sqlSession = sqlSessionFactory.openSession(true);
                          userMapper = sqlSession.getMapper(UserMapper.class);
                      }
                      @Test
                      public void testAdd() {
                          User user = new User();
                          user.setUsername("测试数据");
                          user.setPassword("123");
                          user.setBirthday(new Date());
                          userMapper.add(user);
                      }
                      @Test
                      public void testUpdate() throws IOException {
                          User user = new User();
                          user.setId(16);
                          user.setUsername("测试数据修改");
                          user.setPassword("abc");
                          user.setBirthday(new Date());
                          userMapper.update(user);
                      }
                      @Test
                      public void testDelete() throws IOException {
                          userMapper.delete(16);
                      }
                      @Test
                      public void testFindById() throws IOException {
                          User user = userMapper.findById(1);
                          System.out.println(user);
                      }
                      @Test
                      public void testFindAll() throws IOException {
                          List all = userMapper.findAll();
                          for(User user : all){
                              System.out.println(user);
                          }
                      }
                      

                      修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可

                      
                          
                          
                      
                      

                      或者指定扫描包含映射关系的接口所在的包也可以

                      
                          
                          
                      
                      

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

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

                      MyBatis多表查询和注解开发,在这里插入图片描述,第8张

                      MyBatis多表查询和注解开发,在这里插入图片描述,第9张

                      一对一查询

                      一对一查询的模型

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

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

                      MyBatis多表查询和注解开发,在这里插入图片描述,第10张

                      一对一查询的语句

                      对应的sql语句:

                      select * from orders;
                      select * from user where id=查询出订单的uid;
                      

                      创建Order和User实体

                      public class Order {
                          private int id;
                          private Date ordertime;
                          private double total;
                          //代表当前订单从属于哪一个客户
                          private User user;
                      }
                      public class User {
                          
                          private int id;
                          private String username;
                          private String password;
                          private Date birthday;
                      }
                      

                      创建OrderMapper接口

                      public interface OrderMapper {
                          List findAll();
                      }
                      

                      使用注解配置Mapper

                      public interface OrderMapper {
                          @Select("select * from orders")
                          @Results({
                                  @Result(id=true,property = "id",column = "id"),
                                  @Result(property = "ordertime",column = "ordertime"),
                                  @Result(property = "total",column = "total"),
                                  @Result(property = "user",column = "uid",
                                          javaType = User.class,
                                          one = @One(select = "com.zjq.mapper.UserMapper.findById"))
                          })
                          List findAll();
                      }
                      
                      public interface UserMapper {
                          @Select("select * from user where id=#{id}")
                          User findById(int id);
                          
                      }
                      

                      测试结果

                      @Test
                      public void testSelectOrderAndUser() {
                          List all = orderMapper.findAll();
                          for(Order order : all){
                              System.out.println(order);
                          }
                      }
                      

                      一对多查询

                      一对多查询的模型

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

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

                      MyBatis多表查询和注解开发,在这里插入图片描述,第11张

                      一对多查询的语句

                      对应的sql语句:

                      select * from user;
                      select * from orders where uid=查询出用户的id;
                      

                      修改User实体

                      public class Order {
                          private int id;
                          private Date ordertime;
                          private double total;
                          //代表当前订单从属于哪一个客户
                          private User user;
                      }
                      public class User {
                          
                          private int id;
                          private String username;
                          private String password;
                          private Date birthday;
                          //代表当前用户具备哪些订单
                          private List orderList;
                      }
                      

                      创建UserMapper接口

                      List findAllUserAndOrder();
                      

                      使用注解配置Mapper

                      public interface UserMapper {
                          @Select("select * from user")
                          @Results({
                                  @Result(id = true,property = "id",column = "id"),
                                  @Result(property = "username",column = "username"),
                                  @Result(property = "password",column = "password"),
                                  @Result(property = "birthday",column = "birthday"),
                                  @Result(property = "orderList",column = "id",
                                          javaType = List.class,
                                          many = @Many(select = "com.zjq.mapper.OrderMapper.findByUid"))
                          })
                          List findAllUserAndOrder();
                      }
                      public interface OrderMapper {
                          @Select("select * from orders where uid=#{uid}")
                          List findByUid(int uid);
                      }
                      

                      测试结果

                      List all = userMapper.findAllUserAndOrder();
                      for(User user : all){
                          System.out.println(user.getUsername());
                          List orderList = user.getOrderList();
                          for(Order order : orderList){
                              System.out.println(order);
                          }
                          System.out.println("-----------------------------");
                      }
                      

                      多对多查询

                      多对多查询的模型

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

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

                      MyBatis多表查询和注解开发,图片18.png,第12张

                      多对多查询的语句

                      对应的sql语句:

                      select * from user;
                      select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id
                      

                      创建Role实体,修改User实体

                      public class User {
                          private int id;
                          private String username;
                          private String password;
                          private Date birthday;
                          //代表当前用户具备哪些订单
                          private List orderList;
                          //代表当前用户具备哪些角色
                          private List roleList;
                      }
                      public class Role {
                          private int id;
                          private String rolename;
                      }
                      

                      添加UserMapper接口方法

                      List findAllUserAndRole();
                      

                      使用注解配置Mapper

                      public interface UserMapper {
                          @Select("select * from user")
                          @Results({
                              @Result(id = true,property = "id",column = "id"),
                              @Result(property = "username",column = "username"),
                              @Result(property = "password",column = "password"),
                              @Result(property = "birthday",column = "birthday"),
                              @Result(property = "roleList",column = "id",
                                      javaType = List.class,
                                      many = @Many(select = "com.zjq.mapper.RoleMapper.findByUid"))
                      })
                      List findAllUserAndRole();}
                      public interface RoleMapper {
                          @Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")
                          List findByUid(int uid);
                      }
                      

                      测试结果

                      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                      List all = mapper.findAllUserAndRole();
                      for(User user : all){
                          System.out.println(user.getUsername());
                          List roleList = user.getRoleList();
                          for(Role role : roleList){
                              System.out.println(role);
                          }
                          System.out.println("----------------------------------");
                      }
                      

                      本文内容到此结束了,

                      如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

                      如有错误❌疑问💬欢迎各位指出。

                      主页:共饮一杯无的博客汇总👨‍💻

                      保持热爱,奔赴下一场山海。🏃🏃🏃