Tigon MyBatis 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Tigon MyBatis 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
Tigon MyBatis 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
Tigon MyBatis 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
Tigon MyBatis 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 BSD-2-Clause
开发语言 Java
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 SuperShaunChyxion
适用人群 未知
收录时间 2020-12-09

软件简介

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

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

开始使用

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

使用示例

下面是使用示例,可以在源代码中找到更详细的单元测试。Talk is cheep,read the fine source code.

定义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;

@Getter
@Setter
@ToString
@Table("tb_user")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer id;
    @NotUpdate
    private String account;
    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. 插入

final User 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());

// single insert
mapper.insert(user);

final User 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());

final User 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());

// batch insert
mapper.insert(Arrays.asList(user1, user2));

II. 查询

根据ID查询单个对象

final Integer id = 1154;
final User user = mapper.find(id);

根据属性查询单个对象

final User user = mapper.find(
    new Search("account", "donghuang")
        .eq("mobile", "137647788xx"));

根据属性查询列表

final List<User> users = mapper.list(new Search()
    .between("birth_date",
        DateUtils.parseDate("1982-04-04"),
        DateUtils.parseDate("1994-04-04")
    )
    .eq("gender", User.Gender.MALE)
    .asc("birth_date")
    .limit(42));

Search对象支持的API

  • and And another Search
  • asc Order ASC
  • between Between two values
  • build Build query criterion
  • contains Value contains string
  • desc Order DSC
  • endsWith Value ends with string
  • eq Eqauls
  • gt Greater than
  • gte Eqauls or greater than
  • in In values
  • isNull Value is null
  • like Value like
  • limit Return rows limit
  • lt Less than
  • lte Eqauls or less than
  • ne Not equals
  • notIn Not in values
  • notNull Value is not null
  • offset Return rows offset
  • or Or another Search
  • orderBy Order by
  • startsWith Value starts with string

III. 更新

通过Entity根据ID更新

final User user = mapper.find(1);

user.setName("东皇大叔");
user.setUpdatedBy("SYS");
user.setUpdatedAt(new Date());

mapper.update(user);

通过Map<String, Object>更新

final Map<String, Object> update = new HashMap<>(6);
update.put("name", "东皇大叔");
update.put("updatedBy", "SYS");
update.put("updatedAt", new Date());

mapper.update(update, 1);
// OR
// mapper.update(update, new Search("id", 1));
// mapper.update(update, new Search(1));

更新列为NULL

// Update remark to NULL of id 274229
mapper.setNull("remark", 274229);
// Update remark to NULL of id 1154L
mapper.setNull("remark", new Search("id", 1154));
// Update all remarks to NULL. BE CAREFUL!!!
mapper.setNull("remark", new Search());

IV. 删除

通过ID删除数据

mapper.delete(1);

通过Search对象删除数据

mapper.delete(new Search("id", 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,具体逻辑参见源码,超简单,超幼稚。

其他

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

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

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

public static final String ACCOUNT = "account";

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

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

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

最后

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

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

开源界已经有很多MyBatis相关的项目了,包括官方出品的mybatis-dynamic-sql,这玩意把我可恶心坏了。最近接触的项目里有在用,看着那一坨一坨的完全没动力碰的垃圾代码,全世界都在看我们的笑话,Java什么时候变成这样了,让玩PHP,玩C#,玩GO,玩Ruby的同学怎么看待我们,哎卧槽。

魔幻2020年就快结束了,熬夜把拖延了好几年的待办事项做个了结,后续如果还有精力,我会考虑把生成代码的逻辑一并释放出来。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (2)

加载中
打分: 力荐
我最近使用mybatis-plus时感觉非常臃肿,起名很不符合我的规范,最近想自己写一份,就写到这个mapper层,看到您写的代码,感觉非常不错,但是能不能将字段扩展成lambda表达式方式?我觉得这个可以一起写一下,期待你的自动生成代码的逻辑。
01/30 17:37
回复
举报
你是说属性列名称么,可以用Lombok生成。用Lambda表达式不太好,有实现方案,但是我觉得那个方案非常不好,不是正常途径。
07/21 00:01
回复
举报
更多评论
发表了资讯
07/14 11:15

Tigon MyBatis v0.0.7 发布,为 Mapper 提供增强

Tigon MyBatis v0.0.7 已经发布,为 Mapper 提供增强。 此版本更新内容包括: 增加BaseQueryMapper#scan(pageSize, search, scanner)扫描方法 增加Search#isTrue(col),Search.isFalse(col)便捷方法 增加BaseUpdateMapper#update(col, val, id),BaseUpdateMapper#update(col, val, search)更新单列方法 增加启动检查 单元测试 详情查看:https://gitee.com/chyxion/tigon-mybatis/releases/v0.0.7...

1
3
2020/12/31 23:51

Tigon MyBatis v0.0.6 发布,再见 2020

Release Notes 优化Search#eq,Search#ne参数为NULL时候处理为is null,is not null @UseGeneratedKeys注解支持多参数 增加查询方法BaseQueryMapper#list(List keys),BaseQueryMapper#list(PrimarayKey[] keys) 优化Jdbc3KeyGen实现,增加共享变量 优化SqlSessionFactory增强,只有发现SupperMapper子类,才做增强 查询、更新支持驼峰格式属性名,转换为下划线列名 完善单元测试 代码简化,优化 Tigon MyBatis 简介 Tigon MyBa...

3
4
2020/12/21 19:49

Tigon MyBatis v0.0.5 发布

Release Notes Jdbc3KeyGen读取传入参数,先执行检查,避免在新版本MyBatis中报异常 优化Search#isNull,生成is null查询条件 增加Search#isNull相关单元测试 优化传入参数名model models等,避免与业务参数冲突 Tigon MyBatis 简介 Tigon MyBatis为Spring工程中MyBatis的Mapper提供增强,主要有以下特点 代码又少又壮,绝不做多余的事情 仅需Mapper继承接口,实现增 删 改 查,无额外配置,爽到没女朋友 用完即走,毫不留恋 开...

8
7
2020/12/09 21:37

Tigon MyBatis 0.0.4 发布,快来看呀,又有人重新发明轮子了

2020年,再来点更惊奇的事情也不是什么惊奇的事情。 MyBatis是个很神奇的框架,能让各种神奇的人玩出更神奇的事情,您懂我的意思,随便到代码托管平台搜索,一大堆龙啊虎啊的都出来了。 为什么又要再发明一个MyBatis的衍生框架,主要是这么些年下来,自己总结的一些实践经验,和大家分享一下。 早几年就想开源了,奈何一直拖延爽。 Tigon MyBatis 简介 Tigon MyBatis为Spring工程中MyBatis的Mapper提供增强,主要有以下特点 代码...

9
5
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2019/01/09 21:52

【MyBatis】 MyBatis入门

1、MyBatis简介 MyBatis是这个框架现在的名字,而此框架最早的名字是IBatis,其名字的含义是“internet”、“abatis”两个单词的组合,是在2002年的时候开始的一个开源项目,在2010年6月16日Apache将项目交与Google进行管理,更名MyBatis。所以2010年之后,MyBatis框架逐渐成为主流,比Hibernate发展更快。 IBatis和MyBatis两者的操作原理是相同的。IBatis变为了MyBatis之后,核心操作没有改变,但是配置部分有部分变化。 MyBa...

0
3
发表了博客
2019/10/29 21:14

Mybatis-Plus和Mybatis的区别

1.List item 区别一 如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。 通俗来讲—— MyBatis:一种操作数据库的框架,提供一种Mapper类,支持让你用java代码进行增删改查的数据库操作,省去了每次都要手写sql语句的麻烦。但是!有一个前提,你得先在xml中写好sql语句,是不是很麻烦?于是有下面的↓ Mybatis Generator:自动为Mybatis生成简单的增删改查sql语句的工具,省去一大票时间,两者配合使用,开发速度...

0
1
2020/04/14 11:16

mybatis- mybatis入门

# 一 前言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 # 二 mybatis入门 小白你好啊,在这里你要自己创建maven工程,如果不懂的配置安装可以看我tool系列的[idea配置maven](ht...

0
0
发表了博客
2019/04/25 21:35

mybatis之加强版_mybatis-plus

什么是Mybatis-Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 为什么要使用Mybatis-Plus 我们已经学习过Mybatis这个框架,我们只需要在dao层定义抽象接口,基于Mybatis零实现的特性,就可以实现对数据库的crud操作。 如下两个接口: UserMapper接口 public interface UserMapper { int deleteByPrimaryKey(Long id); int insert(User user); List...

0
0
发表了博客
2020/08/20 09:01

Mybatis-Plus与Mybatis的sqlSessionFactory自定义

Mybatis-Plus Mybatis-Plus其实也可以不写mapper.xml的配置文件,所有自定义时不一定需要去扫描*.mapper.xml配置文件 @Bean   public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception {     SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();     sqlSessionFactoryBean.setDataSource(dataSourceProxy);     sqlSessionFactoryBean.setTypeAliasesPackage("com....

0
0
2017/03/18 11:00

MyBatis之MyBatis初体验

1 MyBatis是什么? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(摘自:MyBatis中文官网) 2 MyBatis环境搭建及简单案例 2.1 新建工程,添加Maven依赖 为了MyBatis系列文章讲解方便,我直接...

0
0
2019/04/26 22:10

MyBatis增强版:MyBatis-Plus

![](https://oscimg.oschina.net/oscnet/8544eaac36155de5b170587d8e048e21d9f.jpg) **简介** MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。https://mp.baomidou.com/ **配置步骤说明** 1. 创建数据库环境 ![](https://oscimg.oschina.net/oscnet/6c303f264b1d5bc25ef9d587151deeeff7b.jpg) 建表语句 ``` CREATE TABLE `tb_user` ( `id` bigint(20) NOT...

0
0
发表了博客
2018/01/26 11:01

MyBatis配置文件myBatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration > <!--properties元素主要是用来定义配置外在化,比如数据库的连接属性等。 这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可以通过properties元素的子元素来传递。 因此,通过方法参...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
2 评论
16 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部