Tigon MyBatis v0.0.8 发布,极简 MyBatis Mapper 增强

来源: 投稿
2021-12-08

Tigon MyBatis v0.0.8 已经发布,为 MyBatis Mapper 提供增强,设计精巧,代码量很少,代码洁癖工程师的朋友

此版本更新内容包括:

  • 优化插入生成Key逻辑,之前通过拦截器方式实现,在高并发环境下存在Bug
  • 删除了100多行代码,今天又变强了

详情查看:https://gitee.com/chyxion/tigon-mybatis/releases/v0.0.8

Tigon MyBatis

简介

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

  • 代码又少又壮,绝不做多余的事情
  • 仅需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;

@Mapper
public interface UserMapper extends BaseMapper<Integer, User> {
}
 

注入Mapper对象

@Autowired
private UserMapper mapper;
 

I. 插入

val user = new User();
user.setName("Donghuang");
user.setAccount("donghuang");
user.setMobile("137647788xx");
user.setPassword(RandomStringUtils.randomAlphanumeric(16));
user.setGender(User.Gender.MALE);
user.setBirthDate(DateUtils.parseDate("1994-04-04"));
user.setCity("Shanghai");
user.setActive(true);
user.setRemark("Uncle Donghuang");
user.setCreatedBy("donghuang");
user.setCreatedAt(new Date());

// 插入单条记录
mapper.insert(user);

val user1 = new User();
user1.setName("Gemily");
user1.setAccount("gemily");
user1.setMobile("15770780xxx");
user1.setPassword(RandomStringUtils.randomAlphanumeric(16));
user1.setGender(User.Gender.FEMALE);
user1.setBirthDate(DateUtils.parseDate("1990-06-06"));
user1.setCity("Hangzhou");
user1.setActive(true);
user1.setCreatedBy("donghuang");
user1.setCreatedAt(new Date());

val user2 = new User();
user2.setName("Luffy");
user2.setAccount("luffy");
user2.setMobile("137647799xx");
user2.setPassword(RandomStringUtils.randomAlphanumeric(16));
user2.setGender(User.Gender.MALE);
user2.setBirthDate(DateUtils.parseDate("1997-07-07"));
user2.setCity("East sea");
user2.setActive(true);
user2.setRemark("Luffy");
user2.setCreatedBy("donghuang");
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为null
mapper.setNull("remark", 274229);
// 更新id为1154记录的属性列remark为null
mapper.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
展开阅读全文
3 收藏
分享
加载中
最新评论 (6)
看到越来越多的变种mybatis 让我觉得JPA才是真理
2021-12-09 11:24
0
回复
举报
为什么这么说
2021-12-09 14:43
0
回复
举报
MyBatis某种程度上来说,是个半成品,毛坯房,定制化程度很高,因此有很多开源的扩展,鱼龙混杂,选择成本大,因此有些架构师技术选型时候倾向于选择JPA或者其他的JDBC方案。有兴趣的话,可以看看Tigon MyBatis,不一样的风景
2021-12-09 16:47
0
回复
举报
说实话 我越来月喜欢jpa了 面向对象开发 项目结构很好 不关联数据库 我可以在本地用h2开发 上线用mysql 微服务系统都不会有太多复杂的操作 开发进度还快 就是可能性能优化方面不是很方便
2021-12-10 12:00
0
回复
举报
逻辑简单的话,JPA确实简洁。但是随着复杂性增加,JPA会显得笨重,具体看实际场景。Tigon MyBatis在便捷性和灵活性上面做了很大努力,欢迎研究指导批评
2021-12-09 16:41
0
回复
举报
ok,稍后去看下
2021-12-09 19:36
0
回复
举报
更多评论
6 评论
3 收藏
分享
返回顶部
顶部