一、配置默認的數據源
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進行日誌輸出.