本文导读
- 《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 接口
- 与注解版《Spring Boot 整合 MyBatis 之 注解版》一样,需要设置实体类对应的面向对象操作的接口,这以前 Spring 整合 myBatis 也是一样的
- 因为在应用启动类上加了@MapperScan(value = {"com.lct.wmx.mapper"})扫描,所以 Mapper 接口上就注释了@Mapper,不清楚的可以参考《Spring Boot 整合 MyBatis 之 注解版》
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 文件的头信息可以从以前的项目中复制,也可以从官网查看:http://www.mybatis.org/mybatis-3/getting-started.html,官网示例内容如下所示:
<?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>
- myBatis 官网 提供配置选项的常用的如下,更多请参考官网:http://www.mybatis.org/mybatis-3/configuration.html#settings,官网示例内容如下所示:
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";
.....
- 这些配置也可以从 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";
}
/**其余 增加、修改 完全同理,不再累述*/
}
运行测试
- 查询:
- 删除: