SpringBoot集成Groovy、Mybatis注解 实现动态SQL,帮你摆脱繁琐的XML配置

SpringBoot的超简洁配置,为我们省去了宝贵的配置时间。

Mybatis3在这方面也提供了很好的支持,通过注解让我们摆脱了繁琐的mapper xml,写DAO层的时候再也不用在java接口和xml配置来回切换了,无疑提升了代码的可读性。

但很不幸,Mybatis3在复杂的动态SQL方面的支持,需要再写**Provider来构建SQL语句,这样的设计感觉有点顾此失彼,本来好端端的通过注解省去了xml配置,但是一遇到动态SQL,又得构建类来处理,让人又爱又恨。看看下面的代码:

package com.syj.test.mybatis;

import com.syj.test.thread.People;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;

/**
 * Created by syj on 2019/2/3.
 */
@Mapper
public interface PeopleDAO {

    //使用UserDaoProvider类的findUserByName方法来生成sql
    @SelectProvider(type = UserDaoProvider.class, method = "findUserByName")
    List<People> findPeople(People people);

    class UserDaoProvider {
        public String findUserByName(People peo) {
            String sql = "SELECT * FROM user";
            if(peo.getName()!=null){
                sql += " where name = #{name}";
            }
            return sql;
        }
    }
}

那有没有更好的方式,不需要引入新的代码复杂度来实现简洁的DAO层代码呢?

答案是肯定的,Groovy堪当重任,先来了解下Groovy

Apache的Groovy是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用,Groovy代码动态地编译成运行于Java虚拟机(JVM)上的Java字节码,并与其他Java代码和库进行互操作。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也匹配Groovy的语法规则,尽管可能语义不同。 Groovy 1.0于2007年1月2日发布,并于2012年7月发布了Groovy 2.0。从版本2开始,Groovy也可以静态编译,提供类型推论和Java相近的性能。Groovy 2.4是Pivotal软件赞助的最后一个主要版本,截止于2015年3月。Groovy已经将其治理结构更改为Apache软件基金会的项目管理委员会(PMC)[1]。

以上引自* ,当然这样班门弄斧的拷贝不太好,一句话来说明白:Groovy语言同样能生成字节码文件,通过jvm运行,这门动态语言,可以理解为Java语言的兄弟,只不过这个兄弟让你的代码更简洁。

那接下来我们一步一步的让我们的代码更简洁:

  • 1.构建SpringBoot项目,版本2.0.0-release,自动引入的Mybatis版本为3.4.6

  • 2.application.properties中进行mybatis的配置

# mybatis配置(下划线到驼峰的自动转换)
mybatis.configuration.map-underscore-to-camel-case=true

  • 3.引入pom文件中引入groovy包,支持对groovy文件的编译:
<dependency>
		<groupId>org.codehaus.groovy</groupId>
		<artifactId>groovy-all</artifactId>
		<version>2.4.8</version>
</dependency>
  • 4.在DAO层创建groovy文件夹,并且Mark Direction as Source Root,然后在该包下新建groovy文件作为Mapper:对应的包下New–>File,填写对应的文件名,如下

SpringBoot集成Groovy、Mybatis注解 实现动态SQL,帮你摆脱繁琐的XML配置
填写对应的接口名,及对应的SQL,注意,这里引入<script>标签后可以使用SQL标签,比如if、where、foreach等,这种效果就像在类里写以前xml中的SQL语句,把xml和接口方法完整的合二为一,如下:

import com.jd.id.activity.domain.wps.People
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param
import org.apache.ibatis.annotations.Select


@Mapper
interface PeopleDAO {

    @Select("""<script>
                SELECT * FROM user 
                WHERE 1=1
                    <if test="query.name != null"> AND name like #{query.name}</if>
                    <if test="query.addr != null"> AND addr = #{query.addr}</if>
                    <if test="query.age != null"> AND age = #{query.age}</if>
               </script>
            """)
    List<People> findPeople(@Param("query") People people);
}

对应的目录结构如图:
SpringBoot集成Groovy、Mybatis注解 实现动态SQL,帮你摆脱繁琐的XML配置

  • 5.最后,就可以在你的service层引入该DAO,这里就不再详细描述了,最后*的进行数据库操作。

~ End ~