Springboot和MyBatis整合(自定义数据源,可多数据源)
由于我们项目中会用到根据条件不同操作不同的数据源,之前用的Springboot和JDBC整合的时候可以在JDBC里轻松选择数据源,写这个贴子则是记录在使用MyBatis时的选择和一些注意点。
pom.xml
整合主要用到的关键依赖
<!-- mybatis整合springboot的jar包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Hikari链接池依赖 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.11</version>
</dependency>
springboot配置,习惯使用yaml文件
- application.yml数据库链接池用的Hikari
spring:
datasource:
ALI:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 'XXX'
hikari:
maxLifetime: 1765000 #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
maximumPoolSize: 9 #连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
profiles:
active: dev
- application-dev.yml
server:
port: 8080
tomcat:
uri-encoding: utf-8
#session超时事件,单位(秒)
session:
timeout: 30
logging:
level:
root: info
#数据库url,多数据源可在这里配置多个,如注释里
#注意:地址前名字是jdbc-url,如果是单数据源纯ymal里读取则是url
spring:
datasource:
ALI:
jdbc-url: jdbc:mysql://XXX.XXX.XXX.XX:3306/cook
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 'XXX'
hikari:
maxLifetime: 1765000 #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒以上
maximumPoolSize: 9 #连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
# ALI2:
# jdbc-url: jdbc:mysql://XXX.XXX.XXX.XXX:3306/food
# driver-class-name: com.mysql.jdbc.Driver
# username: root
# password: 'XXX'
# hikari:
# maxLifetime: 1765000
# maximumPoolSize: 9
#pagehelper分页插件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
配置数据源bean,多数据源的话,有几个在这个类里配几个bean
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 数据源连接
*
* @author renhuan
* @create 2018-09-13 20:10
*/
@Configuration
public class DatasourceConfig {
@Bean(name = "datasourceALI")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.ALI")
public DataSource dataSourceALI() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
}
把数据源bean配置进mabatis里去,如果多数据源可以配N个这样的类,但要注意以下
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
/**
* 配置mybatis的SqlSessionFactory分别使用不同的数据源
*
* @author renhuan
* @create 2018-09-15 19:23
*/
@Configuration
@MapperScan(basePackages = {"com.XXX.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDBConfig {
@Autowired
@Qualifier("datasourceALI")
private DataSource datasourceALI;
@Bean
@Primary
@ConditionalOnMissingBean //当容器里没有指定的bean的情况下创建bean
public SqlSessionFactoryBean sqlSessionFactoryBean1() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//指定数据源
factoryBean.setDataSource(datasourceALI); // 使用ALI数据源, 连接ALI库
//设置mybatis的主配置文件
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource mybatisConfigXml = resolver.getResource("classpath:mapping/config/mybatis-config.xml");
Resource[] mapperConfigXmls = resolver.getResources("classpath:mapping/*Mapper.xml");
factoryBean.setTypeAliasesPackage("com.XXX.model");
factoryBean.setConfigLocation(mybatisConfigXml);
factoryBean.setMapperLocations(mapperConfigXmls);
return factoryBean;
}
@Bean
@Primary
public SqlSessionFactory sqlSessionFactory1() throws Exception {
return sqlSessionFactoryBean1().getObject();
}
@Bean
@Primary
public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
return template;
}
}
注意:
1. 主用的一套要加`@Primary`,表示同一个类的多个对象注入,优先选择有注解@Primary的对象;
2. `sqlSessionFactoryBean1()`方法里对xml文件位置的指定方式,为了更加灵活,mybatis的相关xml还是保留的。主要文件:mybatis的config的xml文件,和mapper的xml文件;
3. 扫描注释``@MapperScan(basePackages = {"com.XXX.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")``里指定了指定包里的mapper接口用哪个对应数据源的`sqlSessionFactory`。
mapper类和对应的xml
mapper类,由于已经扫描了这个类,所以可以不加注释
import com.XXX.model.Cooker;
/**
* 厨师数据操作
*
* @author renhuan
* @create 2018-09-13 19:51
*/
public interface CookerMapper {
void saveNewCooker(Cooker cooker);
}
对应mapper.xml,放在resource下的,实体类别名映射第4步里做过了
<?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.XXX.dao.CookerMapper">
<insert id="saveNewCooker" parameterType="Cooker">
INSERT INTO t_COOKER (COOKER_NAME,COOKER_AGE) VALUES (#{cookerName},#{cookerAge})
</insert>
</mapper>
mybatis.xml
<?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>
<settings>
<!-- 驼峰的自动映射 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer"/>
<typeAlias alias="Long" type="java.lang.Long"/>
<typeAlias alias="HashMap" type="java.util.HashMap"/>
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
<typeAlias alias="ArrayList" type="java.util.ArrayList"/>
<typeAlias alias="LinkedList" type="java.util.LinkedList"/>
</typeAliases>
</configuration>
小结:比起单数据源常用的springboot和mybatis的整合,多数据源主要是在yml文件里配置多个数据源,这种配置是没法被mybatis直接读取的,而是通过专门config类里bean里读取,同时也不在yml里写mabatis的路径配置,而是配置在了对应数据源的sqlSessionFactoryBean里,要注意这两种整合yml里的写法格式是不同的。
转载注明:https://blog.youkuaiyun.com/renhuan28/article/details/82729239