mybatis常用db操作实践总结

 

  • 利用mybatis-codegen插件生成实体类和mapper接口以及XML,推荐maven插件方式使用,可以在eclipse/intellij idea等ide上通用,记得安装插件
  • 单表查询使用Example来实现,但是没有提供api进行group by的操作,可以将in里的集合遍历分别取出填入进行查询,最后将结果拼接起来,这里只是取单表中每组第一条而已,其他api可自行查找,使用很简单,实例SQL及代码实现
    ​
    SELECT  id,xxx FROM `t_user` WHERE   cid IN (1,2,3,4,5,6,7) AND a = 1  AND b=0 GROUP BY id
    
    

     

List<User>userList=new ArrayList<>();
for (Integer id:ids) {
          Example example=new Example(User.class);//User实体类使用插件生成
           Example.Criteria criteria=example.createCriteria();
           criteria.andEqualTo("id",id)
                   .andEqualTo("a",1)
                   .andEqualTo("b",0);
           List<User> subList=UserMapper.selectByExample(example);//UserMapper接口使用插件生成
           //返回结果非空有元素再添加,利用短路与判断进行更严格判断同时避免空指针
           if(subList!=null&&!subList.isEmpty()){
              userList.add(subList.get(0));

           }
  • 实现通用查询工具类思路参考:本质就是包装Example,关键性变量有封装查询条件的Map<String,Object>,不允许size为0否则空指针异常、封装要查找字段的List<String>或者使用String不定参数,封装排序方式的List<String>或者使用String不定参数,也需要几个常用的静态变量如排序的ASC和DESC或者用来区别字段和条件的符号如"_",里面最关键的方法就是如何组装条件:获取map的所有key,遍历key,对key进行拆分,假设使用的区别字段和条件的符号是”_“,那么最后一个"_"索引后面的字符就是条件,为了提高可读性,使用常见的含义来进行定义,比如eq是等于,lt是小于,那么在Example里面对应的就是criteria.andEqualTo(property, value),这个value就是刚刚key的value,对于条件是大于小于的情况直接使用Integer转型,对于各种操作的选择区分,考虑使用switch,swith会生成一个跳转表(最底层是全部的值,从底层再往上的分层是为了提高查询速度的冗余值,查找速度的提高可以用二分查找算法来理解,都是通用不断缩短查找范围来提高查找速度,在数据结构上又和MySQL的B+树有异曲同工之妙)来对应实际分支地址,用空间换取时间,在分支较多的情况下,相较于if-else它可以直接定位到对应的操作条件,效率更高,最后,对于组件好条件、要查询的字段、定义好排序方式就可以返回example了

     

  • 多表查询,如左连接left join等,推荐还是在xml文件写sql,先使用mybatis-codegen插件生成实体类和mapper接口以及XML,然后自己在xml文件中补充SQL语句,如果找不到xml中SQL标签上id对应的方法,可以在yml文件中添加配置,注意yml文件格式相当严格,行间一个tab,冒号后的value和冒号距离一个空格,mybatis:mapper-locations: "xxx/mapper/*.xml",也或者如果找不到mapper可在接口里添加注解@Mapper

  • 分页查询

  1. XML方式
  2. Example方式
 //偏移量为0,即表示第一页,每页10条数据,或者是等于SQL语句中的limit 10,前十条数据
List<User> objs11= this.userMapper.selectByRowBounds(obj,new RowBounds(0,10));

 

List<User> objs12=userMapper.selectByExampleAndRowBounds(example,new RowBounds(0,10));
  • 补充:group by使用要谨慎,如果查询是每个分组的所有数据,需要再使用group_concat函数,如果只查询每组第一个,就不需要使用该函数了,默认使用逗号分隔,可修改分隔符号,下例每个id有多条记录,每条记录的xxx字段字段都不一致
    SELECT  id,GROUP_CONCAT(xxx) FROM `t_user` WHERE   cid IN (1,2,3,4,5,6,7) AND a = 1  AND b=0 GROUP BY id
  • 插入操作,insert、insertSelective:
  1. 如果是用前者 那么就会插入id值 这样以后插入的主键值自动增长就从那个最新插入的id开始;如果是后者就自动增长
  2. 使用insert时执行的sql语句为:insert into student(id,name,age) values (1,‘zhangsan’,null);而使用insertSelective时执行的sql语句为:insert into student(id,name) values (1,‘zhangsan’);

xxxMapper.insertSelective(xxx);
  • 补充:创建表时如果字段使用了关键字,那么在SQL中需要在该字段上加单引号是错误的,应该是制表符上面这个键的按键的符号,或者不需要这个字段直接使用类似以下这种方式来调用
Example entityExample = Example.builder(Entity.class)
                .select("askId","pass")//查询的字段
                .where(Sqls.custom().andEqualTo("anid", deleteAnid))//查询的条件
                .build();
  • 数据库出现编码问题,检查数据库编码,检查表编码,检查字段编码,修改字段编码SQL语句:
    alter table 表名 change 字段名 字段名 类型 character set utf8;
  • 自动生成代码工具使用时要注意一些数据类型是否被改变成了Boolean类型 ,是否需要修改为原类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值