文本將對在Spring Boot構建的Web應用中,基於MYSQL數據庫的幾種數據庫鏈接方式進行介紹。
包括JDBC、JPA、MyBatis、多數據源和事務。html
一、屬性配置文件(application.properties)java
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
若是使用JNDI,則能夠替代 spring.datasource 的 url、username、password,如:mysql
spring.datasource.jndi-name=java:tomcat/datasources/example
值得一提的是,不管是Spring Boot默認的DataSource配置仍是你本身的DataSource bean,都會引用到外部屬性文件中的屬性配置。因此假設你自定義的DataSource bean,你能夠在定義bean時設置屬性,也能夠在屬性文件中,以「spring.datasource.*」的方式使屬性配置外部化。web
二、pom.xml 配置maven依賴spring
<!-- MYSQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Spring Boot JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
三、Java代碼範例sql
StudentService.java數據庫
package org.springboot.sample.service; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springboot.sample.entity.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; /** * Studeng Service * * @author 單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月12日 */ @Service public class StudentService { @Autowired private JdbcTemplate jdbcTemplate; public List<Student> getList(){ String sql = "SELECT ID,NAME,SCORE_SUM,SCORE_AVG, AGE FROM STUDENT"; return (List<Student>) jdbcTemplate.query(sql, new RowMapper<Student>(){ @Override public Student mapRow(ResultSet rs, int rowNum) throws SQLException { Student stu = new Student(); stu.setId(rs.getInt("ID")); stu.setAge(rs.getInt("AGE")); stu.setName(rs.getString("NAME")); stu.setSumScore(rs.getString("SCORE_SUM")); stu.setAvgScore(rs.getString("SCORE_AVG")); return stu; } }); } }
Student.java 實體類tomcat
package org.springboot.sample.entity; import java.io.Serializable; /** * 學生實體 * * @author 單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月12日 */ public class Student implements Serializable{ private static final long serialVersionUID = 2120869894112984147L; private int id; private String name; private String sumScore; private String avgScore; private int age; // 節省文章長度,get set 方法省略 }
StudentController.javaspringboot
package org.springboot.sample.controller; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springboot.sample.entity.Student; import org.springboot.sample.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/stu") public class StudentController { private static final Logger logger = LoggerFactory.getLogger(StudentController.class); @Autowired private StudentService studentService; @RequestMapping("/list") public List<Student> getStus(){ logger.info("從數據庫讀取Student集合"); return studentService.getList(); } }
本文對工程添加文件後工程結構圖: app
而後啓動項目,訪問地址: http://localhost:8080/myspringboot/stu/list 響應結果以下:
[
{
id: 1, name: "小明", sumScore: "252", avgScore: "84", age: 1 }, { id: 2, name: "小王", sumScore: "187", avgScore: "62.3", age: 1 }, { id: 3, name: "莉莉", sumScore: "", avgScore: "", age: 0 }, { id: 4, name: "柱子", sumScore: "230", avgScore: "76.7", age: 1 }, { id: 5, name: "大毛", sumScore: "", avgScore: "", age: 0 }, { id: 6, name: "亮子", sumScore: "0", avgScore: "0", age: 1 } ]
Tomcat7以前,Tomcat本質應用了DBCP鏈接池技術來實現的JDBC數據源,但在Tomcat7以後,Tomcat提供了新的JDBC鏈接池方案,做爲DBCP的替換或備選方案,解決了許多以前使用DBCP的不利之處,並提升了性能。詳細請參考:http://wiki.jikexueyuan.com/project/tomcat/tomcat-jdbc-pool.html
Spring Boot爲咱們準備了最佳的數據庫鏈接池方案,只須要在屬性文件(例如application.properties)中配置須要的鏈接池參數便可。
咱們使用Tomcat數據源鏈接池,須要依賴tomcat-jdbc,只要應用中添加了spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa依賴,則無需擔憂這點,由於將會自動添加 tomcat-jdbc 依賴。
假如咱們想用其餘方式的鏈接池技術,只要配置本身的DataSource bean,便可覆蓋Spring Boot的自動配置。
請看個人數據源配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.max-idle=10 spring.datasource.max-wait=10000 spring.datasource.min-idle=5 spring.datasource.initial-size=5 spring.datasource.validation-query=SELECT 1 spring.datasource.test-on-borrow=false spring.datasource.test-while-idle=true spring.datasource.time-between-eviction-runs-millis=18800 spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
配置過鏈接池的開發人員對這些屬性的意義都有所認識。
咱們打開DEBUG日誌輸出,logback.xml 中添加:
<logger name="org.springframework.boot" level="DEBUG"/>
而後啓動項目,注意觀察日誌輸出,以下圖中會顯示自動啓用了鏈接池:
我在上面的數據源配置中添加了過濾器,並設置了延遲時間爲0(故意設置很低,實際項目中請修改):
spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
這個時候,咱們訪問 http://localhost:8080/myspringboot/stu/list 觀察日誌,會發現框架自動將大於該時間的數據查詢進行警告輸出,以下:
2016-01-12 23:27:06.710 WARN 17644 --- [nio-8080-exec-1] o.a.t.j.p.interceptor.SlowQueryReport : Slow Query Report SQL=SELECT ID,NAME,SCORE_SUM,SCORE_AVG, AGE FROM STUDENT; time=3 ms;
引用原文:http://blog.csdn.net/catoop/article/details/50507516
寫博客是爲了記住本身容易忘記的東西,另外也是對本身工做的總結,文章能夠轉載,無需版權。但願盡本身的努力,作到更好,你們一塊兒努力進步!
若是有什麼問題,歡迎你們一塊兒探討,代碼若有問題,歡迎各位大神指正!