浏览代码

update README

D.Yang 6 年之前
父节点
当前提交
5fc11a37d2

+ 103 - 0
README-zh.md

@@ -0,0 +1,103 @@
+<p align="center">
+  <a href="https://github.com/baomidou/mybatis-plus">
+   <img alt="Mybatis-Plus-Logo" src="https://raw.githubusercontent.com/baomidou/logo/master/mybatis-plus-logo-new-mini.png">
+  </a>
+</p>
+
+<p align="center">
+  为简化开发工作、提高生产率而生
+</p>
+
+<p align="center">
+  <a href="http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.baomidou%22%20AND%20a%3A%22mybatis-plus%22">
+    <img alt="maven" src="https://img.shields.io/maven-central/v/com.baomidou/mybatis-plus.svg?style=flat-square">
+  </a>
+
+  <a href="https://www.apache.org/licenses/LICENSE-2.0">
+    <img alt="code style" src="https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square">
+  </a>
+</p>
+
+# 简介 | Intro
+
+Mybatis 增强工具包 - 只做增强不做改变,简化`CRUD`操作
+
+技术讨论 QQ 群 : 576493122 🈵  、  648281531 、  643509491
+
+# 优点 | Advantages
+
+- **无侵入**:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
+- **依赖少**:仅仅依赖 Mybatis 以及 Mybatis-Spring
+- **损耗小**:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
+- **预防Sql注入**:内置Sql注入剥离器,有效预防Sql注入攻击
+- **通用CRUD操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
+- **多种主键策略**:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
+- **支持热加载**:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
+- **支持ActiveRecord**:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
+- **支持代码生成**:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
+- **支持自定义全局通用操作**:支持全局通用方法注入( Write once, use anywhere )
+- **支持关键词自动转义**:支持数据库关键词(order、key......)自动转义,还可自定义关键词
+- **内置分页插件**:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询
+- **内置性能分析插件**:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
+- **内置全局拦截插件**:提供全表 delete 、 update 操作智能分析阻断,预防误操作
+
+# 文档 | Documentation
+
+[中文](http://mp.baomidou.com/)
+
+# 原理 | Principle
+
+[Mybatis-Plus 实践及架构原理](http://git.oschina.net/baomidou/mybatis-plus/attach_files)
+
+# 应用实例 | Demo
+
+[Spring-MVC](https://git.oschina.net/baomidou/mybatisplus-spring-mvc)
+
+[Spring-Boot](https://git.oschina.net/baomidou/mybatisplus-spring-boot)
+
+[mybatisplus-sharding-jdbc](https://gitee.com/baomidou/mybatisplus-sharding-jdbc)
+
+[SSM-实战 Demo](http://git.oschina.net/juapk/SpringWind)
+
+# 下载地址 | Download
+
+[点此去下载](http://maven.aliyun.com/nexus/#nexus-search;quick~mybatis-plus)
+
+```xml
+<dependency>
+    <groupId>com.baomidou</groupId>
+    <artifactId>mybatis-plus</artifactId>
+    <version>maven 官方最新版本为准</version>
+</dependency>
+```
+
+# 结构目录 | Architecture
+
+![项目结构说明](http://git.oschina.net/uploads/images/2016/0821/161516_58956b85_12260.png "项目结构说明")
+
+# 其他开源项目 | Other Project
+
+- [基于Cookie的SSO中间件 Kisso](http://git.oschina.net/baomidou/kisso)
+- [Java快速开发框架 SpringWind](http://git.oschina.net/juapk/SpringWind)
+- [基于Hibernate扩展 Hibernate-Plus](http://git.oschina.net/baomidou/hibernate-plus)
+
+# 王者荣耀
+![MPTrophy](https://gitee.com/uploads/images/2018/0102/101803_2fdba060_12260.jpeg)
+
+# 期望 | Futures
+
+> 欢迎提出更好的意见,帮助完善 Mybatis-Plus
+
+# 版权 | License
+
+[Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+# 捐赠 | Donate
+
+> [捐赠记录,感谢你们的支持!](http://git.oschina.net/baomidou/kisso/wikis/%E6%8D%90%E8%B5%A0%E8%AE%B0%E5%BD%95)
+
+![捐赠 mybatis-plus](http://git.oschina.net/uploads/images/2015/1222/211207_0acab44e_12260.png "支持一下mybatis-plus")
+
+# 关注我 | About Me
+
+![程序员日记](http://git.oschina.net/uploads/images/2016/0121/093728_1bc1658f_12260.png "程序员日记")

+ 72 - 85
README.md

@@ -1,11 +1,13 @@
 <p align="center">
   <a href="https://github.com/baomidou/mybatis-plus">
-   <img alt="Mybatis-Plus-Logo" src="http://git.oschina.net/uploads/images/2016/0824/211639_4d931e7f_12260.png">
+   <img alt="Mybatis-Plus-Logo" src="https://raw.githubusercontent.com/baomidou/logo/master/mybatis-plus-logo-new-mini.png">
   </a>
 </p>
 
+<h2 align="center">MyBatis-Plus</h2>
+
 <p align="center">
-  为简化开发工作、提高生产率而生
+  Born To Simplify Development
 </p>
 
 <p align="center">
@@ -18,86 +20,71 @@
   </a>
 </p>
 
-# 简介 | Intro
-
-Mybatis 增强工具包 - 只做增强不做改变,简化`CRUD`操作
-
-技术讨论 QQ 群 : 576493122 🈵  、  648281531 、  643509491
-
-# 优点 | Advantages
-
-- **无侵入**:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
-- **依赖少**:仅仅依赖 Mybatis 以及 Mybatis-Spring
-- **损耗小**:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
-- **预防Sql注入**:内置Sql注入剥离器,有效预防Sql注入攻击
-- **通用CRUD操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
-- **多种主键策略**:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
-- **支持热加载**:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
-- **支持ActiveRecord**:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
-- **支持代码生成**:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
-- **支持自定义全局通用操作**:支持全局通用方法注入( Write once, use anywhere )
-- **支持关键词自动转义**:支持数据库关键词(order、key......)自动转义,还可自定义关键词
-- **内置分页插件**:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询
-- **内置性能分析插件**:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
-- **内置全局拦截插件**:提供全表 delete 、 update 操作智能分析阻断,预防误操作
-
-# 文档 | Documentation
-
-[中文](http://mp.baomidou.com/)
-
-# 原理 | Principle
-
-[Mybatis-Plus 实践及架构原理](http://git.oschina.net/baomidou/mybatis-plus/attach_files)
-
-# 应用实例 | Demo
-
-[Spring-MVC](https://git.oschina.net/baomidou/mybatisplus-spring-mvc)
-
-[Spring-Boot](https://git.oschina.net/baomidou/mybatisplus-spring-boot)
-
-[mybatisplus-sharding-jdbc](https://gitee.com/baomidou/mybatisplus-sharding-jdbc)
-
-[SSM-实战 Demo](http://git.oschina.net/juapk/SpringWind)
-
-# 下载地址 | Download
-
-[点此去下载](http://maven.aliyun.com/nexus/#nexus-search;quick~mybatis-plus)
-
-```xml
-<dependency>
-    <groupId>com.baomidou</groupId>
-    <artifactId>mybatis-plus</artifactId>
-    <version>maven 官方最新版本为准</version>
-</dependency>
-```
-
-# 结构目录 | Architecture
-
-![项目结构说明](http://git.oschina.net/uploads/images/2016/0821/161516_58956b85_12260.png "项目结构说明")
-
-# 其他开源项目 | Other Project
-
-- [基于Cookie的SSO中间件 Kisso](http://git.oschina.net/baomidou/kisso)
-- [Java快速开发框架 SpringWind](http://git.oschina.net/juapk/SpringWind)
-- [基于Hibernate扩展 Hibernate-Plus](http://git.oschina.net/baomidou/hibernate-plus)
-
-# 王者荣耀
-![MPTrophy](https://gitee.com/uploads/images/2018/0102/101803_2fdba060_12260.jpeg)
-
-# 期望 | Futures
-
-> 欢迎提出更好的意见,帮助完善 Mybatis-Plus
-
-# 版权 | License
-
-[Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-# 捐赠 | Donate
-
-> [捐赠记录,感谢你们的支持!](http://git.oschina.net/baomidou/kisso/wikis/%E6%8D%90%E8%B5%A0%E8%AE%B0%E5%BD%95)
-
-![捐赠 mybatis-plus](http://git.oschina.net/uploads/images/2015/1222/211207_0acab44e_12260.png "支持一下mybatis-plus")
-
-# 关注我 | About Me
-
-![程序员日记](http://git.oschina.net/uploads/images/2016/0121/093728_1bc1658f_12260.png "程序员日记")
+---
+
+## What is MyBatis-Plus?
+
+MyBatis-Plus is an powerful enhanced toolkit of MyBatis for simplify development. This toolkit provides some efficient, useful, out-of-the-box features for MyBatis, use it can effectively save your development time.
+
+## Links
+
+-   [Documentation](https://mybatis.plus)
+-   [Samples](https://github.com/baomidou/mybatis-plus-samples.git)
+-   [Showcase](https://github.com/baomidou/awosome-mybaits-plus)
+
+## Features
+
+-   Fully compatible with MyBatis
+-   Auto configuration on startup
+-   Out-of-the-box interfaces for operate database
+-   Powerful and flexible where condition wrapper
+-   Multiple strategy to generate primary key
+-   Lambda-style API
+-   Almighty and highly customizable code generator
+-   Automatic paging operation
+-   SQL Injection defense
+-   Support active record
+-   Support pluggable custom interface
+-   Build-in many extensions
+
+## Getting started
+
+-   Create a basic Maven or Gradle spring boot project
+-   Add MyBatis-Plus dependency
+    -   Maven:
+        ```xml
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.6</version>
+        </dependency>
+        ```
+    -   Gradle
+        ```groovy
+        compile group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.0.6'
+        ```
+-   Modify mapper file extends BaseMapper interface
+    ```java
+    public interface UserMapper extends BaseMapper<User> {
+
+    }
+    ```
+-   Use it
+    ```java
+    List<User> userList = userMapper.selectList(
+            new QueryWrapper<User>()
+                    .lambda()
+                    .ge(User::getAge, 18)
+    );
+    ```
+    SQL executed
+    ```sql
+    SELECT * FROM user WHERE age >= 18
+    ```
+
+## Reporting bugs
+
+
+## License
+
+MyBatis-Plus is under the Apache 2.0 license. See the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) file for details.

+ 1 - 1
build.gradle

@@ -70,7 +70,7 @@ ext {
 
 allprojects {
     group = 'com.baomidou'
-    version = '3.0.7.3-SNAPSHOT'
+    version = '3.0.7.4-SNAPSHOT'
 }
 
 description = "Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作"

+ 3 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractLambdaWrapper.java

@@ -57,15 +57,15 @@ public abstract class AbstractLambdaWrapper<T, This extends AbstractLambdaWrappe
     }
 
     private String getColumn(SerializedLambda lambda) {
-        String fieldName = StringUtils.resolveFieldName(lambda.getImplMethodName()).toUpperCase(Locale.ENGLISH);
-        if (!initColumnMap || !columnMap.containsKey(fieldName)) {
+        String fieldName = StringUtils.resolveFieldName(lambda.getImplMethodName());
+        if (!initColumnMap || !columnMap.containsKey(fieldName.toUpperCase(Locale.ENGLISH))) {
             String entityClassName = lambda.getImplClassName();
             columnMap = LambdaUtils.getColumnMap(entityClassName);
             Assert.notEmpty(columnMap, "cannot find column's cache for %s, so you cannot used %s!",
                 entityClassName, typedThis.getClass());
             initColumnMap = true;
         }
-        return Optional.ofNullable(columnMap.get(fieldName))
+        return Optional.ofNullable(columnMap.get(fieldName.toUpperCase(Locale.ENGLISH)))
             .orElseThrow(() -> ExceptionUtils.mpe("your property named %s cannot find the corresponding database column name!", fieldName));
     }
 }

+ 67 - 10
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -15,25 +15,54 @@
  */
 package com.baomidou.mybatisplus.core.conditions;
 
-import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
-import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
-import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
-import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
-import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
-import com.baomidou.mybatisplus.core.enums.SqlKeyword;
-import com.baomidou.mybatisplus.core.toolkit.*;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.AND;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ASC;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.BETWEEN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.DESC;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EXISTS;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IN;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NOT_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IS_NULL;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LIKE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.LT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NE;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.NOT;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.OR;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
+import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
+import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.LEFT_BRACKET;
+import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.RIGHT_BRACKET;
+import static java.util.stream.Collectors.joining;
 
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiPredicate;
 import java.util.function.Function;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
-import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.*;
-import static java.util.stream.Collectors.joining;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList;
+import com.baomidou.mybatisplus.core.enums.SqlKeyword;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 
 /**
@@ -446,6 +475,34 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
         return null;
     }
 
+    @Override
+    public String getCustomSqlSegment() {
+        MergeSegments expression = getExpression();
+        if (Objects.nonNull(expression)) {
+            NormalSegmentList normal = expression.getNormal();
+            String sqlSegment = getSqlSegment();
+            if (StringUtils.isNotEmpty(sqlSegment)) {
+                if (normal.isEmpty()) {
+                    return sqlSegment;
+                } else {
+                    return concatWhere(sqlSegment);
+                }
+            }
+        }
+        return StringUtils.EMPTY;
+    }
+
+    /**
+     * 拼接`WHERE`至SQL前
+     *
+     * @param sql
+     * @return
+     */
+    private String concatWhere(String sql) {
+        return Constants.WHERE + " " + sql;
+    }
+
+
     @Override
     public MergeSegments getExpression() {
         return expression;

+ 11 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/Wrapper.java

@@ -64,6 +64,17 @@ public abstract class Wrapper<T> implements ISqlSegment {
      */
     public abstract MergeSegments getExpression();
 
+    /**
+     * 获取自定义SQL 简化自定义XML复杂情况
+     * 使用方法
+     * `自定义sql` + ${ew.customSqlSegment}
+     * <p>1.逻辑删除需要自己拼接条件 (之前自定义也同样)</p>
+     * <p>2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦)</p>
+     * <p>3.用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!)</>
+     * <p>4.ew是wrapper定义别名,可自行替换</>
+     */
+    public abstract String getCustomSqlSegment();
+
     /**
      * 查询条件为空(包含entity)
      */

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper.java

@@ -87,7 +87,7 @@ public class LambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, LambdaQueryW
      * <p>
      * 例1: 只要 java 字段名以 "test" 开头的              -> select(i -> i.getProperty().startsWith("test"))
      * 例2: 只要 java 字段属性是 CharSequence 类型的       -> select(TableFieldInfo::isCharSequence)
-     * 例3: 只要 java 字段没有填充策略的                   -> select(i -> i.getFieldFill == FieldFill.DEFAULT)
+     * 例3: 只要 java 字段没有填充策略的                   -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)
      * 例4: 要全部字段                                   -> select(i -> true)
      * 例5: 只要主键字段                                 -> select(i -> false)
      * </p>

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/query/QueryWrapper.java

@@ -89,7 +89,7 @@ public class QueryWrapper<T> extends AbstractWrapper<T, String, QueryWrapper<T>>
      * <p>
      * 例1: 只要 java 字段名以 "test" 开头的              -> select(i -> i.getProperty().startsWith("test"))
      * 例2: 只要 java 字段属性是 CharSequence 类型的       -> select(TableFieldInfo::isCharSequence)
-     * 例3: 只要 java 字段没有填充策略的                   -> select(i -> i.getFieldFill == FieldFill.DEFAULT)
+     * 例3: 只要 java 字段没有填充策略的                   -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)
      * 例4: 要全部字段                                   -> select(i -> true)
      * 例5: 只要主键字段                                 -> select(i -> false)
      * </p>

+ 1 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/IPage.java

@@ -152,10 +152,8 @@ public interface IPage<T> extends Serializable {
      * <p>
      * 设置当前满足条件总行数
      * </p>
-     * <p>
-     * </p>
      */
-    IPage<T> setTotal(Long total);
+    IPage<T> setTotal(long total);
 
     /**
      * <p>

+ 4 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java

@@ -98,4 +98,8 @@ public interface Constants extends StringPool {
      * collection
      */
     String COLLECTION = "coll";
+    /**
+     * where
+     */
+    String WHERE = "WHERE";
 }

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -220,7 +220,7 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
                 page.setCurrent(1);
             }
         } catch (Exception e) {
-            throw ExceptionUtils.mpe("Error: Method queryTotal execution error of sql for %s.", e, sql);
+            throw ExceptionUtils.mpe("Error: Method queryTotal execution error of sql : \n %s \n", e, sql);
         }
     }
 

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/Page.java

@@ -146,7 +146,7 @@ public class Page<T> implements IPage<T> {
     }
 
     @Override
-    public Page<T> setTotal(Long total) {
+    public Page<T> setTotal(long total) {
         this.total = total;
         return this;
     }

+ 30 - 42
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisSqlSessionFactoryBean.java

@@ -15,25 +15,19 @@
  */
 package com.baomidou.mybatisplus.extension.spring;
 
-import static org.springframework.util.Assert.notNull;
-import static org.springframework.util.Assert.state;
-import static org.springframework.util.ObjectUtils.isEmpty;
-import static org.springframework.util.StringUtils.hasLength;
-import static org.springframework.util.StringUtils.tokenizeToStringArray;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.sql.DataSource;
-
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.MybatisXMLConfigBuilder;
+import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.enums.IEnum;
+import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.extension.handlers.EnumAnnotationTypeHandler;
+import com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler;
+import com.baomidou.mybatisplus.extension.toolkit.AopUtils;
+import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import org.apache.ibatis.builder.xml.XMLMapperBuilder;
 import org.apache.ibatis.cache.Cache;
 import org.apache.ibatis.executor.ErrorContext;
@@ -64,23 +58,18 @@ import org.springframework.core.NestedIOException;
 import org.springframework.core.io.Resource;
 import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
 
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.annotation.EnumValue;
-import com.baomidou.mybatisplus.core.MybatisConfiguration;
-import com.baomidou.mybatisplus.core.MybatisXMLConfigBuilder;
-import com.baomidou.mybatisplus.core.config.GlobalConfig;
-import com.baomidou.mybatisplus.core.enums.IEnum;
-import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.extension.handlers.EnumAnnotationTypeHandler;
-import com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler;
-import com.baomidou.mybatisplus.extension.toolkit.AopUtils;
-import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
-import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
-import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.*;
+
+import static org.springframework.util.Assert.notNull;
+import static org.springframework.util.Assert.state;
+import static org.springframework.util.ObjectUtils.isEmpty;
+import static org.springframework.util.StringUtils.hasLength;
+import static org.springframework.util.StringUtils.tokenizeToStringArray;
 
 /**
  * <p>
@@ -390,10 +379,10 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
      */
     @Override
     public void afterPropertiesSet() throws Exception {
-        notNull(dataSource, "SFunction 'dataSource' is required");
-        notNull(sqlSessionFactoryBuilder, "SFunction 'sqlSessionFactoryBuilder' is required");
+        notNull(dataSource, "Property 'dataSource' is required");
+        notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
         state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),
-            "SFunction 'configuration' and 'configLocation' can not specified with together");
+            "Property 'configuration' and 'configLocation' can not specified with together");
 
         this.sqlSessionFactory = buildSqlSessionFactory();
         //TODO: 3.0 注入到globalConfig
@@ -427,7 +416,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
             configuration = xmlConfigBuilder.getConfiguration();
         } else {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug("SFunction 'configuration' or 'configLocation' not specified, using default MyBatis Configuration");
+                LOGGER.debug("Property 'configuration' or 'configLocation' not specified, using default MyBatis Configuration");
             }
             // TODO 使用自定义配置
             configuration = new MybatisConfiguration();
@@ -650,7 +639,7 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
             }
         } else {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug("SFunction 'mapperLocations' was not specified or no matching resources found");
+                LOGGER.debug("Property 'mapperLocations' was not specified or no matching resources found");
             }
         }
         return sqlSessionFactory;
@@ -694,7 +683,6 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
         if (this.sqlSessionFactory == null) {
             afterPropertiesSet();
         }
-
         return this.sqlSessionFactory;
     }
 

+ 11 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/mysql/MysqlDataMapper.java

@@ -1,5 +1,13 @@
 package com.baomidou.mybatisplus.test.base.mapper.mysql;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.ResultType;
+import org.apache.ibatis.annotations.Select;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.test.base.entity.mysql.MysqlData;
 import com.baomidou.mybatisplus.test.base.mapper.MyBaseMapper;
 
@@ -9,4 +17,7 @@ import com.baomidou.mybatisplus.test.base.mapper.MyBaseMapper;
  */
 public interface MysqlDataMapper extends MyBaseMapper<MysqlData> {
 
+    @ResultType(MysqlData.class)
+    @Select("select * from mysql_data ${ew.customSqlSegment}")
+    List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
 }

+ 30 - 11
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -1,5 +1,22 @@
 package com.baomidou.mybatisplus.test.mysql;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -16,17 +33,6 @@ import com.baomidou.mybatisplus.test.base.mapper.commons.CommonDataMapper;
 import com.baomidou.mybatisplus.test.base.mapper.commons.CommonLogicDataMapper;
 import com.baomidou.mybatisplus.test.base.mapper.mysql.MysqlDataMapper;
 import com.baomidou.mybatisplus.test.mysql.config.MysqlDb;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.MethodSorters;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import javax.annotation.Resource;
-import java.util.*;
 
 
 /**
@@ -349,4 +355,17 @@ public class MysqlTestDataMapperTest {
         commonMapper.selectList(Wrappers.lambdaQuery(new CommonData().setTestInt(12)).orderByAsc(CommonData::getCreateDatetime));
         commonLogicMapper.selectList(Wrappers.lambdaQuery(new CommonLogicData().setTestInt(12)).orderByAsc(CommonLogicData::getCreateDatetime));
     }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void d11_testWrapperCustomSql() {
+        // 1. 只有 order by 或者 last
+        mysqlMapper.getAll(Wrappers.<MysqlData>query().lambda().orderByDesc(MysqlData::getOrder).last("limit 1"));
+        // 2. 什么都没有情况
+        mysqlMapper.getAll(Wrappers.emptyWrapper());
+        // 3. 只有 where 条件
+        mysqlMapper.getAll(Wrappers.lambdaQuery(new MysqlData()).eq(MysqlData::getGroup, 1));
+        // 4. 有 where 条件 也有 last 条件
+        mysqlMapper.getAll(Wrappers.lambdaQuery(new MysqlData()).eq(MysqlData::getGroup, 1).last("limit 1"));
+    }
 }