update 优化文档细节及代码格式

This commit is contained in:
luozhan 2023-05-17 21:11:32 +08:00
parent cfb77c493c
commit c2eb57e102
3 changed files with 105 additions and 61 deletions

View File

@ -21,7 +21,7 @@ public class AccountController {
@GetMapping("/accounts") @GetMapping("/accounts")
List<Account> selectList() { List<Account> selectList() {
//构造 QueryWrapper //构造 QueryWrapper,也支持使用 QueryWrapper.create() 构造,效果相同
QueryWrapper query = new QueryWrapper(); QueryWrapper query = new QueryWrapper();
query.where(ACCOUNT.ID.ge(100)); query.where(ACCOUNT.ID.ge(100));
@ -51,7 +51,7 @@ where id >= 100
## select * ## select *
```java ```java
QueryWrapper query=new QueryWrapper(); QueryWrapper query = new QueryWrapper();
query.select(ACCOUNT.ID, ACCOUNT.USER_NAME) query.select(ACCOUNT.ID, ACCOUNT.USER_NAME)
.from(ACCOUNT) .from(ACCOUNT)
``` ```

View File

@ -49,8 +49,25 @@ MyBatis-Flex 主要是和 `MyBatis-Plus` 与 `Fluent-Mybatis` 对比,内容来
**MyBatis-Flex** **MyBatis-Flex**
一般方式:
````java ````java
QueryCondition condition = EMPLOYEE.LAST_NAME.like("B") QueryWrapper query = QueryWrapper.create()
.where(EMPLOYEE.LAST_NAME.like(searchWord)) //条件为null时自动忽略
.and(EMPLOYEE.GENDER.eq(1))
.and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);
````
更简单一点:
````java
QueryWrapper query = select()
.where(EMPLOYEE.LAST_NAME.like(searchWord))
.and(EMPLOYEE.GENDER.eq(1))
.and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);
````
换一种方式:
````java
QueryCondition condition = EMPLOYEE.LAST_NAME.like(searchWord)
.and(EMPLOYEE.GENDER.eq(1)) .and(EMPLOYEE.GENDER.eq(1))
.and(EMPLOYEE.AGE.gt(24)); .and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByCondition(condition); List<Employee> employees = employeeMapper.selectListByCondition(condition);
@ -59,21 +76,19 @@ List<Employee> employees = employeeMapper.selectListByCondition(condition);
**MyBatis-Plus** **MyBatis-Plus**
````java ````java
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>(); QueryWrapper<Employee> queryWrapper = Wrappers.query()
queryWrapper .like(searchWord != null, "last_name", searchWord)
.like("last_name","B") .eq("gender", 1)
.eq("gender",1) .gt("age", 24);
.gt("age",24);
List<Employee> employees = employeeMapper.selectList(queryWrapper); List<Employee> employees = employeeMapper.selectList(queryWrapper);
```` ````
或者 MyBatis-Plus 的另一种写法: 或者 MyBatis-Plus 的lambda写法:
```java ```java
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Employee> queryWrapper = Wrappers.<Employee>lambdaQuery()
queryWrapper .like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B")
.like(Employee::getUserName,"B") .eq(Employee::getGender, 1)
.eq(Employee::getGender,1) .gt(Employee::getAge, 24);
.gt(Employee::getAge,24);
List<Employee> employees = employeeMapper.selectList(queryWrapper); List<Employee> employees = employeeMapper.selectList(queryWrapper);
``` ```
@ -82,7 +97,7 @@ List<Employee> employees = employeeMapper.selectList(queryWrapper);
````java ````java
EmployeeQuery query = new EmployeeQuery() EmployeeQuery query = new EmployeeQuery()
.where.lastName().like("B") .where.lastName().like(searchWord, If::notNull)
.and.gender().eq(1) .and.gender().eq(1)
.and.age().gt(24) .and.age().gt(24)
.end(); .end();
@ -96,7 +111,7 @@ List<Employee> employees = employeeMapper.listEntity(query);
**MyBatis-Flex** **MyBatis-Flex**
````java ````java
QueryWrapper query = new QueryWrapper() QueryWrapper query = QueryWrapper.create()
.select( .select(
ACCOUNT.ID, ACCOUNT.ID,
ACCOUNT.USER_NAME, ACCOUNT.USER_NAME,
@ -108,17 +123,16 @@ List<Employee> employees = employeeMapper.selectListByQuery(query);
**MyBatis-Plus** **MyBatis-Plus**
````java ````java
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>(); QueryWrapper<Employee> queryWrapper = Wrappers.query()
queryWrapper
.select( .select(
"id" "id",
,"user_name" "user_name",
,"max(birthday)" "max(birthday)",
,"avg(birthday) as sex_avg" "avg(birthday) as sex_avg"
); );
List<Employee> employees = employeeMapper.selectList(queryWrapper); List<Employee> employees = employeeMapper.selectList(queryWrapper);
```` ````
> 缺点:字段硬编码,容易错。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。 > 缺点:字段硬编码,容易错。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。
**Fluent-MyBatis** **Fluent-MyBatis**
@ -153,16 +167,21 @@ OR (age IN (18,19,20) AND user_name LIKE "%michael%" )
QueryWrapper query = QueryWrapper.create() QueryWrapper query = QueryWrapper.create()
.where(ACCOUNT.ID.ge(100)) .where(ACCOUNT.ID.ge(100))
.and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))) .and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2)))
.or(ACCOUNT.AGE.in(18,19,20).and(ACCOUNT.USER_NAME.like("michael"))); .or(ACCOUNT.AGE.in(18, 19, 20).and(ACCOUNT.USER_NAME.like("michael")));
``` ```
**MyBatis-Plus** **MyBatis-Plus**
```java ```java
QueryWrapper<Employee> query = new QueryWrapper<>(); QueryWrapper<Employee> query = Wrappers.query()
queryWrapper.ge("id",100) .ge("id", 100)
.and(i->i.eq("sex",1).or(x->x.eq("sex",2))) .and(i -> i.eq("sex", 1).or(x -> x.eq("sex", 2)))
.or(i->i.in("age",{18,19,20}).like("user_name","michael")); .or(i -> i.in("age", 18, 19, 20).like("user_name", "michael"));
// or lambda
LambdaQueryWrapper<Employee> query = Wrappers.<Employee>lambdaQuery()
.ge(Employee::getId, 100)
.and(i -> i.eq(Employee::getSex, 1).or(x -> x.eq(Employee::getSex, 2)))
.or(i -> i.in(Employee::getAge, 18, 19, 20).like(Employee::getUserName, "michael"));
``` ```
**Fluent-Mybatis** **Fluent-Mybatis**

