• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

tigon-mybatis: MyBatis优雅增强

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

tigon-mybatis

开源软件地址:

https://gitee.com/chyxion/tigon-mybatis

开源软件介绍:

Tigon MyBatis

简介

Tigon MyBatis为Spring工程中MyBatis的Mapper提供优质增强,主要有以下特点

  • 代码又少又壮(1885行),绝不做多余的事情
  • 仅需Mapper继承接口,实现 ,无额外配置,爽到没女朋友
  • 用完即走,毫不留恋

开始使用

  • 引入Maven依赖
<dependency>  <groupId>me.chyxion.tigon</groupId>  <artifactId>tigon-mybatis</artifactId>  <version>0.0.8</version></dependency>

使用示例

下面是使用示例,可以在源代码中找到更详细的单元测试用例

定义Entity
package me.chyxion.tigon.mybatis.entity;import lombok.Getter;import lombok.Setter;import java.util.Date;import lombok.ToString;import java.io.Serializable;import me.chyxion.tigon.mybatis.Table;import me.chyxion.tigon.mybatis.NotUpdate;import me.chyxion.tigon.mybatis.NotUpdateWhenNull;@Getter@Setter@ToString@Table("tb_user")public class User implements Serializable {    private static final long serialVersionUID = 1L;    private Integer id;    // 标记账户不被更新    @NotUpdate    private String account;    // 当手机号为null不被更新    @NotUpdateWhenNull    private String mobile;    private String name;    private Gender gender;    private String password;    private Date birthDate;    private String city;    private String avatar;    private Boolean active;    private String remark;    private String createdBy;    private Date createdAt;    private String updatedBy;    private Date updatedAt;    public enum Gender {        MALE,        FEMALE    }}
定义Mapper
package me.chyxion.tigon.mybatis.mapper;import java.util.List;import me.chyxion.tigon.mybatis.BaseMapper;import org.apache.ibatis.annotations.Mapper;import me.chyxion.tigon.mybatis.entity.User;@Mapperpublic interface UserMapper extends BaseMapper<Integer, User> {}
注入Mapper对象
@Autowiredprivate UserMapper mapper;
I. 插入
val user = new User();user.setName("Donghuang");user.setAccount("donghuang");...user.setCreatedAt(new Date());// 插入单条记录mapper.insert(user);val user1 = new User();user1.setName("Gemily");user1.setAccount("gemily");...user1.setCreatedAt(new Date());val user2 = new User();user2.setName("Luffy");user2.setAccount("luffy");...user2.setCreatedAt(new Date());// 批量插入记录mapper.insert(Arrays.asList(user1, user2));
II. 查询

根据ID查询单个对象

val id = 1154;// 根据主键查询单条记录val user = mapper.find(id);

根据属性查询单个对象

// 根据属性account, mobile查询单个对象val user = mapper.find(    new Search("account", "donghuang")        .eq("mobile", "137647788xx"));

根据属性查询列表

// 根据属性birthDate, gender查询数据列表// 查询结果根据属性birthDate升序排序// 返回数据限制42条val users = mapper.list(new Search()    .between("birthDate",        DateUtils.parseDate("1982-04-04"),        DateUtils.parseDate("1994-04-04")    )    .eq("gender", User.Gender.MALE)    .asc("birthDate")    .limit(42));

Search对象支持的API

  • asc Order ASC 列升序排序
  • desc Order DSC 列降序排序
  • orderBy Order by 列属性排序
  • between Between two values 属性列属于2个值之间
  • build Build query criterion 自定义构建一个属性列查询条件
  • startsWith Value starts with string 属性列以字符串开头,等同于col like 'val%'
  • endsWith Value ends with string 属性列以字符串结尾,等同于col like '%val'
  • contains Value contains string 属性列包含字符串,等同于col like '%val%'
  • like Value like 属性列与字符串相似
  • eq Equals 属性列等于
  • ne Not equals 属性列小于或等于
  • gt Greater than 属性列大于
  • gte Equals or greater than 属性列大于或等于
  • lt Less than 属性列小于
  • lte Equals or less than 属性列小于
  • in In values 属性列属于集合
  • notIn Not in values 属性列不属于集合
  • isNull Value is null 属性列为null
  • notNull Value is not null 属性列不为null
  • isTrue Value is true 属性列为true
  • isFalse Value is false 属性列为false
  • limit Return rows limit 查询/更新结果行数限制
  • offset Return rows offset 查询结果偏移行数
  • and And another Search 且另外一个Search对象
  • or Or another Search 或另外一个Search对象
III. 更新

通过Entity根据ID更新

// 根据主键查询记录val user = mapper.find(1);user.setName("东皇大叔");user.setUpdatedBy("SYS");user.setUpdatedAt(new Date());// 更新单个实体对象mapper.update(user);

通过Map<String, Object>更新

val update = new HashMap<String, Object>(6);update.put("name", "东皇大叔");update.put("updatedBy", "SYS");update.put("updatedAt", new Date());// 通过Map更新ID为1的记录mapper.update(update, 1);// 效果同上// mapper.update(update, new Search("id", 1));// mapper.update(update, new Search(1));

更新列为NULL

// 更新id为274229记录的属性列remark为nullmapper.setNull("remark", 274229);// 更新id为1154记录的属性列remark为nullmapper.setNull("remark", new Search("id", 1154));// 更新全表的属性列remark为null,小心操作!!!mapper.setNull("remark", new Search());
IV. 删除

通过ID删除数据

// 根据主键删除记录mapper.delete(1);

通过Search对象删除数据

// 根据属性ID删除记录mapper.delete(new Search("id", 1));// 等同于 mapper.delete(1);
V. 杂项

除了上面说到的一些基础增删改查操作,还有一些实用功能,如@Transient @UseGeneratedKeys @NoPrimaryKey @NotUpdateWhenNull @RawValue等注解,插入、更新前回调,以及支持扩展自定义的方法等。

配置说明

  • SpringBoot项目,无需其他操作,引入依赖即可
  • Spring项目,注册Bean me.chyxion.tigon.mybatis.TigonMyBatisConfiguration
  • 业务Mapper继承me.chyxion.tigon.mybatis.BaseMapper或相关衍生Mapper,Base(Query, Insert, Update, Delete)Mapper

原理

Tigon MyBatis并不改变MyBatis相关功能,所做的只是在程序启动期间检测业务Mapper接口,如果继承了相关BaseMapper.java,则注入相关方法MappedStatement,具体逻辑参见源码,超简单,超幼稚。

代码阅读

都看到这里了,动动小手clone工程,直接打开UserMapperTest.java右击调试运行,心事全都被你发现,代码写得烂的地方回来喷我,一定改。

其他

在前面使用Search的例子中,我们需要一些User的属性常量字符串,比如

val user = mapper.find(new Search("account", "donghuang"));

可以将这些常量定义在User类中,如

public static final String ACCOUNT = "account";

使用过程中可以使用属性常量,如

val user = mapper.find(new Search(User.ACCOUNT, "donghuang"));

也可以使用Lombok@FieldNameConstants注解生成,只是这个注解还处于试验阶段,有一定不稳定风险。

最后

为什么要有这个项目,其实这些代码本人从2014年就陆续在写在用,在自己参与的一些项目里默默奉献。

有想过开源,奈何一直忙着修福报,此外很重要的一点是,觉得方案并不完善,还是比较长比较臭。

开源界已经有很多MyBatis相关的项目了,包括官方出品的mybatis-dynamic-sql,说实话,都挺恶心的。

欢迎有兴趣的同学一起共建。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
balloonfish: 一款基于electron+vue3+vite2.0的TDengine时序库可视化管理工具 ...发布时间:2022-03-24
下一篇:
toyorm: golang orm发布时间:2022-03-24
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap