Mybatis-smart(Mybatis最终优化方案)

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。
Mybatis-smart:
 简单使用说明:
     smartMapper操作:
    smartMapper.insert(user);
    smartMapper.updateById(user);
    smartMapper.deleteById(id,SysUser.class);
    smartMapper.selectById(id,SysUser.class);
    .... 更多操作

    简单写了个demo:
  实体类:省略了简单的基本的 CRUD mapper.xml配置

//@TableInfo(value = "sys_user",idFieldName="account")//对应主键的java字段是account(默认是id)
//@TableInfo(value = "sys_user",idtactics=IdtacticsEnum.DEFINED)//主键生成策略:自定义,就是java设值;还有 IdtacticsEnum.DFT 内部默认序列生成器生成, IdtacticsEnum.SQL_INCR 数据库自增
@TableInfo(value = "sys_user")//对应sys_user 表
public class SysUser  {
    
    @ColumnInfo(value="user_account")//对应sql字段user_account,默认是驼峰规则对应:如user_id对应userId或者userid对应userid
    private String account;
    private String pwd;
    private String email;
    private String tel;
    @ColumnInfo(insertValType=ObjTypeEnum.ALL)//调用mybatis-smart smartMapper 的新增方法时、""、null、其他值 都会insert进数据库,默认""、null 不会insert进数据库
    private String nickname;
    private Date lastLoginTime;
    private String lastLoginIp;
    private Integer age;
    @ColumnInfo(isUpdate = false)//调用mybatis-smart smartMapper 的更新方法时,不更新该字段
    protected Date createTime;
    
    @ColumnInfo(isInsert=false)//调用mybatis-smart smartMapper 的新增方法时,不新增该字段
    protected Date updateTime;

    protected String selectParam;//表中没有select_param,则调用mybatis-smart smartMapper 的CRUD都会忽略该字段
        ...省略get set 方法
}

    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 = #{}
    }

    /*
     * ... 省略 更新 删除
     */
}

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


猜你喜欢

转载自www.cnblogs.com/abab/p/10753624.html