栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis查询方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis查询方法

问题一:为什么要使用嵌套连接

解析:

现在查询一个user的id查询出所有信息.如果不考虑关联查询,我们会先根据user的id在user表中查询出name,age然后设置给User类的时候,再根据该user的id在user_orders表中查询出所有订单并设置给User类。这样的话,在底层最起码调用两次查询语句,得到需要的信息,然后再组装User对象。

这种关联的嵌套查询,有一个非常好的作用就是:可以重用select语句,通过简单的select语句之间的组合来构造复杂的对象。想如上的两个select完全可以独立使用。
问题二 :多表查询的理解
1、单表查询更利于后续的维护。

在实际开发场景中,在代码初步开发阶段(如果摊上一个不太靠谱的产品),业务发生变动,某张表的结构发生变动,很可能整个join查询都变得不可用,复杂的关联查询,在修改时,基本等于推倒重来。

但是如果我们使用了单表查询,拆成上诉例子中的三个步骤,我们可能只需要修改其中的一个步骤即可,比较利于维护。

2、代码可复用性高

这个不用多说,join联表的SQL,基本不太可能被复用,但是拆分后的单表查询,比如上面例子中,我查询出tab数据,任何地方组装需要tab数据,我都不需要再次做相关查询,直接使用。

3、效率问题

join联表查询,小表驱动大表,通过索引字段进行关联。如果表记录比较少的话,效率还是OK的,有时效率超过单表查询。但是如果数据量上去,多表查询是笛卡尔乘积方式,需要检索的数据是几何倍上升的。另外多表查询索引设计上也考验开发者的功底,索引设计不合理,大数据量下的多表查询,很可能把数据库拖垮。

相比而言,拆分成单表查询+代码上组装,业务逻辑更清晰,优化更方便,单个表的索引设计上也更简单。用多几行代码,多几次数据库查询换取这些优点,还是很值得的。

4、减少冗余字段的查询

在很多业务中,我们可能对某条记录只需要查询一次,此时如何使用关联查询,则不可避免的需要重复地访问一部分数据,从而可能会加剧网络和内存的消耗。

5、缓存利用率更高

比如上面查询中的tag是不常变动的数据,缓存下来,每次查询就可以跳过第一条查询语句。而关联查询,任何一张表的数据变动都会引起缓存结果的失效,缓存利用率不会很高。

6、其他

数据库资源比较宝贵,很多系统的瓶颈就在数据库上,很多复杂的逻辑我们在Service做,不在数据库处理会更好。

在后续数据量上去,需要分库分表时,Join查询更不利于分库分表,目前MySQL的分布式中间件,跨库join表现不良。

单表查询+代码上组装相当于解耦,现在开发中,我们常常使用各种ORM框架,不知道你的联查orm给你搞成了什么样,你是很难直接优化。

以上理由,强烈推荐在今后的开发中,尽可能的使用单表查询+代码上组装的方式。


问题三:为什么mysql不建议执行超过3表以上的多表关联查询
https://cloud.tencent.com/developer/article/1443320

1.多表关联查询效率高点还是多次单表查询效率高
2.对关联查询进行分解
一:先配置全局关联 mybatis-config.xml
 
    
      
        
    
1. -一对一查询

UserMapper.java

 List selectAllUser ();

UserMapper.xml

    
    
        
        
        
        
        

        
            
            
            
        
    


    
        select u.*, o.*
        from user u,
             `order` o
        where u.id = o.uid
    

Test类

 
    @Test
    public  void  showInfo03() throws  IOException{
        UserMapper userMapper = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        List userList = userMapper.selectUserOrderList();
        for (User u: userList){
            System.out.println(u);
        }
    }
3.嵌套一对一

UserMapper.java

List selectQianOneToOne();

CardMapper.java

List selectCard (Integer uid);

UserMapper.xml

   

    

    
        
        
        
        
        
        
    

    
        select * from card where uid= #{uid};
    

Test类

  @Test
    public   void  showInfo08() throws IOException {
        UserMapper userMapper  = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        List userList = userMapper.selectQianOneToOne();
        for (User u : userList){
            System.out.println(u);
        }
    }

4.嵌套一对多查询

UserMapper.java

List selectQianOneToMany();

OrderMapper.java

List selectOrder(Integer uid);

UserMapper.xml

    
    
        
        
        
        
        
        
    

    
        select * from `order` where uid=#{uid}
    

Test类

    @Test
    public  void  showInfo09() throws IOException{
        OrderMapper orderMapper = (OrderMapper) MyBatisUtils.getMapper(OrderMapper.class);
        List orderList = orderMapper.selectOrder(45);
        for (Order a: orderList) {
            System.out.println(a);
        }
    }
5.关系总结 5.1 < if >

UserMapper.java

    List selectByNameAndSex(@Param("username") String username, @Param("sex") String sex);

UserMapper.xml


        select *
        from user
        
            
                
                    and username = #{username}
                

                
                    and sex = #{sex}
                
                
                    1=1
                
            
        
    

Test类

@Test
    public   void  showInfo11() throws IOException {
        UserMapper userMapper  = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        List userList = userMapper.selectBySex("小二王","女");
        for (User u :userList) {
            System.out.println(u);
        }
    }
5.3 choose

UserMapper.java

    List selectBySex(@Param("username") String username, @Param("sex") String sex);

