diff --git a/docs/zh/base/querywrapper.md b/docs/zh/base/querywrapper.md index b102144c..036a0717 100644 --- a/docs/zh/base/querywrapper.md +++ b/docs/zh/base/querywrapper.md @@ -21,7 +21,7 @@ public class AccountController { @GetMapping("/accounts") List selectList() { - //构造 QueryWrapper + //构造 QueryWrapper,也支持使用 QueryWrapper.create() 构造,效果相同 QueryWrapper query = new QueryWrapper(); query.where(ACCOUNT.ID.ge(100)); @@ -51,7 +51,7 @@ where id >= 100 ## select * ```java -QueryWrapper query=new QueryWrapper(); +QueryWrapper query = new QueryWrapper(); query.select(ACCOUNT.ID, ACCOUNT.USER_NAME) .from(ACCOUNT) ``` diff --git a/docs/zh/intro/comparison.md b/docs/zh/intro/comparison.md index c4d788d7..e870a541 100644 --- a/docs/zh/intro/comparison.md +++ b/docs/zh/intro/comparison.md @@ -49,8 +49,25 @@ MyBatis-Flex 主要是和 `MyBatis-Plus` 与 `Fluent-Mybatis` 对比,内容来 **MyBatis-Flex:** +一般方式: ````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 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 employees = employeeMapper.selectListByQuery(query); +```` +换一种方式: +````java +QueryCondition condition = EMPLOYEE.LAST_NAME.like(searchWord) .and(EMPLOYEE.GENDER.eq(1)) .and(EMPLOYEE.AGE.gt(24)); List employees = employeeMapper.selectListByCondition(condition); @@ -59,21 +76,19 @@ List employees = employeeMapper.selectListByCondition(condition); **MyBatis-Plus:** ````java -QueryWrapper queryWrapper = new QueryWrapper<>(); -queryWrapper - .like("last_name","B") - .eq("gender",1) - .gt("age",24); +QueryWrapper queryWrapper = Wrappers.query() + .like(searchWord != null, "last_name", searchWord) + .eq("gender", 1) + .gt("age", 24); List employees = employeeMapper.selectList(queryWrapper); ```` -或者 MyBatis-Plus 的另一种写法: +或者 MyBatis-Plus 的lambda写法: ```java -LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); -queryWrapper - .like(Employee::getUserName,"B") - .eq(Employee::getGender,1) - .gt(Employee::getAge,24); +LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B") + .eq(Employee::getGender, 1) + .gt(Employee::getAge, 24); List employees = employeeMapper.selectList(queryWrapper); ``` @@ -82,7 +97,7 @@ List employees = employeeMapper.selectList(queryWrapper); ````java EmployeeQuery query = new EmployeeQuery() - .where.lastName().like("B") + .where.lastName().like(searchWord, If::notNull) .and.gender().eq(1) .and.age().gt(24) .end(); @@ -96,7 +111,7 @@ List employees = employeeMapper.listEntity(query); **MyBatis-Flex:** ````java -QueryWrapper query = new QueryWrapper() +QueryWrapper query = QueryWrapper.create() .select( ACCOUNT.ID, ACCOUNT.USER_NAME, @@ -108,17 +123,16 @@ List employees = employeeMapper.selectListByQuery(query); **MyBatis-Plus:** ````java -QueryWrapper queryWrapper = new QueryWrapper<>(); -queryWrapper +QueryWrapper queryWrapper = Wrappers.query() .select( - "id" - ,"user_name" - ,"max(birthday)" - ,"avg(birthday) as sex_avg" + "id", + "user_name", + "max(birthday)", + "avg(birthday) as sex_avg" ); List employees = employeeMapper.selectList(queryWrapper); ```` -> 缺点:字段硬编码,容易错处。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。 +> 缺点:字段硬编码,容易拼错。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。 **Fluent-MyBatis:** @@ -153,16 +167,21 @@ OR (age IN (18,19,20) AND user_name LIKE "%michael%" ) QueryWrapper query = QueryWrapper.create() .where(ACCOUNT.ID.ge(100)) .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:** ```java -QueryWrapper query = new QueryWrapper<>(); -queryWrapper.ge("id",100) - .and(i->i.eq("sex",1).or(x->x.eq("sex",2))) - .or(i->i.in("age",{18,19,20}).like("user_name","michael")); +QueryWrapper query = Wrappers.query() + .ge("id", 100) + .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 lambda +LambdaQueryWrapper query = Wrappers.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:** diff --git a/readme_zh.md b/readme_zh.md index 0eb8ed8a..9b54667e 100644 --- a/readme_zh.md +++ b/readme_zh.md @@ -86,9 +86,9 @@ class HelloWorld { ```java //示例2:通过 QueryWrapper 构建条件查询数据列表 -QueryWrapper query=QueryWrapper.create() +QueryWrapper query = QueryWrapper.create() .select() - .from(ACCOUNT) + .from(ACCOUNT) // 单表查询时表名可省略,自动使用Mapper泛型对应的表 .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.like("张").or(ACCOUNT.USER_NAME.like("李"))); @@ -96,7 +96,7 @@ QueryWrapper query=QueryWrapper.create() // ELECT * FROM tb_account // WHERE tb_account.id >= 100 // AND (tb_account.user_name LIKE '%张%' OR tb_account.user_name LIKE '%李%' ) -List accounts = mapper.selectListByQuery(query); +List accounts = accountMapper.selectListByQuery(query); ``` 示例3:分页查询 @@ -117,7 +117,7 @@ QueryWrapper query=QueryWrapper.create() // AND (user_name LIKE '%张%' OR user_name LIKE '%李%' ) // ORDER BY `id` DESC // LIMIT 40,10 -Page accounts = mapper.paginate(5,10,query); +Page accounts = mapper.paginate(5, 10, query); ``` ## QueryWrapper 示例 @@ -125,20 +125,30 @@ Page accounts = mapper.paginate(5,10,query); ### select * ```java -QueryWrapper query=new QueryWrapper(); -query.select().from(ACCOUNT) +QueryWrapper query = new QueryWrapper(); +query.select().from(ACCOUNT); // SQL: // 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 简单示例: ```java -QueryWrapper query=new QueryWrapper(); -query.select(ACCOUNT.ID,ACCOUNT.USER_NAME) - .from(ACCOUNT) +QueryWrapper query = new QueryWrapper(); +query.select(ACCOUNT.ID, ACCOUNT.USER_NAME) + .from(ACCOUNT); // SQL: // SELECT id, user_name @@ -164,7 +174,7 @@ QueryWrapper query = new QueryWrapper() ### select functions ```java -QueryWrapper query=new QueryWrapper() +QueryWrapper query = new QueryWrapper() .select( ACCOUNT.ID, ACCOUNT.USER_NAME, @@ -180,9 +190,10 @@ QueryWrapper query=new QueryWrapper() ``` ### where - ```java -QueryWrapper queryWrapper=QueryWrapper.create() +Integer num = 100; +String userName = "michael"; +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) @@ -221,6 +232,21 @@ QueryWrapper queryWrapper = QueryWrapper.create() // SELECT * FROM tb_account // 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 @@ -262,7 +288,7 @@ QueryWrapper queryWrapper=QueryWrapper.create() ### and (...) or (...) ```java -QueryWrapper queryWrapper=QueryWrapper.create() +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) @@ -279,7 +305,7 @@ QueryWrapper queryWrapper=QueryWrapper.create() ### group by ```java -QueryWrapper queryWrapper=QueryWrapper.create() +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME); @@ -292,7 +318,7 @@ QueryWrapper queryWrapper=QueryWrapper.create() ### having ```java -QueryWrapper queryWrapper=QueryWrapper.create() +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME) @@ -307,7 +333,7 @@ QueryWrapper queryWrapper=QueryWrapper.create() ### orderBy ```java -QueryWrapper queryWrapper=QueryWrapper.create() +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .orderBy(ACCOUNT.AGE.asc() @@ -321,7 +347,7 @@ QueryWrapper queryWrapper=QueryWrapper.create() ### join ```java -QueryWrapper queryWrapper=QueryWrapper.create() +QueryWrapper queryWrapper = QueryWrapper.create() .select() .from(ACCOUNT) .leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)) @@ -400,31 +426,31 @@ Db + Row 工具类,提供了在 Entity 实体类之外的数据库操作能力 ```java //使用原生 SQL 插入数据 String sql="insert into tb_account(id,name) value (?, ?)"; -Db.insertBySql(sql,1,"michael"); +Db.insertBySql(sql, 1, "michael"); //使用 Row 插入数据 -Row account=new Row(); -account.set("id",100); -account.set("name","Michael"); -Db.insert("tb_account",account); +Row account = new Row(); +account.set("id", 100); +account.set("name", "Michael"); +Db.insert("tb_account", account); //根据主键查询数据 -Row row=Db.selectOneById("tb_account","id",1); +Row row = Db.selectOneById("tb_account", "id", 1); //Row 可以直接转换为 Entity 实体类,且性能极高 -Account account=row.toEntity(Account.class); +Account account = row.toEntity(Account.class); //查询所有大于 18 岁的用户 -String listsql="select * from tb_account where age > ?" -List rows=Db.selectListBySql(sql,18); +String listsql = "select * from tb_account where age > ?" +List rows = Db.selectListBySql(sql, 18); //分页查询:每页 10 条数据,查询第 3 页的年龄大于 18 的用户 -QueryWrapper query=QueryWrapper.create() +QueryWrapper query = QueryWrapper.create() .where(ACCOUNT.AGE.ge(18)); -Page rowPage=Db.paginate("tb_account",3,10,query); +Page rowPage = Db.paginate("tb_account", 3, 10, query); ``` > Db 工具类还提供了更多 增、删、改、查和分页查询等方法。 @@ -444,7 +470,7 @@ update(T entity) 有些场景下,我们可能希望只更新 几个 字段,而其中个别字段需要更新为 null。此时需要用到 `UpdateEntity` 工具类,以下是示例代码: ```java -Account account=UpdateEntity.of(Account.class); +Account account = UpdateEntity.of(Account.class); account.setId(100); account.setUserName(null); account.setSex(1); @@ -466,7 +492,7 @@ set user_name = ?, sex = ? where id = ? ## 自定义 TypeHandler -使用 @column 注解: +使用 @Column 注解: ```java @Table("tb_account") @@ -488,7 +514,6 @@ public class Account { } options.put(key, value); } - } ``` @@ -503,7 +528,7 @@ account.addOption("c3", new Date()); ``` 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) ``` @@ -545,7 +570,7 @@ public class UUIDKeyGenerator implements IKeyGenerator { 第 2 步:注册 UUIDKeyGenerator ```java -KeyGeneratorFactory.register("myUUID",new UUIDKeyGenerator()); +KeyGeneratorFactory.register("myUUID", new UUIDKeyGenerator()); ``` 第 3 步:在 Entity 里使用 "myUUID" 生成器: