說到數據庫配置,我們最開始想象的也就是JDBC連接。
1、首先,我們得準備mysql的驅動jar包
2、得有數據庫
3、使用JDBC連接mysql數據庫demo
//JDBC驅動名
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//數據庫URL:這裏的mysql2020是數據庫名稱
String JDBC_URL = "jdbc:mysql://localhost:3306/mysql2020?useSSL=false&serverTimezone=UTC";
//數據庫的用戶名與密碼
String USER = "root";
String PASS = "123456";
//通過DriverManager類獲得該連接對象才能訪問數據庫
Connection connection = null;
//通過Connection獲得該結果對象用於執行靜態的SQL語句
Statement statement = null;
try {
//註冊JDBC驅動
Class.forName(JDBC_DRIVER);
//數據庫的連接:通過DriverManager類的getConnection方法,傳入三個參數:數據庫URL、用戶名、用戶密碼,實例化connection對象
connection = DriverManager.getConnection(JDBC_URL,USER,PASS);
//實例化statement對象
statement = (Statement) connection.createStatement();
//定義數據庫查詢語句:查詢ceshi表中的uuid、Address兩列數據
String sql = "SELECT uuid,Address FROM ceshi";
//執行查詢語句
ResultSet rSet = statement.executeQuery(sql);
//展開查詢到的數據
while(rSet.next()) {
//這裏getString()方法中的參數對應的是數據庫表中的列名
String get_name = rSet.getString("uuid");
String get_sex = rSet.getString("Address");
//輸出數據
System.out.println("主鍵:"+get_name);
System.out.print("地址:"+get_sex);
}
//依次關閉對象
rSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
4、演示
使用配置文件
既然要使用配置文件,那肯定得做那種啓動項目的了。
這裏咱們先參照《Spring Boot的啓動與調用》
再,做一下拓展。
1、在開發過程中最重要的就是單元測試了
【配置文件】在pom.xml包中添加下面的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
【開發測試類】
在測試類的頭部添加:
@RunWith(SpringRunner.class)
@SpringBootTest註解,
在測試方法的頂端添加@Test即可,最後在方法上點擊右鍵run就可以運行。
demo
package redant;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class FrozenWebApplication {
public static void main(String[] args) {
SpringApplication.run(FrozenWebApplication.class, args);
}
}
package mysqlt;
import org.junit.Test;
import java.util.Date;
public class SpringbootTestDemo {
@Test
public void springboottestFroze(){
for (int i = 0; i < 3; i++) {
Date date = new Date();
System.out.println(date.getTime());
}
}
}
演示demo
【PS】
spring-boot-starter-test提供很多基礎方法,包括增加了對Controller層測試的支持。
2、集成測試
整體開發完成之後進入集成測試,spring boot項目的啓動入口在 Application類中,直接運行run方法就可以啓動項目,但是在調試的過程中我們肯定需要不斷的去調試代碼,如果每修改一次代碼就需要手動重啓一次服務就很麻煩,spring boot非常貼心的給出了熱部署的支持,很方便在web項目中調試使用。
pom需要添加以下的配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools<http://www.yigouyule2.cn/ /artifactId>
<optional>true</optional>
</dependency>
添加以上配置後,項目就支持了熱部署,非常方便集成測試。
3、項目上線
一般分爲三種;一種是打包成jar包直接執行,另一種是打包成war包放到tomcat服務器下,還有就是直接鏈接項目文件。
A、打成jar包
如果你使用的是maven來管理項目,執行以下命令既可以
cd 項目跟目錄(和pom.xml同級)
mvn clean package
或者執行下面的命令,排除測試代碼後進行打包
mvn clean package -Dmaven.test.skip=true
打包完成後jar包會生成到target目錄下,命名一般是 項目名+版本號.jar
啓動jar包命令
java -jar target/spring-boot-scheduler-1.0.0.jar
這種方式,只要控制檯關閉,服務就不能訪問了。下面我們使用在後臺運行的方式來啓動:
nohup java -jar target/spring-boot-scheduler-1.0.0.jar &
也可以在啓動的時候選擇讀取不同的配置文件
java -jar app.jar --spring.profiles.active=dev
gradle
如果使用的是gradle,使用下面命令打包
gradle build
java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
打成war包
打成war包一般可以分兩種方式來實現,第一種可以通過eclipse這種開發工具來導出war包,另外一種是使用命令來完成,這裏主要介紹後一種
1、maven項目,修改pom包將<packaging>jar</packaging>
改爲
<packaging>war</packaging>
2、打包時排除tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
在這裏將scope屬性設置爲provided,這樣在最終形成的WAR中不會包含這個JAR包,因爲Tomcat或Jetty等服務器在運行時將會提供相關的API類。
這裏筆者又想拓寬一下知識面,談一談Spring Boot的啓動器Starter
上配置文件
不過在此之前,我還要拓展一下知識面對於org.apache.commons.dbcp.BasicDataSource的配置認知
Spring在第三方依賴中包含了兩個數據源的實現類包,一個是Apache的DBCP,另一個是C3P0。使用任意一個都可以配置。
①DBCP數據源
DBCP類包在commons-dbcp.jar,DBCP是一個依賴 Jakarta commons-pool對象池機制的數據庫連接池,所以在類路徑下還必須包括commons-pool.jar。下面是使用DBCP配置MySql數據源的配置片斷:
xml 代碼
<!-- 定義一個使用DBCP實現的數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/mysql2020"
p:username="root"
p:password="123456"/>
BasicDataSource提供了close()方法關閉數據源,所以必須設定destroy-method=”close”屬性, 以便Spring容器關閉時,數據源能夠正常關閉。
此外其還有以下屬性:
defaultAutoCommit:設置從數據源中返回的連接是否採用自動提交機制,默認值爲 true;
defaultReadOnly:設置數據源是否僅能執行只讀操作, 默認值爲 false;
maxActive:最大連接數據庫連接數,設置爲0時,表示沒有限制;
maxIdle:最大等待連接中的數量,設置爲0時,表示沒有限制;
maxWait:最大等待秒數,單位爲毫秒, 超過時間會報出錯誤信息;
validationQuery:用於驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數據, 如你可以簡單地設置爲:“select count(*) from user”;
removeAbandoned:是否自我中斷,默認是 false ;
removeAbandonedTimeout:幾秒後數據連接會自動斷開,在removeAbandoned爲true,提供該值;
logAbandoned:是否記錄中斷事件, 默認爲 false;
②C3P0數據源
C3P0是一個開放源代碼的JDBC數據源實現項目,他在Lib目錄中與Hibernate一起發佈,C3P0類包位於c3p0-0.9.0.4.jar。
知識是無限的嘛,這裏只測試一個就好了。這個就不寫了!總之C3P0配置屬性更多,更好!
再次拓展一下知識面對於使用JdbcTemplate簡化JDBC操作 實現數據庫操作
Spring JDBC框架由4個部分組成,即core、datasource、object、support。
org.springframework.jdbc.core包由JdbcTemplate類以及相關的回調接口(callback interface)和類組成。
org.springframework.jdbc.datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實現(主要用於單元測試以及在J2EE容器之外使用JDBC)組成。工具類提供了一些靜態方法,諸如通過JNDI獲取數據連接以及在必要的情況下關閉這些連接。它支持綁定線程的連接,比如被用於DataSourceTransactionManager的連接。
org.springframework.jdbc.object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全並且可重複使用的。它們類似於JDO,與JDO的不同之處在於查詢結果與數據庫是“斷開連接”的。它們是在org.springframework.jdbc.core包的基礎上對JDBC更高層次的抽象。
org.springframework.jdbc.support包提供了一些SQLException的轉換類以及相關的工具類
據說我們在src下新建applicationContext.xml內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 掃描類包, 將標註Spring註解的類自動轉化爲Bean,
同時完成Bean的注入 -->
<context:component-scan base-package="mysqlt"/>
<!-- 定義一個使用DBCP實現的數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/mysql2020"
p:username="root"
p:password="123456"/>
<!-- 定義jdbc模板Bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"/>
</beans>
【注意】
@Autowired
private JdbcTemplate jdbcTemplate;
這樣寫會報錯:無法訪問org.springframework.dao.DataAccessException
你需要加下面的依賴,這是筆者剛剛踩過的坑。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
其實,一個Mevan不可以在項目中直接加jar包。一定要通過Mevan倉庫來加。你可以創建一個假的文件包也可以從網上找依賴資源【筆者剛剛踩過的坑】
也就是說,必須以依賴的形式添加驅動、jdbc、pool
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
上面是一些艱辛的歷程,下面是總結
【demo】
1、DemoApplication啓動類
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2、application.properties配置文件
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mysql2020
spring.datasource.username=root
spring.datasource.password=123456
3、application.yml配置文件
server:
port: 8089
servlet:
context-path: /frozen
http:
#最大連接數
maxTotal: 100
#併發數
defaultMaxPerroute: 30
#創建連接的最長時間
connectTimeout: 1000
#從連接池中獲取到連接的最長時間
connectionRequestTimeout: 500
#數據傳輸的最長時間
socketTimeout: 10000
#提交請求前測試連接是否可用
staleConnectionCheckEnabled: true
4、applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 掃描類包, 將標註Spring註解的類自動轉化爲Bean,同時完成Bean的注入 -->
<context:component-scan base-package="com.example.demo"/>
<!-- 定義一個使用DBCP實現的數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/mysql2020/"
p:username="root"
p:password="123456"/>
<!-- 定義jdbc模板Bean -->
<!-- 配置 Spirng 的 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
5、SpringMysqlConnec測試類
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/redant")
public class SpringMysqlConnect {
@Autowired
JdbcTemplate jdbcTemplate;
@GetMapping("/20200423")
public List queryMysqlTest(){
String sql = "select * from ceshi";
List<?> lst = jdbcTemplate.queryForList(sql);
System.out.println("共有" + lst.size() +"個");
/*for (int i = 0; i < lst.size(); i++) {
System.out.println(lst.get(i));
}*/
return lst;
}
}