zoukankan      html  css  js  c++  java
  • Mybatis-smart(Mybatis最终优化方案)

    Mybatis-smart:

      为干掉 if else 而生 ~!绝不改变mybatis!绝不混肴 sql 和 java 代码!绝不新增思想!绝不新增学习难度!

      绝对让你丢掉 mybatis代码生成器!绝对省略70%的mapper.xml配置,除了复杂的sql,连xml配置文件都不用!

      绝对不是mybatis-plus!绝对不是JPA!

    开始使用:

    1、spring框架,已经搭建好mybatis,这里只介绍spring-boot

    2、maven 引入:

    <!-- https://mvnrepository.com/artifact/com.github.ljinlin/mybatis-smart -->
    <dependency>
    <groupId>com.github.ljinlin</groupId>
    <artifactId>mybatis-smart</artifactId>
    <version>1.0.0-beta1</version>
    </dependency>

      3、yml配置

    #配置 sqlSessionFactory  和 需要扫描的实体类包
    mybatis-smart:
        tablePackages: 
            #  包名: sqlSessionFactory bean的name , mybatis的sqlSessionFactory默认bean的name就是“sqlSessionFactory”,所以可以省略不写,直接写"包名:"  
            com.ljinlin.admin.entity: sqlSessionFactory
            com.ljinlin.order.entity: sqlSessionFactory
         #其他写法,不同的包,不同的sqlSessionFactory,支持多数据源 #com.ljinlin.*.entity: #com.ljinlin.*.entity: readSqlSessionFactory
    #com.ljinlin.*.entity: writeSqlSessionFactory sqlPrint: isPrint: true #输出打印sql语句,看看sql语句你会非常了解mybatis-smart

    4、配置实体类:(这里是核心,给我们干掉了if else,干掉了xml)

    // 这些配置只对使用mybatis-smart有效,与自己写的mapper无关
    @SmartTable("sys_user")  // 这里是不是一看就懂,对应的表
    public class SysUser {
    
        //映射 id 列,isUpdate=false 就是不更新,即调用mybatis-smart的update方法时,该字段无论有值还是null、"",都不会更新该,但是可以作为where条件
        @SmartColumn(isUpdate = false) 
        protected String id;
        //映射 account 列,若要映射 user_id 列 则 value = "user_id"
        @SmartColumn(isUpdate = false)
        protected String account;
    // 表里有 type列时,则与之映射
    protected Integer type; //映射 nickname 列,updateValType = ObjTypeEnum.ALL,即该字段值是null、""也会更新,默认是值为null、"" 不会去更新。insertValtype同此 @SmartColumn(updateValType = ObjTypeEnum.ALL) protected String nickname; protected String pwd; //映射 update_user 列,isInsert = false 就是不新增,即调用mybatis-smart的insert方法时,该字段无论有值还是null、"",都不会新增 @SmartColumn(isInsert = false) protected String updateUser;

    // @SmartColumn 还有时间日期相关配置,dateFormart .... 今晚懒得写了,可以联系我
    // 省略get set ... }

      5、Mapper接口:继承SmartMapper

    public interface SysUserMapper extends SmartMapper<SysUser> {
    
    }

        Service:

    @Service
    public class SysUserService {
    
        @Autowired
        private SysUserMapper sysUserMapper;
    
        public void inset(SysUser sysUser) {
            sysUserMapper.insert(sysUser);
        }
    
        /**
         * 插入支持Collection集合
         */
        public void insetList(Collection<SysUser> sysUserList) {
            sysUserMapper.insert(sysUserList);
        }
    
        public void selectByWhere() {
            WhereSql where = new WhereSql();
            where.andEq("user_account", "laowang");// user_account = 'laowang'
            where.andLikeL("user_account", "lao");// user_account like '%laowang'
            where.andLikeR("user_account", "wang");// user_account like 'laowang%'
            // ......
    
            List<SysUser> list = sysUserMapper.selectForWhere(SysUser.class, where);
    
            SysUser param = new SysUser();
            param.setAge(23);
            where = new WhereSql();
            where.andEq("user_account");// user_account = #{xxx.account} account字段值为''或null ,没有该条件
            where.andIsNull("user_account");// user_account is null
            where.andEq("email");// email = #{xxx.email} email字段值为''或null ,没有该条件
            where.andEq("age");// age = 23
            // .....
    
            list = sysUserMapper.selectByWhere(param, where);
            where.andEq("user_account", "尘无尘");// user_account = #{}
        }
    
        /*
         * ... 省略 更新 删除
         */
    }

     Hibernate:
     我用了Hibernate一年多,可以说是饱经风雨,感受极深,Hibernate看似一个很好的框架,我简单说一下它的使用痛点,
      1、作为开发人员,我们应该全新全意关注我们的功能业务,不能够让业务跟着技术走,应该让技术跟着业务走
      2、ORM mapping映射文件,对象关系(一对一、对多、多对一)配置、与java类强耦合,一点不灵活
      3、有QBC,HQL,SQL三种查询方式,经常式混合使用,有的代码写QBC、有的写HQL、有的写SQL,还有很多地方经常对象直接操作,
      因为同一个功能你有多种方式去实现,这就会迫使你面临选择,到底用那种方式,你会去权衡,这种情况是非常痛苦的。有义务稍有
      变更,咔嚓!可能对象操作不好用了,你就改HQL,后面可能HQL都不好用,搞得很复杂,然后你又不想用SQL,有的也有可能用SQL,
      整个项目java代码混合好多sql、HQL、对象操作、sql配置文件、映射配置... 到处都是围绕着这个框架转...... 代码多又难看
    Mybatis:
      1、就是个JDBC封装,加强,只有sql,尽管写sql,只要熟悉sql语句
      2、ORM映射,也很简单,resutMap 或者 autoMapping ,这种配置、跟个小孩说都懂
      3、痛点来了:resutMap、if else 标签、很多复用模式的sql, 
      那么多resultMap 写得累吧,虽然思路简单,那么多if else 写得累吧,那么多服用模式的sql。
      有很大一部分配置都是吻合java实体类字段的 insert update delete select, 当然了,各种关联查询、更新、删除还是应该写的。
      4、解决mybatis这个痛点的方式来了,代码生成器:Mybatis-Generator。代码是生成了,也确实节省了很多工作,可是代码量并没有减少、
      生成的代码还那么难看、还要去维护和修改代码,于是,Mybatis-smart 诞生了。

     实在时间有限,今晚到此为止,希望谅解,源码及更多相关请关注我,接下来再发布,联系我 QQ:594255598


    mybatis-smart
  • 相关阅读:
    SQL Server查询死锁并KILL
    android之Widget01
    android之RatingBar控件用法
    android之SeekBar控件用法
    android之ExpandableListActivity
    【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成
    【吐槽】博客园新的原创文章在搜索引擎的排名不及转载的站点
    【资源】108个大数据文档PDF开放下载-整理后打包下载
    【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
    【原创】.NET平台机器学习组件-Infer.NET连载(一)介绍
  • 原文地址:https://www.cnblogs.com/abab/p/10753624.html
Copyright © 2011-2022 走看看