Spring Boot集成MyBatis的2种方式

目录

写在前面

最近老是有同事和技术群的朋友提问在Spring Boot中使用MyBatis时遇到的问题,大多数问题总结起来就是对MyBatis和Spring框架不熟悉的缘由致使的。实际上,在Spring Boot中使用MyBatis本质就是在Spring框架中集成MyBatis,并无其余任何高级的东西。只不过在Spring Boot中使用时由于插件封装的关系使得相关的配置能够更简洁一些,可是这种封装对于不熟悉MyBatis的人来说反而增长了理解的难度。所以,我想把如何在Spring Boot中使用MyBatis进行一个系统性的总结,但愿能有一些参考价值。html

准备工做

配置数据库驱动

使用任何数据库服务器,只要是使用JDBC方式链接,都须要添加数据库驱动,甚至还须要添加数据库链接池依赖,以下配置以添加MySQL驱动为例进行说明。java

<!-- 添加MySQL数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 添加数据库链接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${version.druid}</version>
</dependency>

配置数据源

在使用数据库以前先要在Spring Boot中配置数据源,以下所示:mysql

spring: 
    datasource: 
        name: testDatasource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test_springboot
        username: root
        password:

固然,还能够配置数据库链接池:git

#datasource
spring: 
    datasource: 
        name: testDatasource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test_springboot
        username: root
        password: 
        # 使用druid链接池
        type: com.alibaba.druid.pool.DruidDataSource
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20

原生集成MyBatis

这种集成方式本质上就是在Spring框架中集成MyBatis的方式,因此在非Spring Boot框架下也可使用。github

依赖配置

首先,添加依赖配置。spring

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${version.mybatis}</version>
</dependency>
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>${version.mybatis.mapper}</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${version.pagehelper}</version>
</dependency>

<!-- mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${version.mybatis.spring}</version>
</dependency>

<!-- spring事务 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>

<!-- spring jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>

注册MyBatis核心组件

其次,经过Java方式在Spring框架中注册MyBatis的核心组件Bean,而且配置声明式事务管理。 (1)在Spring中注册MyBatis的核心组件Bean:SqlSessionFactory,SqlSession,以及Spring的事务管理器。另外,在构建SqlSessionFactory时还能够注册MyBatis的xml映射器。sql

@Configuration
@EnableTransactionManagement
public class MyBatisSpringConfig implements TransactionManagementConfigurer {
	@Autowired
	private DataSource dataSource;
	
	// 在Spring中注册SqlSessionFactory,在这里能够设置一下参数:
	// 1.设置分页参数
	// 2.配置MyBatis运行时参数
	// 3.注册xml映射器
	@Bean
	public SqlSessionFactory sqlSessionFactory() {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		// 设置数据源
		sqlSessionFactoryBean.setDataSource(dataSource);
		// 设置映射POJO对象包名
		// sqlSessionFactoryBean.setTypeAliasesPackage("org.chench.test.springboot.model");
		
		// 分页插件
        /*PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
        pageHelper.setProperties(properties);*/
        //添加插件
        //sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});
		
		// 配置mybatis运行时参数
		org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
		// 自动将数据库中的下划线转换为驼峰格式
		configuration.setMapUnderscoreToCamelCase(true);
		configuration.setDefaultFetchSize(100);
		configuration.setDefaultStatementTimeout(30);
		
		sqlSessionFactoryBean.setConfiguration(configuration);
		
		// 在构建SqlSessionFactory时注册xml映射器
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
        	sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
            return sqlSessionFactoryBean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
	}
	
	/**
	 * 注入sqlSession对象
	 * @param sqlSessionFactory
	 * @return
	 */
	@Bean(value = "sqlSession")
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

	// Spring事务管理器
	@Bean(value = "transactionManager")
	@Override
	public PlatformTransactionManager annotationDrivenTransactionManager() {
		return new DataSourceTransactionManager(dataSource);
	}
}

(2)注册MyBatis接口映射器 MyBatis 3支持2种映射器:xml映射器和接口映射器,其中xml映射器能够在构建SqlSessionFactory时进行注册。数据库

@Configuration
@AutoConfigureAfter(MyBatisSpringConfig.class) //注意,因为MapperScannerConfigurer执行的比较早,因此必须有该注解
public class MyBatisMapperScannerConfig {
	@Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        // 设置sqlSessionFactory名
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        // 设置接口映射器基础包名
        mapperScannerConfigurer.setBasePackage("org.chench.test.springboot.mapper");
        Properties properties = new Properties();
        //properties.setProperty("mappers", "org.chench.test.springboot.mapper");
        properties.setProperty("notEmpty", "false");
        properties.setProperty("IDENTITY", "MYSQL");
        mapperScannerConfigurer.setProperties(properties);
        return mapperScannerConfigurer;
    }
}

定义并使用映射器

MyBatis支持2种类型的映射器:XML映射器和接口映射器,在这里以定义并使用接口映射器为例。apache

  • 定义接口映射器
@Repository
public interface AccountMapper {
	@Select("select * from account where id = #{id}")
	public Account getAccountById(@Param("id") long id);
}

注意: 在这里可使用Spring容器的注解@Repository声明MyBatis的接口映射器为一个Bean组件,这样在使用接口映射器时能够直接注入这个接口映射器Bean进行使用。springboot

  • 使用接口映射器
@Service
public class AccountService {
	// 直接注入接口映射器Bean进行使用
	@Autowired
	private AccountMapper accountMapper;
	
	public Account getAccountById(long id) {
		return accountMapper.getAccountById(id);
	}
}

经过MyBatis-Spring-Boot-Starter集成

