Spring Boot 整合 MyBatis 之 配置版

本文导读

  • Spring Boot 整合 MyBatis 之 注解版》中已经讲解了完全通过注解来使用 myBatis,非常方便
  • 习惯了以前 Spring 整合 MyBatis 开发的,如果要使用 myBatis xml 文件配置的方式,也是可以的,而且也不复杂,本文将介绍 Spring Boot 整合 myBatis 配置方式
  • 实际开发中应用中可以同时存在 myBatis 的 注解方式与配置方式,如 User 实体可以使用 注解方式进行 CRUD,Party 实体可以使用 配置方式进行 CRUD
  • Spring Boot 整合 MyBatis 之 注解版》中的 User 已经使用了注解方式成功的进行了 CRUD 操作,本文承接它新建一个 Paryt 实体进行配置方式的 CRUD,两种互不干扰。

环境准备

数据库准备

Party 实体

  • 新建 Party 实体对应数据库表

package com.lct.wmx.domain;

/**
 * Created by Administrator on 2018/8/23 0023.
 * 党支部----实体
 */
public class Party {
    /**
     * 党支部 主键 id
     */
    private Integer partyId;
    /**
     * 党支部名称
     */
    private String partyName;
    /**
     * 党支部状态
     */
    private Integer partyStatus;
    /**
     * 党支部描述
     */
    private String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public Integer getPartyId() {
        return partyId;
    }

    public void setPartyId(Integer partyId) {
        this.partyId = partyId;
    }

    public String getPartyName() {
        return partyName;
    }

    public void setPartyName(String partyName) {
        this.partyName = partyName;
    }

    public Integer getPartyStatus() {
        return partyStatus;
    }

    public void setPartyStatus(Integer partyStatus) {
        this.partyStatus = partyStatus;
    }

    @Override
    public String toString() {
        return "Party{" +
                "info='" + info + '\'' +
                ", partyId=" + partyId +
                ", partyName='" + partyName + '\'' +
                ", partyStatus=" + partyStatus +
                '}';
    }
}

myBatis 配置版 CRUD

PartyMapper 接口

package com.lct.wmx.mapper;

import com.lct.wmx.domain.Party;

import java.util.List;

/**
 * Created by Administrator on 2018/8/23 0023.
 * 党支部 Party 对应的 Mapper
 * 1)无论是注解版还是配置版,都要为 Mapper 接口指定 @Mapper
 * 2)或者使用 @MapperScan 扫描所有 Mapper 接口
 * 3)因为在主类上加了@MapperScan(value = {"com.lct.wmx.mapper"})扫描,所以这里就注释了@Mapper
 */

//@Mapper
public interface PartyMapper {

    /**
     * 根据id查询党支部
     */
    public Party findPartyById(Integer partyId);

    /**
     * 查询所有党支部
     */
    public List<Party> findAllPartys();

    /**
     * 根据id删除
     */
    public Integer deletePartyById(Integer partyId);

    /**其余修改、添加方法完全同理,在此不再累述*/

}

PartyMapper xml

  • 以前 Spring 整合 myBatis 时就是使用的 myBatis 操作数据库的 xml 文件,也就是注解版上 Mapper 接口方法上面的 sql 需要写在 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">

<!--namespace同样指向对应的Mapper接口-->
<mapper namespace="com.lct.wmx.mapper.PartyMapper">
    <!-- myBatis sql 映射文件,可从官网获取:http://www.mybatis.org/mybatis-3/getting-started.html-->
    <!-- 和以前一样对应Mapper接口的方法写上sql-->

    <!-- 根据 partyId 查询党支部,可以不指定 parameterType,会自动根据接口方法的参数进行映射-->
    <select id="findPartyById" resultType="com.lct.wmx.domain.Party">
        select * from party where partyId = #{partyId}
    </select>

    <!-- 查询所有党支部-->
    <select id="findAllPartys" resultType="com.lct.wmx.domain.Party">
        select * from party;
    </select>

    <!-- 根据 partyId 删除,可以不指定 parameterType,会自动根据接口方法的参数进行映射-->
    <delete id="deletePartyById">
      DELETE FROM party where partyId = #{partyId}
    </delete>

    <!-- 其余 添加、修改完全与以前 spring 整合 myBatis 一样,在此不再累述-->
