1. 程式人生 > >spring boot + mybatis + druid配置實踐

spring boot + mybatis + druid配置實踐

最近開始搭建spring boot工程,將自身實踐分享出來,本文將講述spring boot + mybatis + druid的配置方案。

pom.xml需要引入mybatis 啟動依賴:

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>

由於我是使用mysql

還需要引入mysql啟動依賴,

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

加入druid依賴,

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>

對於使用mysql + mybatis + durid pom.xml 中元件就新增好了!
配置DruidConfig:

@Configuration
public class DruidConfig {

private Logger logger = LoggerFactory.getLogger(getClass());

@Value("${spring.datasource.url}")
private String dbUrl;

@Value("${spring.datasource.username}")
private String username;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.driver-class-name}")
private String driverClassName;

@Value("${spring.datasource.initialSize}")
private int initialSize;

@Value("${spring.datasource.minIdle}")
private int minIdle;

@Value("${spring.datasource.maxActive}")
private int maxActive;

@Value("${spring.datasource.maxWait}")
private int maxWait;

@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;

@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;

@Value("${spring.datasource.validationQuery}")
private String validationQuery;

@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;

@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;

@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;

@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;

@Value("${spring.datasource.filters}")
private String filters;

@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
reg.addInitParameter("loginUsername", "druid");
reg.addInitParameter("loginPassword", "jiajian123456");
return reg;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.addInitParameter("profileEnable", "true");
filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
return filterRegistrationBean;
}

@Bean
@Primary
public DataSource druidDataSource(){ 
DruidDataSource datasource = new DruidDataSource(); 

datasource.setUrl(this.dbUrl); 
datasource.setUsername(username); 
datasource.setPassword(password); 
datasource.setDriverClassName(driverClassName); 
datasource.setInitialSize(initialSize); 
datasource.setMinIdle(minIdle); 
datasource.setMaxActive(maxActive); 
datasource.setMaxWait(maxWait); 
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); 
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); 
datasource.setValidationQuery(validationQuery); 
datasource.setTestWhileIdle(testWhileIdle); 
datasource.setTestOnBorrow(testOnBorrow); 
datasource.setTestOnReturn(testOnReturn); 
datasource.setPoolPreparedStatements(poolPreparedStatements); 
try { 
datasource.setFilters(filters); 
} catch (SQLException e) { 
logger.error("druid configuration initialization filter", e); 
} 
return datasource; 
}
}

如果不想使用預設資料庫連線池,需要自定義連線池,並在下文中注入,@Primary的作用是不指定注入DataSource時,預設使用該DataSource Bean

配置mapper掃描和事務管理

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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

@Configuration
@EnableTransactionManagement
@MapperScan("com.xxx.xxx.mybatis.mapper")
public class SessionFactoryConfig implements TransactionManagementConfigurer{
/** * mybatis 配置路徑 */ 
private static String MYBATIS_CONFIG = "mybatis-config.xml";

@Autowired 
private DataSource dataSource;

private String typeAliasPackage = "com.xxx.xxx.mybati.model";

/** 
*建立sqlSessionFactoryBean 例項 
* 並且設定configtion 如駝峰命名.等等 
* 設定mapper 對映路徑 
* 設定datasource資料來源 
* @return 
* @throws Exception 
*/
@Bean(name = "sqlSessionFactory") 
public SqlSessionFactoryBean createSqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 
/** 設定mybatis configuration 掃描路徑 */
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(MYBATIS_CONFIG));
/** 設定datasource */ 
sqlSessionFactoryBean.setDataSource(dataSource); 
/** 設定typeAlias 包掃描路徑 */
sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage); 
return sqlSessionFactoryBean; 
}

@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}

@Bean
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}

application.properties寫好連線池配置,SessionFactoryConfig.classdataSource可以直接注入。

application.properties檔案為:

spring.datasource.name = test
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = test
spring.datasource.password = 123456
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.filters = stat
spring.datasource.maxActive = 20
spring.datasource.initialSize = 1
spring.datasource.maxWait = 60000
spring.datasource.minIdle = 1
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 300000
spring.datasource.validationQuery = select 'x'
spring.datasource.testWhileIdle = true
spring.datasource.testOnBorrow = false
spring.datasource.testOnReturn = false
spring.datasource.poolPreparedStatements = true
spring.datasource.maxOpenPreparedStatements = 20

我的mapper.java檔案與.xml全部放在com.xxx.xxx.mybatis.mapper包下。