经过插件MyBatis-Spring-Boot-Starter在Spring Boot中集成MyBatis时,能够不用再去关心原生配置方式里的细节,直接使用默认配置就能实现最基本的功能。固然,一样能够针对MyBatis的核心组件进行定制。因此,在这里分为2部分进行说明。第一部分说明最基础的默认集成方式,能实如今Spring Boot中使用MyBatis做为ORM插件的基本功能;第二部分说明如何在Spring Boot中对MyBatis进行高级定制。在这以前,须要先添加插件MyBatis-Spring-Boot-Starter的依赖配置。

<!-- 在Spring Boot中集成MyBatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

默认配置

默认状况下,插件MyBatis-Spring-Boot-Starter将进行以下配置:

  • 自动检查Spring Boot的数据源配置并构建DataSource对象
  • 经过SqlSessionFactoryBean使用数据源构建并注册SqlSessionFactory对象
  • 从SqlSessionFactory中建立并注册一个SqlSessionTemplate实例,其实就是构建一个SqlSession对象
  • 自动扫描接口映射器,并将这些映射器与SqlSessionTemplate实例进行关联,同时将它们注册到Spring容器中

其实上述这些默认配置就是咱们在原生集成MyBatis方式中作的事情,只不过在Spring Boot中经过插件MyBatis-Spring-Boot-Starter自动完成了。只要理解了这一点,就会明白如何在Spring Boot中灵活使用MyBatis组件了。 既然MyBatis的配置已经完成了,那么下一步的工做就是如何编写和使用接口映射器。

1.定义接口映射器

@Mapper
public interface AccMapper {
    @Select("select * from account where id = #{id}")
    Account getAccount(@Param("id") long id);
}

插件MyBatis-Spring-Boot-Starter会自动搜索使用了注解@Mapper的接口映射器并将其注册到Spring容器中,所以在这里不能使用@Repository注解标记MyBatis的映射器接口,这与原生方式集成MyBatis有所不一样。

2.使用接口映射器

@RestController
@RequestMapping("/acc")
public class AccController {
	// 直接经过自动注入的方式使用接口映射器
    @Autowired
    AccMapper accMapper;

    @GetMapping("/{id}")
    @ResponseBody
    public Object acc(@PathVariable("id") long id) {
        return accMapper.getAccount(id);
    }
}

至此能够看到,在Spring Boot中经过插件MyBatis-Spring-Boot-Starter集成MyBatis时很是方便,只须要添加基本的数据源配置就可使用了。固然,若是须要使用MyBatis更加高级的功能(如:使用xml映射器,定制MyBatis运行时参数),使用默认配置是没法实现的,必须在此基础上对MyBatis进行高级的定制。

高级定制

  • 定制MyBatis运行时参数

在Spring Boot中对MyBatis进行定制主要是指在Spring Boot的配置文件中(如:application.yaml)对MyBatis运行参数进行自定义配置(使用mybatis做为配置参数前缀):

mybatis:
    check-config-location: true                             # 是否检测MyBatis运行参数配置文件
    config-location: classpath:/mybatis-config.xml          # 指定MyBatis运行参数配置文件位置
    mapper-locations: classpath:/mapper/**/*.xml            # 注册XML映射器
    type-aliases-package: test.springboot.model             # 配置Java类型包名
    type-handlers-package: test.springboot.handlers         # 配置类型处理器包名
    executor-type: SIMPLE                                   # 指定执行器类型
    configuration:
        default-fetch-size: 20
        default-statement-timeout: 30

上述配置参数最终是经过mybatis-spring-boot-autoconfigure.jar加载和配置的。 另外,上述配置参数只是一个配置示例,详细的配置参数列表请参考MyBatis配置官网:http://www.mybatis.org/mybatis-3/zh/configuration.html

  • 注册并使用XML映射器

从定制MyBatis的运行时参数中能够看到,能够经过参数mybatis.mapper-locations指定XML映射器所在位置。 另外,能够直接经过插件MyBatis-Spring-Boot-Starter在Spring容器中注册SqlSession实例调用XML映射器,以下所示:

@RestController
@RequestMapping("/acc")
public class AccController {
	// 直接注入SqlSession对象
	@Autowired
    SqlSession sqlSession;
    
    @GetMapping("/{id}")
    @ResponseBody
    public Object getById(@PathVariable("id") long id) {
        return sqlSession.selectOne("test.springboot.mybatis.mapper.getAccount", 1);
    }
}
  • Java方式配置MyBatis运行时参数

MyBatis的运行时参数除了能够在Spring Boot的配置文件中指定,还能够经过Java编码方式设置。实际上就是在Spring容器中注册一个实现了ConfigurationCustomizer接口的Bean。

@org.springframework.context.annotation.Configuration
public class MyBatisConfigByJava {
    @Bean
    ConfigurationCustomizer mybatisConfigurationCustomizer() {
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                // 在Spring Boot中以Java编码方式配置MyBatis运行时参数
                configuration.setMapUnderscoreToCamelCase(true);
                configuration.addMappers("org.chench.test.springboot.mapper");
            }
        };
    }
}

更加高级的定制详见:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

总结与比较

总结起来,在Spring Boot中使用MyBatis可使用2种方式:

  1. 使用在Spring框架中集成MyBatis的原生集成方式
  2. 使用插件MyBatis-Spring-Boot-Starter集成MyBatis

上述两种方式均可以实现对MyBatis的定制化配置,能够根据我的喜爱进行选择。不管如何,要想在Spring Boot中灵活使用好MyBatis,最基础的仍是MyBatis和Spring框架自己。

相关文章
相关标签/搜索