View File

@ -86,9 +86,9 @@ class HelloWorld {
```java ```java
//示例2通过 QueryWrapper 构建条件查询数据列表 //示例2通过 QueryWrapper 构建条件查询数据列表
QueryWrapper query=QueryWrapper.create() QueryWrapper query = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT) // 单表查询时表名可省略自动使用Mapper泛型对应的表
.where(ACCOUNT.ID.ge(100)) .where(ACCOUNT.ID.ge(100))
.and(ACCOUNT.USER_NAME.like("张").or(ACCOUNT.USER_NAME.like("李"))); .and(ACCOUNT.USER_NAME.like("张").or(ACCOUNT.USER_NAME.like("李")));
@ -96,7 +96,7 @@ QueryWrapper query=QueryWrapper.create()
// ELECT * FROM tb_account // ELECT * FROM tb_account
// WHERE tb_account.id >= 100 // WHERE tb_account.id >= 100
// AND (tb_account.user_name LIKE '%张%' OR tb_account.user_name LIKE '%李%' ) // AND (tb_account.user_name LIKE '%张%' OR tb_account.user_name LIKE '%李%' )
List<Account> accounts = mapper.selectListByQuery(query); List<Account> accounts = accountMapper.selectListByQuery(query);
``` ```
示例3分页查询 示例3分页查询
@ -117,7 +117,7 @@ QueryWrapper query=QueryWrapper.create()
// AND (user_name LIKE '%张%' OR user_name LIKE '%李%' ) // AND (user_name LIKE '%张%' OR user_name LIKE '%李%' )
// ORDER BY `id` DESC // ORDER BY `id` DESC
// LIMIT 40,10 // LIMIT 40,10
Page<Account> accounts = mapper.paginate(5,10,query); Page<Account> accounts = mapper.paginate(5, 10, query);
``` ```
## QueryWrapper 示例 ## QueryWrapper 示例
@ -125,20 +125,30 @@ Page<Account> accounts = mapper.paginate(5,10,query);
### select * ### select *
```java ```java
QueryWrapper query=new QueryWrapper(); QueryWrapper query = new QueryWrapper();
query.select().from(ACCOUNT) query.select().from(ACCOUNT);
// SQL: // SQL:
// SELECT * FROM tb_account // SELECT * FROM tb_account
``` ```
也可以通过静态方法简写成如下两种形式,效果完全相同:
```java
// 方式1
QueryWrapper query = QueryWrapper.create()
.select().from(ACCOUNT);
// 方式2
QueryWrapper query = select().from(ACCOUNT);
// SQL:
// SELECT * FROM tb_account
```
### select columns ### select columns
简单示例: 简单示例:
```java ```java
QueryWrapper query=new QueryWrapper(); QueryWrapper query = new QueryWrapper();
query.select(ACCOUNT.ID,ACCOUNT.USER_NAME) query.select(ACCOUNT.ID, ACCOUNT.USER_NAME)
.from(ACCOUNT) .from(ACCOUNT);
// SQL: // SQL:
// SELECT id, user_name // SELECT id, user_name
@ -164,7 +174,7 @@ QueryWrapper query = new QueryWrapper()
### select functions ### select functions
```java ```java
QueryWrapper query=new QueryWrapper() QueryWrapper query = new QueryWrapper()
.select( .select(
ACCOUNT.ID, ACCOUNT.ID,
ACCOUNT.USER_NAME, ACCOUNT.USER_NAME,
@ -180,9 +190,10 @@ QueryWrapper query=new QueryWrapper()
``` ```
### where ### where
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() Integer num = 100;
String userName = "michael";
QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.where(ACCOUNT.ID.ge(100)) .where(ACCOUNT.ID.ge(100))
@ -221,6 +232,21 @@ QueryWrapper queryWrapper = QueryWrapper.create()
// SELECT * FROM tb_account // SELECT * FROM tb_account
// WHERE user_name LIKE ? // WHERE user_name LIKE ?
``` ```
### where 自动忽略 null 值
当遇到条件值为 null 时,会自动忽略该条件,不会拼接到 SQL 中
```java
Integer num = null;
String userName = "michael";
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
.from(ACCOUNT)
.where(ACCOUNT.ID.ge(num))
.and(ACCOUNT.USER_NAME.like(userName));
// SQL:
// SELECT * FROM tb_account
// WHERE user_name LIKE '%michael%'
```
### where select ### where select
@ -262,7 +288,7 @@ QueryWrapper queryWrapper=QueryWrapper.create()
### and (...) or (...) ### and (...) or (...)
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.where(ACCOUNT.ID.ge(100)) .where(ACCOUNT.ID.ge(100))
@ -279,7 +305,7 @@ QueryWrapper queryWrapper=QueryWrapper.create()
### group by ### group by
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.groupBy(ACCOUNT.USER_NAME); .groupBy(ACCOUNT.USER_NAME);
@ -292,7 +318,7 @@ QueryWrapper queryWrapper=QueryWrapper.create()
### having ### having
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.groupBy(ACCOUNT.USER_NAME) .groupBy(ACCOUNT.USER_NAME)
@ -307,7 +333,7 @@ QueryWrapper queryWrapper=QueryWrapper.create()
### orderBy ### orderBy
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.orderBy(ACCOUNT.AGE.asc() .orderBy(ACCOUNT.AGE.asc()
@ -321,7 +347,7 @@ QueryWrapper queryWrapper=QueryWrapper.create()
### join ### join
```java ```java
QueryWrapper queryWrapper=QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.select() .select()
.from(ACCOUNT) .from(ACCOUNT)
.leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)) .leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))
@ -400,31 +426,31 @@ Db + Row 工具类,提供了在 Entity 实体类之外的数据库操作能力
```java ```java
//使用原生 SQL 插入数据 //使用原生 SQL 插入数据
String sql="insert into tb_account(id,name) value (?, ?)"; String sql="insert into tb_account(id,name) value (?, ?)";
Db.insertBySql(sql,1,"michael"); Db.insertBySql(sql, 1, "michael");
//使用 Row 插入数据 //使用 Row 插入数据
Row account=new Row(); Row account = new Row();
account.set("id",100); account.set("id", 100);
account.set("name","Michael"); account.set("name", "Michael");
Db.insert("tb_account",account); Db.insert("tb_account", account);
//根据主键查询数据 //根据主键查询数据
Row row=Db.selectOneById("tb_account","id",1); Row row = Db.selectOneById("tb_account", "id", 1);
//Row 可以直接转换为 Entity 实体类,且性能极高 //Row 可以直接转换为 Entity 实体类,且性能极高
Account account=row.toEntity(Account.class); Account account = row.toEntity(Account.class);
//查询所有大于 18 岁的用户 //查询所有大于 18 岁的用户
String listsql="select * from tb_account where age > ?" String listsql = "select * from tb_account where age > ?"
List<Row> rows=Db.selectListBySql(sql,18); List<Row> rows = Db.selectListBySql(sql, 18);
//分页查询:每页 10 条数据,查询第 3 页的年龄大于 18 的用户 //分页查询:每页 10 条数据,查询第 3 页的年龄大于 18 的用户
QueryWrapper query=QueryWrapper.create() QueryWrapper query = QueryWrapper.create()
.where(ACCOUNT.AGE.ge(18)); .where(ACCOUNT.AGE.ge(18));
Page<Row> rowPage=Db.paginate("tb_account",3,10,query); Page<Row> rowPage = Db.paginate("tb_account", 3, 10, query);
``` ```
> Db 工具类还提供了更多 增、删、改、查和分页查询等方法。 > Db 工具类还提供了更多 增、删、改、查和分页查询等方法。
@ -444,7 +470,7 @@ update(T entity)
有些场景下,我们可能希望只更新 几个 字段,而其中个别字段需要更新为 null。此时需要用到 `UpdateEntity` 工具类,以下是示例代码: 有些场景下,我们可能希望只更新 几个 字段,而其中个别字段需要更新为 null。此时需要用到 `UpdateEntity` 工具类,以下是示例代码:
```java ```java
Account account=UpdateEntity.of(Account.class); Account account = UpdateEntity.of(Account.class);
account.setId(100); account.setId(100);
account.setUserName(null); account.setUserName(null);
account.setSex(1); account.setSex(1);
@ -466,7 +492,7 @@ set user_name = ?, sex = ? where id = ?
## 自定义 TypeHandler ## 自定义 TypeHandler
使用 @column 注解: 使用 @Column 注解:
```java ```java
@Table("tb_account") @Table("tb_account")
@ -488,7 +514,6 @@ public class Account {
} }
options.put(key, value); options.put(key, value);
} }
} }
``` ```
@ -503,7 +528,7 @@ account.addOption("c3", new Date());
``` ```
mybatis 日志: mybatis 日志:
``` ```
==> Preparing: INSERT INTO tb_account (user_name, options) VALUES (?, ?) ==> Preparing: INSERT INTO tb_account (user_name, options) VALUES (?, ?)
==> Parameters: test(String), {"c3":"2023-03-17 09:10:16.546","c1":11,"c2":"zhang"}(String) ==> Parameters: test(String), {"c3":"2023-03-17 09:10:16.546","c1":11,"c2":"zhang"}(String)
``` ```
@ -545,7 +570,7 @@ public class UUIDKeyGenerator implements IKeyGenerator {
第 2 步:注册 UUIDKeyGenerator 第 2 步:注册 UUIDKeyGenerator
```java ```java
KeyGeneratorFactory.register("myUUID",new UUIDKeyGenerator()); KeyGeneratorFactory.register("myUUID", new UUIDKeyGenerator());
``` ```
第 3 步:在 Entity 里使用 "myUUID" 生成器: 第 3 步:在 Entity 里使用 "myUUID" 生成器: