springboot整合Druid之一:com.alibaba.druid

package com.example.mybatis.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

@Configuration
//@PropertySource(value = {"classpath:application.properties"})
//@ConfigurationProperties(prefix = "ds1.datasource")
public class DatasourceConfig {
    // 精確到 master 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.example.mybatis.entity";
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${ds1.datasource.url}")
    private String url;
    @Value("${ds1.datasource.username}")
    private String username;
    @Value("${ds1.datasource.password}")
    private String password;
    @Value("${ds1.datasource.driverClassName}")
    private String driverClassName;

    @Value("${ds1.datasource.maxActive}")
    private Integer maxActive;
    @Value("${ds1.datasource.minIdle}")
    private Integer minIdle;
    @Value("${ds1.datasource.initialSize}")
    private Integer initialSize;
    @Value("${ds1.datasource.maxWait}")
    private Long maxWait;
    @Value("${ds1.datasource.timeBetweenEvictionRunsMillis}")
    private Long timeBetweenEvictionRunsMillis;
    @Value("${ds1.datasource.minEvictableIdleTimeMillis}")
    private Long minEvictableIdleTimeMillis;
    @Value("${ds1.datasource.testWhileIdle}")
    private Boolean testWhileIdle;
    @Value("${ds1.datasource.testWhileIdle}")
    private Boolean testOnBorrow;
    @Value("${ds1.datasource.testOnBorrow}")
    private Boolean testOnReturn;

    // spring-boot不是原生支持的druid連接池,
    // spring-boot不支持自動配druid連接池(即無法通過配置項直接支持相應的連接池連接池)
    @Bean(name = "dataSource") //DataSource對象被@Bean聲明,爲Spring容器所管理
    @Primary //@Primary表示這裏定義的DataSource將覆蓋其他來源的DataSource
    public DataSource dataSource() {
        //jdbc配置
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);

        //連接池配置
        dataSource.setMaxActive(maxActive);
        dataSource.setMinIdle(minIdle);
        dataSource.setInitialSize(initialSize);
        //配置獲取連接等待超時的時間
        dataSource.setMaxWait(maxWait);
        //配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        //配置一個連接在池中最小生存的時間,單位是毫秒
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        //申請連接的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,檢測連接是否有效
        dataSource.setTestWhileIdle(testWhileIdle);
        //申請連接時,檢測連接是否有效
        dataSource.setTestOnBorrow(testOnBorrow);
        //歸還連接時,檢測連接是否有效
        dataSource.setTestOnReturn(testOnReturn);
        //測試連接是否有效的sql
        dataSource.setValidationQuery("select 1 from dual");

        //打開PSCache,並且指定每個連接上PSCache的大小
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);

        try {
             /*
            配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
            # 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:
            # 監控統計用的filter:stat
            # 日誌用的filter:log4j
            # 防禦sql注入的filter:wall
            spring.datasource.filters=stat,log4j,wall
            */
            dataSource.setFilters("stat,wall");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return dataSource;
    }

    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean(name = "sqlSessionFactory")
    @Primary
    public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("dataSource") DataSource dataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("com.example.mybatis.entity");
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(DatasourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new StatViewServlet());
        //設置控制檯管理url http://localhost:8080/druid/
        servletRegistrationBean.addUrlMappings("/druid/*");
        Map<String, String> initParameters = new HashMap<String, String>();
        //設置控制檯管理用戶
        initParameters.put("loginUsername", "admin");// 用戶名
        initParameters.put("loginPassword", "admin");// 密碼
        initParameters.put("resetEnable", "false");// 禁用HTML頁面上的“Reset All”功能
        initParameters.put("allow", ""); // IP白名單 (沒有配置或者爲空,則允許所有訪問)
        //initParameters.put("deny", "192.168.20.38");// IP黑名單 (存在共同時,deny優先於allow)
        servletRegistrationBean.setInitParameters(initParameters);
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        //創建過濾器
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        //設置過濾器過濾路徑
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略過濾的形式
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

}
package com.example.mybatis.mapper;

import com.example.mybatis.entity.Dept;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

//@Mapper
public interface DeptMapper {

   List<Dept> getAll();
   Dept getOne(String deptno);
   void insert(Dept dept);
   void update(Dept dept);
   void delete(String deptno);
}
<?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.example.mybatis.mapper.DeptMapper">
    <resultMap id="dept" type="com.example.mybatis.entity.Dept">
        <result column="deptno" property="deptno"></result>
        <result column="dname" property="dname"></result>
        <result column="loc" property="loc"></result>
    </resultMap>
    
    <sql id="base-columns">
        deptno,dname,loc
    </sql>
    <select id="queryAllDepts" resultMap="dept">
        select deptno,dname,loc from dept
    </select>

    <select id="getAll" resultMap="dept">
        select
        <include refid="base-columns"></include>
        from dept
    </select>

    <select id="getOne" resultMap="dept" parameterType="java.lang.String">
        select
        <include refid="base-columns"></include>
        from dept
        where deptno=#{deptno}
    </select>

    <insert id="insert" parameterType="com.example.mybatis.entity.Dept">
        insert into dept (deptno,dname,loc) values (#{deptno},#{dname},#{loc})
    </insert>

    <update id="update" parameterType="com.example.mybatis.entity.Dept">
    update dept set
        <if test="dname!=null and dname!=''">dname=#{dname},</if>
        <if test="loc!=null and loc!=''">loc=#{loc},</if>
        deptno=#{deptno}
     where  deptno = #{deptno}
    </update>

    <delete id="delete" parameterType="java.lang.String">
        delete from dept where  deptno = #{deptno}
    </delete>

</mapper>
ds1.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
ds1.datasource.username=scott
ds1.datasource.password=bruce123
ds1.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
ds1.datasource.initialSize=20
ds1.datasource.minIdle=20
ds1.datasource.maxActive=200
ds1.datasource.maxWait=60000
ds1.datasource.timeBetweenEvictionRunsMillis=60000
ds1.datasource.minEvictableIdleTimeMillis=300000
ds1.datasource.testWhileIdle=true
ds1.datasource.testOnBorrow=false
ds1.datasource.testOnReturn=false
ds1.datasource.poolPreparedStatements=true
ds1.datasource.maxPoolPreparedStatementPerConnectionSize=20
<?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"/>
        <!-- 打印查詢語句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章