UserMapper.xml


    
            select  * from  user
            where id in
            
                #{itemk}
            
        

Test类

 @Test
    public   void  showInfo16() throws IOException {
        UserMapper userMapper  = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        Map map = new HashMap();
        List li = new ArrayList();
        li.add(41);
        li.add(42);
        li.add(43);
        map.put("ids",li);
        List userList = userMapper.selectByArrayMap(map);
        for (User u :userList) {
            System.out.println(u);
        }
    }
5.7 < foreach >** 的批量增加

UserMapper.java

 
 int  addUser(List userList);

UserMapper.xml

		
        
            insert into `user` (username, birthday, sex, address) values
            
                (#{u.username}, #{u.birthday}, #{u.sex}, #{u.address})
            
        

Test类

 @Test
    public   void  showInfo17() throws IOException {
        UserMapper userMapper  = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        List userList = new ArrayList();
        User u1 = new User();
        u1.setUsername("ll");
        u1.setAddress("kk");
        u1.setBirthday(new Date());
        u1.setSex("男");

        User u2 = new User();
        u2.setUsername("ll");
        u2.setAddress("kk");
        u2.setBirthday(new Date());
        u2.setSex("男");
        userList.add(u1);
        userList.add(u2);
        int num = userMapper.addUser(userList);
        System.out.println(num);
        MyBatisUtils.commit();
    }
5.8 < foreach >** 的批量删除

UserMapper.java

   
    int deleteByUid(List list);

UserMapper.xml

 
        
            delete
            from `user`  where
            
                #{ik}
            
        

Test类

  @Test
    public   void  showInfo18() throws IOException {
        UserMapper userMapper  = (UserMapper) MyBatisUtils.getMapper(UserMapper.class);
        List li = new ArrayList();
        li.add(41);
        li.add(42);
        li.add(43);
        int num = userMapper.deleteByUid(li);
        System.out.println(num);
        MyBatisUtils.commit();
    }
5.9分页查询 5.9.1 引入依赖

pom.xml中引入PageHelper依赖。


		com.github.pagehelper
		pagehelper
		5.1.10

5.9.2 配置MyBatis-config.xml

在MyBatis-config.xml中添加< plugins >。


  	
  
    
        
        
    
  
  	...

5.9.3PageInfo对象

PageInfo对象中包含了分页操作中的所有相关数据。

5.9.4 注意事项
  • 只有在PageHelper.startPage()方法之后的第一个查询会有执行分页。
  • 分页插件不支持带有“for update”的查询语句。
  • 分页插件不支持“嵌套查询”,由于嵌套结果方式会导致结果集被折叠,所以无法保证分页结果数量正确。。
5.9.5 分页练习

UserMapper.java

   
    List selectPageList();	

UserMapper.xml


    
         select * from user
    
    
    
    1. //fetchType="lazy" 加开启懒加载

OrderMapper.xml


        select * from user 
    

CardMapper.xml

  
	SELECT * FROM t_users 
    WHERe name = '${name}' or id = ${id} 


	SELECT * FROM t_user
  	WHERe name = '${name}' 

注入攻击,拼接的内容,改变了原sql语义,被攻击!

ps:数据库表



;

;

;
;
;
;
CREATE DATABASE `mybatis-one` ;

USE `mybatis-one`;



DROP TABLE IF EXISTS `actor`;

CREATE TABLE `actor` (
  `aid` int(11) NOT NULL AUTO_INCREMENT,
  `aname` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL,
  PRIMARY KEY (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



insert  into `actor`(`aid`,`aname`) values (1,'杨幂'),(2,'杨颖');



DROP TABLE IF EXISTS `card`;

CREATE TABLE `card` (
  `cid` int(4) NOT NULL AUTO_INCREMENT,
  `cnumid` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL,
  `uid` int(4) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



insert  into `card`(`cid`,`cnumid`,`uid`) values (1,'1234',45),(2,'6789',46);



DROP TABLE IF EXISTS `order`;

CREATE TABLE `order` (
  `oid` int(11) NOT NULL AUTO_INCREMENT,
  `oname` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL,
  `onum` int(11) DEFAULT NULL,
  `uid` int(11) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



insert  into `order`(`oid`,`oname`,`onum`,`uid`) values (1,'坚果',20,45),(2,'书籍',30,46),(3,'衣服',1,45);



DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (
  `rid` int(11) NOT NULL AUTO_INCREMENT,
  `rname` varchar(20) COLLATE utf8_czech_ci DEFAULT NULL,
  PRIMARY KEY (`rid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



insert  into `role`(`rid`,`rname`) values (1,'宫女'),(2,'皇后'),(3,'太监');



DROP TABLE IF EXISTS `u_r`;

CREATE TABLE `u_r` (
  `u_r_id` int(11) NOT NULL AUTO_INCREMENT,
  `aid` int(11) DEFAULT NULL,
  `rid` int(11) DEFAULT NULL,
  PRIMARY KEY (`u_r_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



insert  into `u_r`(`u_r_id`,`aid`,`rid`) values (1,1,1),(2,1,2);



DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;



insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'李东','2020-08-25 20:44:41','男','hh'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'小黑','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(76,'dfff','2020-08-22 21:23:26','男','ddd');

;
;
;
;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992991.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号