瀏覽代碼

!70 增加 kotlin lambda 支持
Merge pull request !70 from 杨雨翰/master

miemie 6 年之前
父節點
當前提交
75fd1feb01

+ 31 - 9
build.gradle

@@ -1,3 +1,33 @@
+buildscript {
+    repositories {
+        maven { url "https://repo.spring.io/plugins-release" }
+    }
+    dependencies {
+        classpath("org.springframework.build.gradle:propdeps-plugin:0.0.7")
+        classpath("com.netflix.nebula:gradle-extra-configurations-plugin:4.0.1")
+    }
+}
+
+plugins {
+    id "org.jetbrains.kotlin.jvm" version "1.3.0"
+}
+repositories {
+    mavenCentral()
+}
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
+}
+compileKotlin {
+    kotlinOptions {
+        jvmTarget = "1.8"
+    }
+}
+compileTestKotlin {
+    kotlinOptions {
+        jvmTarget = "1.8"
+    }
+}
+
 ext {
 ext {
     configuration = [
     configuration = [
         javaVersion = JavaVersion.VERSION_1_8
         javaVersion = JavaVersion.VERSION_1_8
@@ -12,6 +42,7 @@ ext {
     ]
     ]
 
 
     dependencies = [
     dependencies = [
+        "kotlin-reflect"                    : "org.jetbrains.kotlin:kotlin-reflect:1.2.71",
         "jsqlparser"                        : "com.github.jsqlparser:jsqlparser:${jsqlparserVersion}",
         "jsqlparser"                        : "com.github.jsqlparser:jsqlparser:${jsqlparserVersion}",
         "mybatis-spring"                    : "org.mybatis:mybatis-spring:${mybatisSpringVersion}",
         "mybatis-spring"                    : "org.mybatis:mybatis-spring:${mybatisSpringVersion}",
         "mybatis"                           : "org.mybatis:mybatis:${mybatisVersion}",
         "mybatis"                           : "org.mybatis:mybatis:${mybatisVersion}",
@@ -63,15 +94,6 @@ allprojects {
 
 
 description = "Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作"
 description = "Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作"
 
 
-buildscript {
-    repositories {
-        maven { url "https://repo.spring.io/plugins-release" }
-    }
-    dependencies {
-        classpath("org.springframework.build.gradle:propdeps-plugin:0.0.7")
-        classpath("com.netflix.nebula:gradle-extra-configurations-plugin:4.0.1")
-    }
-}
 
 
 configure(subprojects) {
 configure(subprojects) {
     apply plugin: 'propdeps'
     apply plugin: 'propdeps'

+ 6 - 0
mybatis-plus-extension/build.gradle

@@ -1,3 +1,6 @@
+plugins {
+    id "org.jetbrains.kotlin.jvm"
+}
 apply plugin: 'java'
 apply plugin: 'java'
 
 
 sourceCompatibility = 1.8
 sourceCompatibility = 1.8
@@ -6,12 +9,15 @@ dependencies {
     compile project(":mybatis-plus-core")
     compile project(":mybatis-plus-core")
     compile rootProject.ext.dependencies["mybatis-spring"]
     compile rootProject.ext.dependencies["mybatis-spring"]
     compile rootProject.ext.dependencies["mybatis"]
     compile rootProject.ext.dependencies["mybatis"]
+    compile rootProject.ext.dependencies["kotlin-reflect"]
 
 
     provided rootProject.ext.dependencies["spring-context-support"]
     provided rootProject.ext.dependencies["spring-context-support"]
     provided rootProject.ext.dependencies["spring-jdbc"]
     provided rootProject.ext.dependencies["spring-jdbc"]
     provided rootProject.ext.dependencies["javax.servlet-api"]
     provided rootProject.ext.dependencies["javax.servlet-api"]
     provided rootProject.ext.dependencies["slf4j-api"]
     provided rootProject.ext.dependencies["slf4j-api"]
 
 
+
+
     testCompile rootProject.ext.dependencies["spring-web"]
     testCompile rootProject.ext.dependencies["spring-web"]
     testCompile rootProject.ext.dependencies["javax.servlet-api"]
     testCompile rootProject.ext.dependencies["javax.servlet-api"]
     testCompile rootProject.ext.dependencies["spring-test"]
     testCompile rootProject.ext.dependencies["spring-test"]

+ 44 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/kotlin/AbstractLambdaWrapperKt.kt

@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.extension.kotlin
+
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
+import com.baomidou.mybatisplus.core.toolkit.LambdaUtils
+import kotlin.reflect.KProperty
+
+/**
+ *
+ *
+ * Lambda 语法使用 Wrapper
+ * 统一处理解析 lambda 获取 column
+ *
+ *
+ * @author yangyuhan
+ * @since 2018-11-07
+ */
+abstract class AbstractLambdaWrapperKt<T, This : AbstractLambdaWrapperKt<T, This>> : AbstractWrapper<T, KProperty<*>, This>() {
+
+    private var columnMap: Map<String, String>? = null
+
+
+    override fun columnToString(kProperty: KProperty<*>): String? {
+        if (columnMap == null) {
+            columnMap = LambdaUtils.getColumnMap(this.entityClass.name)
+        }
+        return columnMap?.get(kProperty.name)
+    }
+
+}

+ 121 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/kotlin/LambdaQueryWrapperkt.kt

@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.extension.kotlin
+
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils
+import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper
+import java.util.concurrent.atomic.AtomicInteger
+import java.util.function.Predicate
+import kotlin.reflect.KProperty
+
+/**
+ *
+ *
+ * Kotlin Lambda 语法使用 Wrapper
+ *
+ *
+ * @author yangyuhan
+ * @since 2018-11-02
+ */
+class LambdaQueryWrapperkt<T : Any> : AbstractLambdaWrapperKt<T, LambdaQueryWrapperkt<T>> {
+
+    /**
+     * 查询字段
+     */
+    private var sqlSelect: String? = null
+
+
+    constructor(entity: T) {
+        this.entity = entity
+        this.initEntityClass()
+        this.initNeed()
+    }
+
+    internal constructor(entity: T, entityClass: Class<T>?, sqlSelect: String?, paramNameSeq: AtomicInteger, paramNameValuePairs: Map<String, Any>,
+                         mergeSegments: MergeSegments) {
+        this.entity = entity
+        this.paramNameSeq = paramNameSeq
+        this.paramNameValuePairs = paramNameValuePairs
+        this.expression = mergeSegments
+        this.sqlSelect = sqlSelect
+        this.entityClass = entityClass
+    }
+
+    /**
+     *
+     *
+     * SELECT 部分 SQL 设置
+     *
+     *
+     * @param columns 查询字段
+     */
+    @SafeVarargs
+    fun select(vararg columns: KProperty<*>): LambdaQueryWrapperkt<T> {
+        if (ArrayUtils.isNotEmpty(columns)) {
+            this.sqlSelect = this.columnsToString(*columns)
+        }
+        return typedThis
+    }
+
+    fun select(predicate: Predicate<TableFieldInfo>): LambdaQueryWrapperkt<T> {
+        return select(entityClass, predicate)
+    }
+
+    /**
+     *
+     *
+     * 过滤查询的字段信息(主键除外!)
+     *
+     *
+     *
+     * 例1: 只要 java 字段名以 "test" 开头的              -> select(i -> i.getProperty().startsWith("test"))
+     * 例2: 只要 java 字段属性是 CharSequence 类型的       -> select(TableFieldInfo::isCharSequence)
+     * 例3: 只要 java 字段没有填充策略的                   -> select(i -> i.getFieldFill == FieldFill.DEFAULT)
+     * 例4: 要全部字段                                   -> select(i -> true)
+     * 例5: 只要主键字段                                 -> select(i -> false)
+     *
+     *
+     * @param predicate 过滤方式
+     * @return this
+     */
+    fun select(entityClass: Class<T>, predicate: Predicate<TableFieldInfo>): LambdaQueryWrapperkt<T> {
+        this.entityClass = entityClass
+        this.sqlSelect = TableInfoHelper.getTableInfo(checkEntityClass).chooseSelect(predicate)
+        return typedThis
+    }
+
+    override fun getSqlSelect(): String? {
+        return sqlSelect
+    }
+
+    /**
+     *
+     *
+     * 用于生成嵌套 sql
+     * 故 sqlSelect 不向下传递
+     *
+     */
+    override fun instance(paramNameSeq: AtomicInteger, paramNameValuePairs: Map<String, Any>): LambdaQueryWrapperkt<T> {
+        return LambdaQueryWrapperkt(entity, entityClass, null, paramNameSeq, paramNameValuePairs, MergeSegments())
+    }
+
+
+
+
+}
+

+ 80 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/kotlin/LambdaUpdateWrapperKt.kt

@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.extension.kotlin
+
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils
+import com.baomidou.mybatisplus.core.toolkit.StringPool
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils
+import java.util.concurrent.atomic.AtomicInteger
+import java.util.stream.Collectors.joining
+import kotlin.reflect.KProperty
+
+
+/**
+ *
+ *
+ * Kotlin Lambda 更新封装
+ *
+ *
+ * @author yangyuhan
+ * @since 2018-11-02
+ */
+class LambdaUpdateWrapperKt<T:Any>: AbstractLambdaWrapperKt<T, LambdaUpdateWrapperKt<T>>   {
+
+    /**
+     * SQL 更新字段内容,例如:name='1',age=2
+     */
+    private val sqlSet = ArrayList<String>()
+
+
+    constructor(entity: T) {
+        this.entity = entity
+        this.initEntityClass()
+        this.initNeed()
+    }
+
+
+    constructor(entity: T, paramNameSeq: AtomicInteger, paramNameValuePairs: Map<String, Any>,
+                mergeSegments: MergeSegments) {
+        this.entity = entity
+        this.paramNameSeq = paramNameSeq
+        this.paramNameValuePairs = paramNameValuePairs
+        this.expression = mergeSegments
+
+    }
+
+    override fun getSqlSet(): String? {
+        return if (CollectionUtils.isEmpty(sqlSet)) {
+            null
+        } else SqlUtils.stripSqlInjection(sqlSet.stream().collect(joining(StringPool.COMMA)))
+    }
+
+    operator fun set(column: KProperty<*>, `val`: Any): LambdaUpdateWrapperKt<T> {
+        return this.set(true, column, `val`)
+    }
+
+    operator fun set(condition: Boolean, column: KProperty<*>, `val`: Any): LambdaUpdateWrapperKt<T> {
+        if (condition) {
+            sqlSet.add(String.format("%s=%s", columnToString(column), formatSql("{0}", `val`)))
+        }
+        return typedThis
+    }
+
+    override fun instance(paramNameSeq: AtomicInteger, paramNameValuePairs: Map<String, Any>): LambdaUpdateWrapperKt<T> {
+        return LambdaUpdateWrapperKt(entity, paramNameSeq, paramNameValuePairs, MergeSegments())
+    }
+}