Tigon MyBatis为Spring工程中MyBatis的Mapper提供优质增强,主要有以下特点
增
删
改
查
,无额外配置,爽到没女朋友<dependency>
<groupId>me.chyxion.tigon</groupId>
<artifactId>tigon-mybatis</artifactId>
<version>0.0.8</version>
</dependency>
下面是使用示例,可以在源代码中找到更详细的单元测试用例
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
}
}
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> {
}
@Autowired
private UserMapper mapper;
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));
根据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 属性列为nullnotNull
Value is not null 属性列不为nullisTrue
Value is true 属性列为trueisFalse
Value is false 属性列为falselimit
Return rows limit 查询/更新结果行数限制offset
Return rows offset 查询结果偏移行数and
And another Search
且另外一个Search对象or
Or another Search
或另外一个Search对象通过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());
通过ID
删除数据
// 根据主键删除记录
mapper.delete(1);
通过Search
对象删除数据
// 根据属性ID删除记录
mapper.delete(new Search("id", 1));
// 等同于 mapper.delete(1);
除了上面说到的一些基础增删改查操作,还有一些实用功能,如@Transient
@UseGeneratedKeys
@NoPrimaryKey
@NotUpdateWhenNull
@RawValue
等注解,插入、更新前回调,以及支持扩展自定义的方法等。
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
,说实话,都挺恶心的。
欢迎有兴趣的同学一起共建。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型