目录
- 前言
- 1. 导入MyBatis场景
- 1.1 初始化导向
- 1.2 手动导入
- 2. *MyBatis自动配置原理
- 3. 全局配置文件
- @Mapper
- @MapperScan
- 3.1 配置模式
- 3.2 注解模式
- @Select
- 3.3 混合模式
- @Insert
- @Options
- 4 总结
- 最后
前言通过前一篇的学习,我们知道可以使用JDBC操作数据库,但在实际生产中,我们一般使用MyBatis 。在本篇,可以学习到SpringBoot如何整合MyBatis框架,以及相关自动配置原理 。
MyBatis是目前Java持久层最为主流的技术之一,它可以避免几乎所有的JDBC代码和手动设置参数以及获取结果集 。同时,MyBatis是基于一种SQL到POJO的模型,需要我们提供SQL、映射关系以及POJO 。由于本笔记为SpringBoot系列笔记,故重点放在SpringBoot整合使用MyBatis 。
注:在说明注解时,第一点加粗为注解中文含义,第二点为一般加在哪身上,缩进或代码块为示例,如:
@注解
- 中文含义
- 加在哪
- 其他……
语句示例
//代码示例
*这里需要与前文的两种配置方式做区别:笔者的导入指往应用中添加相应场景,注重一个从0到1的过程;而前文Druid连接池的两种配置方式虽然也有导入的意思,但更加注重导入后的配置过程,是一个从1到2的过程 。
1.1 初始化导向初始化导向指在新建SpringBoot项目工程时进行导入:

文章插图
1.2 手动导入手动导入只需要在SpringBoot的pom.xml文件里添加下面场景即可:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency>2. *MyBatis自动配置原理MyBatis的自动配置原理跟Druid差不多,我们可以通过源码分析得出可以自己配置哪些属性,以及配置这些属性时的前缀 。
加入MyBatis场景后,我们可以发现该场景里有:

