SpringBoot2.x學習-數據源(HikariCP和Druid)和JdbcTemplate

一、配置默認的數據源

Spring Boot2.0默認使用hikari作爲數據源,使用的時候不需要額外添加maven依賴,配置一下就可以使用。
1.application.properties配置文件內容如下:

server.port=8888
server.servlet.context-path=/
server.tomcat.uri-encoding=utf-8

project.name=boot
logging.file=D:/logs/${project.name}.log
logging.level.com.soft=debug

#數據庫相關配置
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.username=scott
spring.datasource.password=tiger

#連接池配置
spring.datasource.hikari.maximum-pool-size=11
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maxLifetime=1800000

這樣在啓動應用的時候 可以看到控制檯輸出HikariCP對象的日誌
在這裏插入圖片描述

二、配置Druid數據源

Spring Boot 最核心的就是這個 @EnableAutoConfiguration ,啓動自動配置,這個註解會讓Spring Boot根據當前項目所依賴的jar包自動配置項目的相關配置項。首先加入Druid依賴然後在配置文件裏面配置 druid 相關的參數,Spring Boot 就能夠自動配置Druid數據源,如果我把 maven依賴去掉或者把參數去掉,那 Spring Boot 就不會自動配置。

1.排除默認的HikariCP數據源

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions>
             <!--  排除默認的數據源-->
                <exclusion>
                    <artifactId>HikariCP</artifactId>
                    <groupId>com.zaxxer</groupId>
                </exclusion>
            </exclusions>
   </dependency>

2.添加Druid數據源

  <!--依賴阿里巴巴的Druid數據源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

3.配置Druid數據源 ,application.properties配置如下:
Druid官網

server.port=8888
server.servlet.context-path=/
server.tomcat.uri-encoding=utf-8

#project.name=boot
#logging.file=D:/logs/springboot.log
#共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
#程序會打印高於或等於所設置級別的日誌,設置的日誌等級越高,打印出來的日誌就越少。
#logging.level.com.soft=debug

#數據庫相關配置
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.username=scott
spring.datasource.password=tiger

#HikariCP數據源 連接池配置
#spring.datasource.hikari.maximum-pool-size=11
#spring.datasource.hikari.minimumIdle=5
#spring.datasource.hikari.idleTimeout=600000
#spring.datasource.hikari.connectionTimeout=30000
#spring.datasource.hikari.maxLifetime=1800000

#Druid數據源相關配置
# 配置初始化大小、最小、最大
spring.datasource.druid.initial-size=5
#最小空閒連接數
spring.datasource.druid.min-idle=3
#最大空閒連接數
spring.datasource.druid.max-active=20


#配置獲取連接等待超時的時間
spring.datasource.druid.max-wait=60000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
#配置一個連接在池中最小生存的時間 單位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000

#用來檢測連接是否有效的sql,要求是一個查詢語句
spring.datasource.druid.validation-query=SELECT 'x' FROM DUAL
#申請連接的時候檢測
spring.datasource.druid.test-while-idle=true
#申請連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能
spring.datasource.druid.test-on-borrow=false
# 歸還連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能
spring.datasource.druid.test-on-return=false
#打開PSCache,並且指定每個連接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=50


#Filter配置
spring.datasource.druid.filters=wall,stat,log4j2

#Druid內置提供一個StatFilter,用於統計監控信息。
#是否啓用StatViewServlet(監控頁面)默認值爲false(考慮到安全問題默認並未啓動,
#如需啓用建議設置密碼或白名單以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=true
#設置監控頁面賬號
spring.datasource.druid.stat-view-servlet.login-username=smith
#配置監控頁面訪問密碼
spring.datasource.druid.stat-view-servlet.login-password=123456
#在StatViewSerlvet輸出的html頁面中,有一個功能是Reset All,執行這個操作之後,
#會導致所有計數器清零,重新計數。你可以通過配置參數關閉它
spring.datasource.druid.stat-view-servlet.reset-enable=false
#配置訪問控制  deny優先於allow,如果在deny列表中,就算在allow列表中,也會被拒絕。
#如果allow沒有配置或者爲空,則允許所有訪問
spring.datasource.druid.stat-view-servlet.allow=192.168.31.15
#設置禁止訪問監控頁面的IP地址  不支持IPV6
spring.datasource.druid.stat-view-servlet.deny=127.0.0.1,127.0.0.2

#慢SQL記錄
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=oracle
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.merge-sql=true
#慢sql時間設置,即執行時間大於200毫秒的都是慢sql
spring.datasource.druid.filter.stat.slow-sql-millis=200

spring.datasource.druid.filter.slf4j.enabled=true
spring.datasource.druid.filter.slf4j.result-set-log-enabled=false

spring.datasource.druid.filter.log4j2.enabled=false
#所有連接相關的日誌
spring.datasource.druid.filter.log4j2.connection-log-enabled=false
#所有Statement相關的日誌
spring.datasource.druid.filter.log4j2.statement-log-enabled=false
#是否顯示結果集
spring.datasource.druid.filter.log4j2.result-set-log-enabled=true
# 是否顯示SQL語句
spring.datasource.druid.filter.log4j2.statement-executable-sql-log-enable=true

#Sql防注入
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=oracle
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false

4.採用log4j2日誌框架,在resources目錄下 添加log4j2.xml文件 內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <Properties>
        <Property name="logdir">D:/</Property>
    </Properties>

    <appenders>

        <Console name="Console" target="SYSTEM_OUT">
            <!--只接受程序中DEBUG級別的日誌進行處理-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss.SSS}] %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>

        <!--處理DEBUG級別的日誌,並把該日誌放到logs/debug.log文件中-->
        <!--打印出DEBUG級別日誌,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
        <RollingFile name="RollingFileDebug" fileName="${logdir}/logs/debug.log"
                     filePattern="logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="DEBUG"/>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理INFO級別的日誌,並把該日誌放到logs/info.log文件中-->
        <RollingFile name="RollingFileInfo" fileName="${logdir}/logs/info.log"
                     filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--只接受INFO級別的日誌,其餘的全部拒絕處理-->
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理WARN級別的日誌,並把該日誌放到logs/warn.log文件中-->
        <RollingFile name="RollingFileWarn" fileName="${logdir}/logs/warn.log"
                     filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--處理error級別的日誌,並把該日誌放到logs/error.log文件中-->
        <RollingFile name="RollingFileError" fileName="${logdir}/logs/error.log"
                     filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout
                    pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>

        <!--druid的日誌記錄追加器-->
        <RollingFile name="druidSqlRollingFile" fileName="${logdir}/logs/druid-sql.log"
                     filePattern="logs/$${date:yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %L %M - %msg%xEx%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="500 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="DEBUG">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="RollingFileDebug"/>
        </root>

        <!--記錄druid-sql的記錄-->
        <logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="druidSqlRollingFile"/>
        </logger>
        <logger name="druid.sql.Statement" level="debug" additivity="false">
            <appender-ref ref="druidSqlRollingFile"/>
        </logger>

        <!--log4j2 自帶過濾日誌-->
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
        <Logger name="org.crsh.plugin" level="warn"/>
        <logger name="org.crsh.ssh" level="warn"/>
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/>
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
        <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration"
                level="warn"/>
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <logger name="org.thymeleaf" level="warn"/>
    </loggers>
</configuration>

5.啓動應用 生成的幾個日誌文件如下:
在這裏插入圖片描述
6.訪問Druid監控頁面 如下:輸入smith/123456就能訪問到
在這裏插入圖片描述
在這裏插入圖片描述

三、使用Spring 的JDBC操作類

.通過Spring JdbcTemplate對象操作scott數據庫用戶下的Emp表
需要添加jdbc啓動器 依賴

1.dao接口及實現代碼如下:

public interface EmpDao {
    /**
     * 根據名稱 獲取僱員信息
     * @param ename
     * @return
     */
     Map<String,Object> getEmpByName(String ename);

    /**
     * 根據編號獲取員工信息
     * @param empno
     * @return
     */
     Emp getEmpByNo(String empno);

}

@Repository("empDao")
public class EmpDaoImpl implements  EmpDao {
    /**
     * 注入jdbc操作依賴
     */
    @Resource
    private JdbcTemplate jdbcTemplate;

    /**
     * 根據名稱 獲取僱員信息
     *
     * @param ename
     * @return
     */
    @Override
    public  Map<String,Object> getEmpByName(String ename) {
        StringBuilder sql = new StringBuilder(32);
        sql.append("SELECT  E.* FROM EMP E WHERE E.ENAME=?");
        return jdbcTemplate.queryForMap(sql.toString(),new Object[]{ename});
    }

    @Override
    public Emp getEmpByNo(String empno) {
        StringBuilder sql = new StringBuilder(32);
        sql.append("SELECT  E.* FROM EMP E WHERE E.EMPNO=?");
        return jdbcTemplate.queryForObject(sql.toString(),new EmpRowMapper(),empno);
    }
}

2.service接口及實現如下:

public interface EmpService {

    /**
     * 根據名稱 獲取僱員信息
     * @param ename
     * @return
     */
     Map<String,Object> getEmpByName(String ename) ;

    /**
     * 根據編號獲取員工信息
     * @param empno
     * @return
     */
     Emp getEmpByNo(String empno);
}
@Service("empService")
public class EmpServiceImpl implements  EmpService {
    /**
     * 注入dao依賴
     */
    @Resource
    private EmpDao empDao;

    /**
     * 根據名稱 獲取僱員信息
     *
     * @param ename
     * @return
     */
    @Override
    public Map<String,Object> getEmpByName(String ename)  {
      return empDao.getEmpByName(ename);
    }

    @Override
    public Emp getEmpByNo(String empno) {
        return empDao.getEmpByNo(empno);
    }

}

3.Spring RowMapper實現如下

public class EmpRowMapper implements RowMapper<Emp> {

    @Override
    public Emp mapRow(ResultSet rs, int i) throws SQLException {

        Emp emp = new Emp();
       emp.setEmpno(rs.getInt("EMPNO"));
       emp.setEname(rs.getString("ENAME"));
       emp.setJob(rs.getString("JOB"));
       emp.setMgr(rs.getInt("MGR"));
       emp.setHiredate(rs.getTimestamp("HIREDATE"));
       emp.setSal(rs.getDouble("SAL"));
       emp.setComm(rs.getDouble("COMM"));
       emp.setDeptno(rs.getInt("DEPTNO"));
        return emp;
    }
}

4.emp實體對象如下(IDEA 需要添加lombok插件、lombok的maven依賴 和IDEA相關配置)

@Setter
@Getter
@ToString
public class Emp {
    /**
     * 員工編號
     */
    private int empno;
    /**
     * 員工姓名
     */
    private String  ename;
    /**
     * 工作崗位
     */
    private String job;
    /**
     * 領導者編號
     */
    private int mgr ;
    /**
     * 入職時間
     * 自定義輸出格式
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Timestamp hiredate;
    /**
     * 薪水
     */
    private double sal;
    /**
     * 獎金
     */
    private double comm;
    /**
     * 所在部門編號
     */
    private int deptno;
}

5.Controller實現如下:

@RestController
public class EmpController {

    /**
     * 日誌操作對象
     */
    Logger logger = LoggerFactory.getLogger(EmpController.class);
    /**
     * 員工業務操作對象
     */
    @Resource
    private EmpService empService;

    @RequestMapping("/empname")
    public Map<String,Object> getEmp(){
        return empService.getEmpByName("SMITH");
    }

    @RequestMapping("/empno")
    public Emp getEmpByNo(){
        return empService.getEmpByNo("7369");
    }

}

6.啓動訪問結果如下:
在這裏插入圖片描述

參考文章:鏈接: HikariCP.

鏈接: Druid中使用log4j2進行日誌輸出.

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