# mybatis-milu
**Repository Path**: ab-code/mybatis-milu
## Basic Information
- **Project Name**: mybatis-milu
- **Description**: mybatis增强框架
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 8
- **Created**: 2021-09-03
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mybatis-milu
[详细文档](http://mybatis-milu.yuehuanghun.com/)
### 介绍
mybatis-milu是基于mybatis的功能增强框架,遵循JPA规范的ORM,提供通用Mapper接口,提供类似Spring Data JPA的查询创建器,通过方法名解析查询语句,极大提高开发效率。
本框架仅做功能增强,拓展statement的创建方式,不覆盖mybatis中的任何实现。
支持JPA的注解规范,但没有根据实体类注解声明生成表、索引等的功能,所以部分注解或注解属性用来生成表及索引的,使用后并无效果。
#### 目标
1. 通过ORM使9成以上查询不需要写SQL就能完成,减少SQL测试调试时间。
2. 通过ORM解决多表关联查询问题,避免一涉及多表查询就要写SQL的问题。
3. 通过命名查询创建器更方便创建一对一的专用查询接口,更容易审计。
### 软件架构
依赖
mybatis >= 3.5.0
pagehelper >=5.1.0
jdk >= 1.8
### 安装教程
```
com.yuehuanghun
mybatismilu-spring-boot-starter
1.0.2
```
### 使用说明
克隆代码中的mybatismilu-test模块有详细的使用演示
#### 一、实体类声明
如果你熟悉使用Hibernate,可以忽略此节内容。
使用javax.persistence.Entity注解一个类为实体类。
可以使用javax.persistence.Table注解声明覆盖实体类的默认值。
可以使用javax.persistence.Column注解声明覆盖字段的默认值。
使用javax.persistence.Id注解声明这个属性为表的主键。
使用javax.persistence.Transient注解声明属性为非表字段或关联。
使用javax.persistence.OneToOne声明一对一的关系。
使用javax.persistence.ManyToOne声明多对一的关系。
使用javax.persistence.OneToMany声明一对多的关系
使用javax.persistence.ManyToMany声明多对多的关系
使用javax.persistence.JoinColumn声明实体(表)关联的信息
使用javax.persistence.JoinTable声明实体(表)关联的信息
```
@Data
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tableSequence")
@TableGenerator(name = "tableSequence", table = "sequence", valueColumnName = "current_seq", pkColumnName = "id", pkColumnValue = "1")
private Long id; //使用数据表模拟数字序列
@AttributeOptions(filler = @Filler(fillOnInsert = true)) //当在插入数据时,如果该属性为null则自动填充值
private Date addTime;
@AttributeOptions(filler = @Filler(fillOnInsert = true, fillOnUpdate = true)) //当在插入或更新数据时,如果该属性为null则自动填充值
private Date updateTime;
@AttributeOptions(exampleQuery = @ExampleQuery(matchType = MatchType.CONTAIN)) //使用findByExample方法时name不为空时,即执行name LIKE %nameValue%
private String name;
private Integer age;
private Long classId;
@ManyToOne
@JoinColumn(name = "class_id", referencedColumnName = "id")
private Classs classs; //对多一引用
@OneToOne(mappedBy = "student")
private StudentProfile studentProfile; //一对一引用
}
```
```
@Entity
@Table(name = "class")
@Data
public class Classs {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = Constants.ID_GENERATOR_SNOWFLAKE)
private Long id; //使用分布式ID,内置的snowflakeId
private Date addTime;
private String name;
@ManyToMany(mappedBy = "classList")
private List teacherList; //多对多关系演示,双向引用
@OneToMany(mappedBy = "classs")
private List studentList; //一对多关系演示,双向引用
}
```
#### 二、通用Mapper
Mapper接口通过继承BaseMapper接口类,获得通用的数据访问能力。
以下对一些特别的接口进行说明,简单的接口不再说明:
1、example查询,使用entity对象作为查询条件。findByExample、findByExampleAndSort、countByExample
使用实体类对象作为查询条件。
默认情况下entity的属性值不为空时(not empty模式),将被作为查询条件,可以使用@AttributeOptions(conditionMode=Mode.xxx)更改条件的生效模式。
默认情况下属性作为查询条件时,使用值=匹配,可以@AttributeOptions(exampleQuery=@ExampleQuery(matchType=MatchType.xxx))更改查询匹配方式
同样适用
2、criteria查询。findByCriteria、updateByCriteria、deleteByCriteria、countByCriteria
自定义条件查询,通过实体属性设置查询条件
```
//方式一
classMapper.findByCriteria(new QueryPredicateImpl().eq("name", "一年级").order(Direction.DESC,"id").order("studentListAddTime"));
//方式二
classMapper.findByCriteria(p -> p.eq("name", "一年级").order(Direction.DESC,"id").order("studentListAddTime"));
```
3、lambdaCriteria查询。findByLambdaCriteria、updateByLambdaCriteria、deleteByLambdaCriteria、countByLambdaCriteria
自定义条件查询,通过实体属性的lambda函数式设置查询条件
```
Classs params = new Classs();
params.setName("一年级");
//方式一
classMapper.findByLambdaCriteria(predicate -> predicate.apply(params).select(Classs::getName, Classs::getAddTime).eq(Classs::getName).limit(10, false));
//方式二
classMapper.findByLambdaCriteria(predicate -> predicate.select(Classs::getName, Classs::getAddTime).eq(Classs::getName, params.getName()).limit(10, false));
```
4、criteria、lambdaCriteria统计
目前支持5个统计关键字:sum/count/min/max/avg
```
List