</mapper>
  • myBatis 的 sql  对应的 xml 文件头信息可以从以前项目中直接复制,也可以从 myBatis 官网 获取,官网示例内容如下所示:
<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

myBatis 核心配置文件

  • 以前 MyBatis 未与 spring 整合时,配置数据源、事务、连接数据库的账号、密码等都是在 myBatis 核心配置文件中进行的
  • myBatis 与 spring 整合后,配置数据源、事务、连接数据库的账号、密码等就交由 spring 管理
  • 同理 Sping Boot 整合 myBatis 时,也有此核心配置文件,只是内容有些区别,可以从 myBatis 官网 查看

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--MyBatis 核心配置文件,就是以前的 sqlMapConfig.xml-->
    <!--可从官网获取本文件头:http://www.mybatis.org/mybatis-3/getting-started.html-->

    <!-- 文件中的配置都可以从官网获取:http://www.mybatis.org/mybatis-3/configuration.html#settings-->
    <settings>
        <!-- 开启驼峰命名,与注解方式的使用的 ConfigurationCustomizer 完全等效-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

An example of the settings element fully configured is as follows:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods"
    value="equals,clone,hashCode,toString"/>
</settings>

Spring Boot 全局配置文件

  • 既然已经提供了 myBatis 的配置文件,自然要告诉 spring boot 这些文件的位置

spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/hippo?characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#指定myBatis的核心配置文件与Mapper映射文件
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
  • 已经说过 spring boot 官方并没有提供 myBaits 的启动器,是 myBatis 官方提供的开发包来适配的 spring boot,从 pom.xml 文件中的依赖包名也能看出来,并非是以 spring-boot 开头的,pom.xml 文件引入 myBatis 依赖时如下所示:
<!-- 引入 myBatis,这是 MyBatis官方提供的适配 Spring Boot 的,而不是Spring Boot自己的-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
  • 同理上面全局配置文件中的这两行配置也是以 mybatis 开头 而非 spring 开头也充分说明这些都是 myBatis 官方提供的
  • 可以从 org.mybatis.spring.boot.autoconfigure.MybatisProperties 中查看所有配置项,源码部分内容如下所示:
package org.mybatis.spring.boot.autoconfigure;
.....
@ConfigurationProperties(
    prefix = "mybatis"
)
public class MybatisProperties {
    public static final String MYBATIS_PREFIX = "mybatis";
.....

For example:

# application.properties
mybatis.type-aliases-package=com.example.domain.model
mybatis.type-handlers-package=com.example.typehandler
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
...
# application.yml
mybatis:
    type-aliases-package: com.example.domain.model
    type-handlers-package: com.example.typehandler
    configuration:
        map-underscore-to-camel-case: true
        default-fetch-size: 100
        default-statement-timeout: 30
...

PartyController

  • 为了尽量符合实际开发,写上控制器层,从页面发送请求进行 CRUD,但是 dao 层 与 service 层就省略了

package com.lct.wmx.controller;

import com.lct.wmx.domain.Party;
import com.lct.wmx.mapper.PartyMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by Administrator on 2018/8/23 0023.
 */
@Controller
public class PartyController {
    @Resource
    private PartyMapper partyMapper;

    /**
     * 根据主键 partyId 查询
     *
     * @param id
     * @return
     * @ResponseBody :表示将结果直接返回给页面
     */
    @ResponseBody
    @GetMapping("/party/{id}")
    public Party findPartyById(@PathVariable("id") Integer id) {
        return partyMapper.findPartyById(id);
    }

    /**
     * 查询所有
     *
     * @return
     * @ResponseBody :表示将结果直接返回给页面
     */
    @ResponseBody
    @GetMapping("/party")
    public List<Party> findAllPartys() {
        return partyMapper.findAllPartys();
    }

    @GetMapping("/party/del/{id}")
    public String delPartyById(@PathVariable("id") Integer id) {
        partyMapper.deletePartyById(id);
        return "redirect:/party";
    }
    
    /**其余 增加、修改 完全同理,不再累述*/
}

运行测试

  • 查询:

  • 删除:

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/81983309