文章插图
通过前面的文章,我们知道SpringBoot会先找到对应场景的自动配置类,在这里是
MybatisAutoConfiguration@Configuration@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })@ConditionalOnBean(DataSource.class)@EnableConfigurationProperties(MybatisProperties.class) // MyBatis配置项绑定类@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })public class MybatisAutoConfiguration {}从源码中,我们可以得到以下信息:- 跟
MybatisProperties配置类绑定,
- 配置属性的前缀为
mybatis
@ConfigurationProperties(prefix = "mybatis")public class MybatisProperties
- 配置属性的前缀为
- 全局配置文件:使用Mybatis需要进行全局配置;
- SqlSessionFactory: 用来生成
SqlSession;
- SqlSession是MyBatis操作的核心,是一个功能性代码,通常使用单例模式(在MyBatis的生命周期中只存在一个
SqlSessionFactory);
- SqlSession是MyBatis操作的核心,是一个功能性代码,通常使用单例模式(在MyBatis的生命周期中只存在一个
- SqlSession:自动配置了
SqlSessionTemplate,可以生成SqlSession;
- @Import(AutoConfiguredMapperScannerRegistrar.class):导入的类里有定义如何操作
@Mapper注解的接口;
- @Mapper: 只要写的操作MyBatis的接口标注了
@Mapper就会被自动扫描进容器 。
- @Mapper: 只要写的操作MyBatis的接口标注了

文章插图
3. 全局配置文件全局配置文件的书写方式有三种,分别是配置模式、注解模式以及混合模式 。在配置之前,我们需要做些准备工作,让SpringBoot知道我们的配置文件写在哪里 。
准备工作:
- 配置全局配置文件位置( 在
application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息,建议配置在mybatis.configuration);
mybatis:#全局配置文件位置config-location: classpath:mybatis/mybatis-config.xml#sql映射文件位置mapper-locations: classpath:mybatis/mapper/*.xml#定义别名扫描的包,需要与@Alias联合使用type-aliases-package: ……#具体类需要与@MappedJdbcTypes联合使用type-handlers-package: ……#执行器(Executor),可以配置STMPLE、REUSE、BATCH、默认为STMPLEexecutor-type: ……configuration:#配置MyBatis插件(拦截器等)interceptors: ……#级联延迟加载配置属性aggressive-lazy-loading: ……- 注意
config-location与mapper-locations不能同在,理由如下: - 当需要使用mybatis-config.xml配置文件的时需要配置
config-location,config-location的作用是确定mybatis-config.xml文件位置;而mapper-locations是用来注册xxxmapper.xml文件 。如果使用了mybatis-config.xml,并且里面配置了mapper,那就不需要mapper-locations。
- 注意
- 编写mapper接口,使用标准
@Mapper注解( 也可以在启动类上加上@MapperScan替换@Mapper )
- 映射配置;
- 用在接口类上
- 在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类;
- 如果有多组接口需要编译成实现类,需要在每个接口上标注一个@Mapper;
@Mapperpublic interface UserDAO {//代码}
- 映射扫描配置;
- 用在主启动类下;
- 指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类;
- 将MyBatis所需的对应接口扫描到Spring IOC容器中;
- 可以解决@Mapper标注过多问题,直接在主启动类上加上一个@MapperScan即可;
@SpringBootApplication//@MapperScan("com.dlhjw.mapper")@MapperScan(//指定扫描包basePackages = "com.dlhjw.mapper",//指定SqlSessionFactory,如果sqlSessionTemplate被指定,则作废sqlSessionFactoryRef = "sqlSessionFactory",//指定sqlSessionTemplate,将忽略sqlSessionFactory的配置(优先级高)sqlSessionTemplateRef = “sqlSessionTemplate”,//限制扫描接口,不常用//markerInterface = class.class,annotationClass = Repository.class)public class SpringbootMybatisDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisDemoApplication.class, args);}}
【以下不常用、不推荐】 上述两个接口都可以让SpringBoot知道用户配置的MyBatis映射关系在哪,除了用接口方式外,还可以:
- 通过
MapperFactoryBean装配MyBatis; - 使用
MapperScannerConfigurer; - 使用MyBatis接口(因为
SqlSessionFactory是SpringBoot自动生成好了,所以直接拿来使用);
1. 通过MapperFactoryBean装配MyBatis:
@AutowiredSqlSessionFactory sqlSessionFactory = null;//定义一个MyBatis的Mapper接口@Beanpublic MapperFactoryBean<MyBatisUserDao> initMyBatisUserDao(){MapperFactoryBean<MyBatisUserDao> bean = new MapperFactoryBean<>();bean.setMapperInterface(UserDAO.class);bean.setSessionFactory(sqlSessionFactory);return beam;}2. 使用MapperScannerConfigurer:@Beanpublic MapperScannerConfigurer mapperScannerConfig(){//定义扫描器实例MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();//加载SqlSessionFactory,SpringBoot会自动生产,SqlSessionFactory实例mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");//定义扫描的包mapperScannerConfigurer.setBeanPackage("com.dlhjw.mapper");//限定被标注@Repository的接口才被扫描mapperScannerConfigurer.setAnnotationClass(Repository.class);//通过继承某个接口限制扫描,一般使用不多//mapperScannerConfigurer.setMarkerInterface(....);return mapperScannerConfigurer;}3. 使用MyBatis接口:public interface MyBatisUserService{public User getUser(Long id);}@Servicepublic class MyBatisUserServiceImpl implements MyBatisUserService{//因为在启动文件application.yaml配置了对应接口,所以直接依赖注入即可@Autowiredprivate MyBatisUserDao myBatisUserDao = null;@Overridepublic User getUser(Long id){return myBatisUserDao.getUser(id);}}3.1 配置模式配置模式步骤如下 。
1. 导入mybatis官方starter;
2. 编写mapper接口,使用
@Mapper或@MapperScan注解;3. 配置全局配置文件(springboot自动配置好了);
在resources/mybatis/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 开启驼峰命名匹配,或者在配置文件中配置 --><settings><setting name="mapUnderscoreToCamelCase" value="https://tazarkount.com/read/true"/></settings></configuration>配置mybatis.configuration下面的所有,就是相当于改mybatis全局配置文件中的值;mybatis:#注意:只能有一个全局配置,下面语句不能存在#config-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/mapper/*.xmlconfiguration:map-underscore-to-camel-case: true#推荐4. 配置映射文件(编写sql映射文件并绑定mapper接口);使用Mapper接口绑定Xml
在resources/mybatis/mapper/AccountMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.dlhjw.admin.mapper.AccountMapper"><!-- public Account getAcct(Long id) --><select id="getAcct" resultType="com.dlhjw.admin.bean.Account">select * from account_tbl where id=#{id}</select></mapper>3.2 注解模式【springboot注解有哪些 SpringBoot | 3.2 整合MyBatis】注解模式步骤如下(自上而下分析,从数据层到表示层) 。
@Select
- 选择;
- 标注在mapper接口上;
- 用来代替原来xml里的<select>标签,参数为原生的sql;
2. 编写mapper接口,使用
@Mapper或@MapperScan注解;3. 接口的方法上标注
@Select注解,代替原来xml里的<select>标签;@Mapperpublic interface CityMapper {@Select("select * from city where id=#{id}")public City getById(Long id);}4. 在service层里编写业务方法;public interface CityService {City getById(Long id);}@Servicepublic class CityServiceImpl implements CityService {@AutowiredCityMapper cityMapper;public City getById(Long id){return cityMapper.getById(id);}}5. 在Controller层里编写表示层相关方法;*Controller相关知识参考下章 。
@Controllerpublic class IndexController {@AutowiredCityService cityService;@ResponseBody@GetMapping("/city")public City getCityById(@RequestParam("id") Long id){return cityService.getById(id);}}3.3 混合模式混合模式步骤如下(自上而下分析,从数据层到表示层) 。
1. 导入mybatis官方starter;
2. 编写mapper接口,使用
@Mapper或@MapperScan注解;@Mapperpublic interface CityMapper {@Select("select * from city where id=#{id}")public City getById(Long id);public void insert(City city);}3. 为insert方法配置xml文件;<mapper namespace="com.atguigu.admin.mapper.CityMapper"><!--useGeneratedKeys:使用自增主键,可以返回自增主键值keyProperty:自增属性的id --><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert intocity(`name`,`state`,`country`) values(#{name},#{state},#{country})</insert></mapper>4. 在service层里编写业务方法;public interface CityService {City getById(Long id);void saveCity(City city);}@Servicepublic class CityServiceImpl implements CityService {@AutowiredCityMapper cityMapper;public City getById(Long id){return cityMapper.getById(id);}public void saveCity(City city) {counter.increment();cityMapper.insert(city);}}5. 在Controller层里编写表示层相关方法;*Controller相关知识参考下章 。
@Controllerpublic class IndexController {@AutowiredCityService cityService;@ResponseBody@PostMapping("/city")public City saveCity(City city){cityService.saveCity(city);return city;}@ResponseBody@GetMapping("/city")public City getCityById(@RequestParam("id") Long id){return cityService.getById(id);}}6. *将上述insert用注解方式改成注解模式*此步骤不是必要的 。
@Mapperpublic interface CityMapper {@Insert("insert intocity(`name`,`state`,`country`) values(#{name},#{state},#{country})")@Options(useGeneratedKeys = true,keyProperty = "id")public void insert(City city);}@Insert- 插入语句;
- 用在mapper接口上;
- 用来代替原来xml里的
标签,参数为原生的插入insert相关的sql;
- 选择的参数;
- 用在mapper接口上;
- 用来代替原来xml里的
标签的参数配置,参数为相关的配置属性; useGeneratedKeys表示使用自增主键,可以返回自增主键值;keyProperty表示自增属性的id 。
4 总结SpringBoot整合MyBatis的方法如下:
- 引入
mybatis-starter; - 配置
application.yaml中,指定mapper-location位置即可; - 编写
Mapper接口并标注@Mapper注解;- 简单方法直接注解方式;
- 复杂方法编写
mapper.xml进行绑定映射;
@MapperScan("com.dlhjw.admin.mapper")简化,其他的接口就可以不用标注@Mapper注解 。
最后新人制作,如有错误,欢迎指出,感激不尽!欢迎关注公众号,会分享一些更日常的东西!如需转载,请标注出处!

文章插图
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
