1. 程式人生 > >spring boot(六) 加入庫連線池(alibaba druid 資料)及分頁外掛

spring boot(六) 加入庫連線池(alibaba druid 資料)及分頁外掛

前言

上一遍只是簡單的說明了怎麼加入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})