2018-11-06 · Develop

SpringBoot 集成 MyBatis

有了前面 SpringBoot 整合 JDBC TemplateData JPA ,现在根据 MyBatis 文档 对 MyBatis 进行整合。

依赖自然是不用说的了

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

MyBatis 的核心配置并不多

mybatis:
  # xml 文件
  mapper-locations: classpath:mapper/**/*.xml
  # config-locations:  # MyBatis 的基础配置文件
  # 这里指定 Bean 的路径是避免遇到同名 Class 找不到 Bean 的情况
  type-aliases-package: com.zuojl.lo.modules.**.entity
  configuration:
    # 开启驼峰转换
    map-underscore-to-camel-case: true
    call-setters-on-nulls: true
    cache-enabled: false

实体类如下:

@Builder
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Long departmentId;
    private Date createTime;
}

然后就是 Mapper 类

public interface UserMapper {

    User selectById(Long id);
}

Mapper 类的相应 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zuojl.lo.modules.test.dao.UserMapper">

    <select id="selectById" parameterType="long" resultType="com.zuojl.lo.modules.test.entity.User">
        select * from user where id = #{id}
    </select>
</mapper>

创建 Spring Boot 主类,并在主类中扫描 Mapper 类路径

@SpringBootApplication
@MapperScan("com.zuojl.lo.modules.**.dao")
public class LoApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoApplication.class, args);
    }
}

最后使用测试类进行测试

@RunWith(SpringRunner.class)
@SpringBootTest
// @Transactional
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void selectById() throws Exception {
        User user = userMapper.selectById(1L);
        Assert.assertEquals(1L, user.getId().longValue());
    }
}

分页查询需要插件的支持, 这里选择 pagehelper 插件进行实现,添加插件依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

Dao 层的 Mapper 文件增加方法

List<User> selectPage();

在 xml 文件中编写 sql 语句

<select id="selectPage" resultType="com.zuojl.lo.modules.test.entity.User">
    select * from user
</select>

然后进行测试

@Test
public void selectPage() throws Exception {
    PageHelper.startPage(1, 1);
    List<User> userList = userMapper.selectPage();
    PageInfo<User> userPageInfo = new PageInfo<>(userList);
    Assert.assertEquals(1, userPageInfo.getSize());
}

使用 generator 插件进行代码自动生成,首先配置 generatorConfig.xml 参数

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!--导入属性配置-->
    <!--<properties resource="dataSource.properties"/>-->
    <!--指定数据库驱动JAR包位置-->
    <!--<classPathEntry location="D:\repository\mysql\mysql-connector-java\8.0.13\mysql-connector-java-8.0.13.jar"/>-->

    <context id="context" targetRuntime="MyBatis3">
        <!--optional,旨在创建 class 时,对注释进行控制-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="false"/>
        </commentGenerator>

        <!--JDBC 的数据库连接-->
        <jdbcConnection userId="lo" password="lo" driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://192.168.113.131:3306/lo?useUnicode=true&characterEncoding=UTF-8 &autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull"/>

        <!-- 非必需,类型处理器,在数据库类型和 java 类型之间的转换控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- Model 模型生成器,用来生成含有主键 key 的类,记录类 以及查询Example类
           targetPackage     指定生成的 model 生成所在的包名
           targetProject     指定在该项目下所在的路径
       -->
        <!--<javaModelGenerator targetPackage="" targetProject=".\src\main\java">-->
        <javaModelGenerator targetPackage="com.zuojl.lo.modules.test.entity" targetProject="./src/main/java">
            <!-- 是否允许子包,即 targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对 model 添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否对类CHAR类型的列的数据进行 trim 操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!--mapper 映射文件生成所在的目录 为每一个数据库的表生成对应的 SqlMap 文件 -->
        <!--<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">-->
        <sqlMapGenerator targetPackage="mappers.test" targetProject="./src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 客户端代码,生成易于使用的针对 Model对 象和 XML 配置文件 的代码
                type="ANNOTATEDMAPPER",生成 Java Model 和基于注解的 Mapper 对象
                type="MIXEDMAPPER",生成基于注解的 Java Model 和相应的 Mapper 对象
                type="XMLMAPPER",生成 SQLMap XML文件和独立的 Mapper 接口
        -->

        <!-- targetPackage:mapper 接口 dao 生成的位置 -->
        <!--<javaClientGenerator type="XMLMAPPER" targetPackage="" targetProject=".\src\main\java">-->
        <javaClientGenerator targetPackage="com.zuojl.lo.modules.test.dao" type="XMLMAPPER" targetProject="./src/main/java">
            <!-- enableSubPackages:是否让 schema 作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <table schema="lo" tableName="user" domainObjectName="User"
               enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

设置 generator 插件

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.5</version>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
    </dependencies>
    <configuration>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
</plugin>

使用命令进行代码生成

mvn clean generate-sources

除了上面的 pagehelper 插件外,使用最多的是 MyBatis-Plus