7 Star 35 Fork 7

Shaun Chyxion / tigon-mybatis

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
BSD-2-Clause

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;

@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.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为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

原理

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,说实话,都挺恶心的。

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

Copyright (c) 2020, Shaun Chyxion All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

简介

MyBatis优雅增强 展开 收起
Java
BSD-2-Clause
取消

发行版 (4)

全部

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/chyxion/tigon-mybatis.git
git@gitee.com:chyxion/tigon-mybatis.git
chyxion
tigon-mybatis
tigon-mybatis
master

搜索帮助