spring boot(六) 加入庫連線池(alibaba druid 資料)及分頁外掛
阿新 • • 發佈:2019-01-22
前言
上一遍只是簡單的說明了怎麼加入Mybatis,但這遠遠還是不夠,我們還需要加入資料庫連池來幫助我們來管理資料庫連線。
##1、加spring boot druid 依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.8</version>
</dependency>
注意,你的spring boot版本,如果是spring boot 是2.x 以上那麼druid-spring-boot-starter
druid-spring-boot-starter
依賴的時候,我剛開始引入的比較低的版本1.1.5
結果執行測試類時一直報錯:在升級完druid的版本號後,就不再報錯了。
2、durid配置檔案
在application.properties
檔案中新增配置
#連線池的配置資訊 ## 初始化大小,最小,最大 spring.datasource.druid.initialSize=5 spring.datasource.druid.minIdle=5 spring.datasource.druid.maxActive=20 ## 配置獲取連線等待超時的時間 spring.datasource.druid.maxWait=60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 # 配置一個連線在池中最小生存的時間,單位是毫秒 spring.datasource.druid.minEvictableIdleTimeMillis=300000 spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.druid.testWhileIdle=true spring.datasource.druid.testOnBorrow=false spring.datasource.druid.testOnReturn=false spring.datasource.druid.poolPreparedStatements=true spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆 spring.datasource.druid.filters=stat,wall,log4j # 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄 spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#3、新增資料來源類
@Configuration //在這裡新增MapperScan 掃包,在啟動類中就不用再添加了 @MapperScan(basePackages = "com.clockbone.dao",sqlSessionFactoryRef = "sqlSessionFactory") public class DruidDatabaseConfiguration { /*@Value(value = "spring.datasource.url") private String dbUrl; @Value(value = "spring.datasource.username") private String username; @Value(value = "spring.datasource.password") private String password; @Value(value = "spring.datasource.driver-class-name") private String driverClassName; @Value(value = "spring.druid.initialSize") private int initialSize; @Value(value = "spring.druid.minIdle") private int minIdle; @Value(value = "spring.druid.maxActive") private int maxActive; @Value(value = "spring.druid.maxWait") private int maxWait; @Value(value = "spring.druid.timeBetweenEvictionRunsMillis") private int timeBetweenEvictionRunsMillis; @Value(value = "spring.druid.minEvictableIdleTimeMillis") private int minEvictableIdleTimeMillis; @Value(value = "spring.druid.validationQuery") private String validationQuery; @Value(value = "spring.druid.testWhileIdle") private boolean testWhileIdle; @Value(value = "spring.druid.testOnBorrow") private boolean testOnBorrow; @Value(value = "spring.druid.testOnReturn") private boolean testOnReturn; @Value(value = "spring.druid.poolPreparedStatements") private boolean poolPreparedStatements; @Value(value = "spring.druid.maxPoolPreparedStatementPerConnectionSize") private int maxPoolPreparedStatementPerConnectionSize; @Value(value = "spring.druid.filtersl") private String filters; @Value(value = "spring.druid.connectionProperties") private String connectionProperties;*/ @Bean //統一配置名字首,可以減少上面配置程式碼 @ConfigurationProperties(prefix = "spring.datasource") @Primary public DruidDataSource dataSource() throws SQLException { DruidDataSource datasource = new DruidDataSource(); /*datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration 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); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); datasource.setFilters(filters);*/ return datasource; } @Bean public DataSourceTransactionManager transactionManager() throws SQLException { return new DataSourceTransactionManager(dataSource()); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); /*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); sessionFactory.setPlugins(new Interceptor[]{pageHelper});*/ return sessionFactory.getObject(); } }
4、mapper類及檔案
//@Mapper 可以去掉這個註解了
public interface UserMapper {
@Select("SELECT ID,USER_ID as userId,USER_NAME as userName FROM Userinfo where id=#{id}")
User getUserInfo(long id);
User selectByPrimaryKey(Long id);
}
<?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.clockbone.dao.UserMapper" >
<resultMap id="BaseResultMap" type="com.clockbone.model.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="user_id" property="userId" jdbcType="VARCHAR" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
user_id as userId,user_name userName,id
from User
where id = #{id}
</select>
</mapper>
##5、加spring boot 加入pagehelper分頁外掛
pagehelper
這個外掛也是比較常用的資料分頁外掛,在spring boot
只需要加入下面依賴,就會自動在sqlSessionFactory
層面自動加入pagehelper的外掛配置,而不需要再另外配置外掛程式碼:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
測試類:
@Test
public void userPageInfoTest(){
User user = new User();
user.setUserName("test");
//直接設定分頁屬性,為了保證安全分頁,後面一條一定是要分頁的sql,
PageInfo<User> pageInfo = userService.getUserList(user,1,10);
log.info("getTotal:{}",pageInfo.getTotal());
log.info("getPageNum:{}",pageInfo.getPageNum());
log.info("getPageSize:{}",pageInfo.getPageSize());
log.info("page list:{}",pageInfo.getList());
}
結果:
2018-05-09 17:46:04.528 INFO 4628 --- [ main] com.clockbone.web.biz.UserServiceTest : getTotal:1
2018-05-09 17:46:04.528 INFO 4628 --- [ main] com.clockbone.web.biz.UserServiceTest : getPageNum:1
2018-05-09 17:46:04.528 INFO 4628 --- [ main] com.clockbone.web.biz.UserServiceTest : getPageSize:10
如果不想spring boot自動注入,可以在sqlSessionFactory
的程式碼中設定pagehelper
外掛:
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
//新增Pagehelper外掛
Interceptor pageHelper = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties);
sessionFactory.setPlugins(new Interceptor[]{pageHelper});
return sessionFactory.getObject();
}
*** 這時如果直接啟動測類,會報如下錯誤: ***
會報有多個分頁外掛,這時需要在啟動類上面加入註解 ,去掉pagehelper
外掛的自動注入如下:
@SpringBootApplication(scanBasePackages = "com.clockbone"/*,
exclude={DataSourceAutoConfiguration.class}*/ ,exclude = {PageHelperAutoConfiguration.class})