Spring JdbcTemplate的常用方法
簡單記錄-Java EE企業級應用開發教程(Spring+Spring MVC+MyBatis)-Spring的數據庫開發
在JdbcTemplate類中,提供了大量的更新和查詢數據庫的方法,我們就是使用這些方法來操作數據庫的。
execute()
execute()
execute(String sql)方法可用於執行sql語句
下面就以創建數據表的SQL語言為例,來說明。
(1)在MySQL中,創建一個名為spring的數據庫,創建方式如圖所示
在圖中,首先使用SQL語句創建了數據庫spring(create database spring;
),然后選擇使用spring數據庫(use spring;
)。
然后再查看數據庫中的表,其結果顯示為空。(show tables;
)
(2)在Idea中,在JavaEE-enterprise-application-development-tutorial項目里,創建一個名為chapter04的Maven項目module
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.awen</groupId>
<artifactId>JavaEE-enterprise-application-development-tutorial</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>chapter01</module>
<module>chapter02</module>
<module>chapter04</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</project>
會自動下載導入對應的依賴項。
(3)在在src/main/resources目錄下,創建Spring的配置文件applicationContext.xml,在該文件中配置id為dataSource的數據源Bean和id為jdbcTemplate的JDBC模板Bean,並將數據源注入到JDBC模板中,如文件所示。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 1配置數據源 -->
<bean id="dataSource" class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--數據庫驅動 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!--連接數據庫的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring?useSSL=false" />
<!--連接數據庫的用戶名 -->
<property name="username" value="root" />
<!--連接數據庫的密碼 -->
<property name="password" value="123456" />
</bean>
<!-- 2配置JDBC模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默認必須使用數據源 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
(4)在chapter04模塊的src/main/java目錄下,創建一個com.awen.jdbc包,在該包中創建測試類JdbcTemplateTest。在該類的main()方法中通過Spring容器獲取在配置文件中定義的JdbcTemplate實例,然后使用該實例的execute(String sql)方法執行創建數據表的SQL語句,如文件所示。JdbcTemplateTest.java
package com.awen.jdbc;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateTest {
/** * 使用execute()方法建表 */
public static void main(String[] args) {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取JdbcTemplate實例
JdbcTemplate jdTemplate =
(JdbcTemplate) applicationContext.getBean("jdbcTemplate");
// 使用execute()方法執行SQL語句,創建用戶賬戶管理表account
jdTemplate.execute("create table account(" +
"id int primary key auto_increment," +
"username varchar(50)," +
"balance double)");
System.out.println("賬戶表account創建成功!");
}
}
成功運行程序后,
D:\Environments\jdk-11.0.2\bin\java.exe -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=9076:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.awen.jdbc.JdbcTemplateTest
賬戶表account創建成功!
Process finished with exit code 0
再次查詢spring數據庫,其結果如圖所示。
從圖可以看出,程序使用execute(String sql)方法執行的SQL語句已成功創建了數據表account。
刪除MySQL數據表的通用語法:
DROP TABLE table_name ;
再刪除掉DROP TABLE account;
問題:
我安裝MySQL 版本5.7.28
Connector/J version
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
** BEGIN NESTED EXCEPTION **
javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify STACKTRACE: javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:2249)
at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4232)
at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1472)
at org.springframework.jdbc.datasource.DataSourceUtils.doCloseConnection(DataSourceUtils.java:402)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:389)
at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:356)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:392)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:418)
at com.awen.jdbc.JdbcTemplateTest.main(JdbcTemplateTest.java:20)
** END NESTED EXCEPTION **
賬戶表account創建成功!
Process finished with exit code 0
javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer’s close_notify
<!--連接數據庫的url -->
<property name="url" value="jdbc:mysql://localhost:3306/spring?useSSL=false" />
配置url加上 useSSL=false 解決
使用JUnit單元測試
在軟件開發過程中,需要有相應的測試工作。依據測試目的不同,可以將軟件測試分為單元測試、集成測試、確認測試和系統測試等。其中單元測試在軟件開發階段是最底層的測試,它易於及時發現並解決問題。JUnit就是一個進行單元測試的開源框架,下面以上個示例,來學習單元測試框架JUnit4的使用。
將文件JdbcTemplateTest.java中的main()方法,修改成名稱為mainTest()的普通方法,並在方法上添加單元測試的注解@Test,其代碼如下所示。
@Test
public void mainTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取JdbcTemplate實例
JdbcTemplate jdTemplate =
(JdbcTemplate) applicationContext.getBean("jdbcTemplate");
// 使用execute()方法執行SQL語句,創建用戶賬戶管理表account
jdTemplate.execute("create table account(" +
"id int primary key auto_increment," +
"username varchar(50)," +
"balance double)");
System.out.println("賬戶表account創建成功!");
}
@Test就是Junit4用於測試的注解,要測試哪個方法,只需要在相應測試的方法上添加此注解即可。
當在需要測試的方法上添加@Test注解后,idea會在所添加的@Test處報出Test cannot be resolved to a type的錯誤。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
pom.xml加入依賴后,在測試類中會自動導入org.junit.Test包,此時測試類中的代碼將不再報錯。在執行程序時,只需使用鼠標右鍵,在彈出的快捷菜單中選擇Run mainTest()選項來運行測試方法即可,
單擊JUnit Test選項后,Unit視圖窗口的進度條為綠色表明運行結果正確,如果進度條為紅色則表示有錯誤,並且會在窗口中顯示所報的錯誤信息。需要注意的是,在運行此方法時,需要先將數據庫中已創建好的account表刪除,否則執行此方法時會報出account表已經存在的錯誤。測試執行通過后,Console控制台的輸出結果如圖所示。
運行結果可以看出,mainTest()方法已經執行成功,這就是單元測試的使用。
update()
update()
update()用於執行插入、更新和刪除操作
update()方法可以完成插入、更新和刪除數據的操作。在JdbcTemplate類中,提供了一系列的update()方法,其常用方法如表所示。
int update(String sql) 該方法是最簡單的update方法重載形式,它直接執行傳入的SQL語句,並返回受影響的行數。
接下來,通過一個用戶賬戶管理的案例來演示update()方法的使用。
小案例
在chapter04項目的com.itheima.jdbc包中,創建Account類,在該類中定義id、username和balance屬性,以及其對應的getter/setter方法,如文件所示。
Account.java
package com.awen.jdbc;
public class Account {
private Integer id; // 賬戶id
private String username; // 用戶名
private Double balance; // 賬戶余額
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public String toString() {
return "Account [id=" + id + ", "
+ "username=" + username +
", balance=" + balance + "]";
}
}
(2)在com.awen.jdbc包中,創建接口AccountDao,並在接口中定義添加、更新和刪除賬戶的方法,如文件所示。AccountDao.java
package com.awen.jdbc;
import java.util.List;
public interface AccountDao {
// 添加
public int addAccount(Account account);
// 更新
public int updateAccount(Account account);
// 刪除
public int deleteAccount(int id);
// 通過id查詢
public Account findAccountById(int id);
// 查詢所有賬戶
public List<Account> findAllAccount();
}
(3)在com.awen.jdbc包中,創建AccountDao接口的實現類AccountDaoImpl,並在類中實現添加、更新和刪除賬戶的方法,編輯后如文件所示。
AccountDaoImpl.java
package com.awen.jdbc;
import java.util.List;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class AccountDaoImpl implements AccountDao {
// 聲明JdbcTemplate屬性及其setter方法
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 添加賬戶
public int addAccount(Account account) {
// 定義SQL
String sql = "insert into account(username,balance) value(?,?)";
// 定義數組來存放SQL語句中的參數
Object[] obj = new Object[] {
account.getUsername(),
account.getBalance()
};
// 執行添加操作,返回的是受SQL語句影響的記錄條數
int num = this.jdbcTemplate.update(sql, obj);
return num;
}
// 更新賬戶
public int updateAccount(Account account) {
// 定義SQL
String sql = "update account set username=?,balance=? where id = ?";
// 定義數組來存放SQL語句中的參數
Object[] params = new Object[] {
account.getUsername(),
account.getBalance(),
account.getId()
};
// 執行添加操作,返回的是受SQL語句影響的記錄條數
int num = this.jdbcTemplate.update(sql, params);
return num;
}
// 刪除賬戶
public int deleteAccount(int id) {
// 定義SQL
String sql = "delete from account where id = ? ";
// 執行添加操作,返回的是受SQL語句影響的記錄條數
int num = this.jdbcTemplate.update(sql, id);
return num;
}
}
從上述三種操作的代碼可以看出,添加、更新和刪除操作的實現步驟類似,只是定義的SQL語句有所不同。
SQL語句不同 添加 更新 刪除
insert into account(username,balance) value(?,?)
update account set username=?,balance=? where id = ?
delete from account where id = ?
(4)在applicationContext.xml中,定義一個id為accountDao的Bean,該Bean用於將jdbcTemplate注入到accountDao實例中,其代碼如下所示。
<!--定義id為accountDao的Bean-->
<bean id="accountDao" class="com.awen.jdbc.AccountDaoImpl">
<!-- 將jdbcTemplate注入到accountDao實例中 -->
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
(5)在測試類JdbcTemplateTest中,添加一個測試方法addAccountTest(),該方法主要用於添加用戶賬戶信息,其代碼如下所示。
@Test
public void addAccountTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取AccountDao實例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 創建Account對象,並向Account對象中添加數據
Account account = new Account();
account.setUsername("tom");
account.setBalance(1000.00);
// 執行addAccount()方法,並獲取返回結果
int num = accountDao.addAccount(account);
if (num > 0) {
System.out.println("成功插入了" + num + "條數據!");
} else {
System.out.println("插入操作執行失敗!");
}
}
在上述代碼中,獲取了AccountDao的實例后,又創建了Account對象,並向Account對象中添加了屬性值。然后調用了AccountDao對象的addAccount()方法向數據表中添加一條數據。最后,通過返回的受影響的行數來判斷數據是否插入成功。使用Junit4測試運行后,控制台的輸出結果如下所示。
D:\Environments\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=10289:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit5-rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit-rt.jar;D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.awen.jdbc.JdbcTemplateTest,addAccountTest
成功插入了1條數據!
Process finished with exit code 0
此時再次查詢數據庫中的account表,其結果如圖所示。
account表從圖可以看出,使用JdbcTemplate的update()方法已成功地向數據表中插入了一條數據。
(6)執行完插入操作后,接下來使用JdbcTemplate類的update()方法執行更新操作。在測試類JdbcTemplateTest中,添加一個測試方法updateAccountTest(),其代碼如下所示。
@Test
public void updateAccountTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取AccountDao實例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 創建Account對象,並向Account對象中添加數據
Account account = new Account();
account.setId(1);
account.setUsername("tom");
account.setBalance(2000.00);
// 執行updateAccount()方法,並獲取返回結果
int num = accountDao.updateAccount(account);
if (num > 0) {
System.out.println("成功修改了" + num + "條數據!");
} else {
System.out.println("修改操作執行失敗!");
}
}
與addAccountTest()方法相比,更新操作的代碼增加了id屬性值的設置,並將余額修改為2000后,調用了AccountDao對象中的updateAccount()方法執行對數據表的更新操作。
D:\Environments\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=10374:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit5-rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit-rt.jar;D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.awen.jdbc.JdbcTemplateTest,updateAccountTest
成功修改了1條數據!
Process finished with exit code 0
使用Junit4運行方法后,再次查詢數據庫中的account表,其結果如圖所示。
圖 account表從圖可以看出,使用update()方法已成功更新了account表中id為1的賬戶余額信息。
(7)在測試類JdbcTemplateTest中,添加一個測試方法deleteAccountTest(),來執行刪除操作,其代碼如下所示。
@Test
public void deleteAccountTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取AccountDao實例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 執行deleteAccount()方法,並獲取返回結果
int num = accountDao.deleteAccount(1);
if (num > 0) {
System.out.println("成功刪除了" + num + "條數據!");
} else {
System.out.println("刪除操作執行失敗!");
}
}
在上述代碼中,獲取了AccountDao的實例后,執行了實例中的deleteAccount()方法來刪除id為1的數據。
使用Junit4測試運行方法后,
D:\Environments\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=10410:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit5-rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit-rt.jar;D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.awen.jdbc.JdbcTemplateTest,deleteAccountTest
成功刪除了1條數據!
Process finished with exit code 0
查詢account表中數據,其結果如圖所示。
account表從圖可以看出,已成功通過delete()方法刪除了id為1的數據。由於account表中只有一條數據,所以刪除后表中數據為空。
query()
query()
query()用於執行數據查詢操作
JdbcTemplate類中還提供了大量的query()方法來處理各種對數據庫表的查詢操作。其中,常用的幾個query()方法如下表所示:
JdbcTemplate中常用的query()方法
了解了幾個常用的query()方法后,接下來通過一個具體的案例來演示query()方法的使用,其實現步驟如下。
(1)向數據表account中插入幾條數據可以利用上面添加也可以寫SQL語句直接在MySQL里面執行(也可以使用數據庫圖形化工具手動向表中插入數據),插入后account表中的數據如圖所示。
本章對Spring框架中,使用JDBC進行數據操作的知識進行了詳細講解。首先講解了Spring JDBC中的核心類以及如何在Spring中配置JDBC,然后通過案例講解了Spring JDBC核心類JdbcTemplate中常用方法的使用。
(2)在AccountDao中,分別創建一個通過id查詢單個賬戶和查詢所有賬戶的方法,其代碼如下所示。
// 通過id查詢
public Account findAccountById(int id);
// 查詢所有賬戶
public List<Account> findAllAccount();
(3)在AccountDao接口的實現類AccountDaoImpl中,實現接口中的方法,並使用query()方法分別進行查詢,其代碼如下所示。
// 通過id查詢賬戶數據信息
public Account findAccountById(int id) {
//定義SQL語句
String sql = "select * from account where id = ?";
// 創建一個新的BeanPropertyRowMapper對象
RowMapper<Account> rowMapper =
new BeanPropertyRowMapper<Account>(Account.class);
// 將id綁定到SQL語句中,並通過RowMapper返回一個Object類型的單行記錄
return this.jdbcTemplate.queryForObject(sql, rowMapper, id);
}
// 查詢所有賬戶信息
public List<Account> findAllAccount() {
// 定義SQL語句
String sql = "select * from account";
// 創建一個新的BeanPropertyRowMapper對象
RowMapper<Account> rowMapper =
new BeanPropertyRowMapper<Account>(Account.class);
// 執行靜態的SQL查詢,並通過RowMapper返回結果
return this.jdbcTemplate.query(sql, rowMapper);
}
在上面兩個方法代碼中,BeanPropertyRowMapper是RowMapper接口的實現類,它可以自動地將數據表中的數據映射到用戶自定義的類中(前提是用戶自定義類中的字段要與數據表中的字段相對應)。創建完BeanPropertyRowMapper對象后,在findAccountById()方法中通過queryForObject()方法返回了一個Object類型的單行記錄,而在findAllAccount()方法中通過query()方法返回了一個結果集合。
(4)在測試類JdbcTemplateTest中,添加一個測試方法findAccountByIdTest()來測試條件查詢,其代碼如下所示。
@Test
public void findAccountByIdTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取AccountDao實例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 執行findAccountById()方法
Account account = accountDao.findAccountById(2);
System.out.println(account);
}
上述代碼通過執行findAccountById()方法獲取了id為2的對象信息,並通過輸出語句輸出。使用JUnit4測試運行后,控制台的輸出結果。 運行結果
D:\Environments\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=10600:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit5-rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit-rt.jar;D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.awen.jdbc.JdbcTemplateTest,findAccountByIdTest
Account [id=2, username=柳小子, balance=10000.0]
Process finished with exit code 0
com.awen.jdbc.JdbcTemplateTest,findAccountByIdTest
Account [id=2, username=柳小子, balance=10000.0]
5)測試完條件查詢單個數據的方法后,接下來測試查詢所有用戶賬戶信息的方法。在測試類JdbcTemplateTest中,添加一個測試方法findAllAccountTest(),其代碼如下所示。
@Test
public void findAllAccountTest() {
// 加載配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取AccountDao實例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 執行findAllAccount()方法,獲取Account對象的集合
List<Account> account = accountDao.findAllAccount();
// 循環輸出集合中的對象
for (Account act : account) {
System.out.println(act);
}
}
在上述代碼中,調用了AccountDao對象的findAllAccount()方法查詢所有用戶賬戶信息集合,並通過for循環輸出查詢結果。使用JUnit4成功運行findAllUserTest()方法后,控制台的顯示信息如下所示。
D:\Environments\jdk-11.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=10628:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit5-rt.jar;D:\Java\ideaIU-2019.2.win\plugins\junit\lib\junit-rt.jar;D:\IdeaProjects\JavaEE-enterprise-application-development-tutorial\chapter04\target\classes;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Environments\apache-maven-3.6.2\maven-repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\Environments\apache-maven-3.6.2\maven-repo\junit\junit\4.12\junit-4.12.jar;D:\Environments\apache-maven-3.6.2\maven-repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Environments\apache-maven-3.6.2\maven-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.awen.jdbc.JdbcTemplateTest,findAllAccountTest
Account [id=2, username=柳小子, balance=10000.0]
Account [id=3, username=小柳子, balance=10.0]
Account [id=4, username=柳鐵蛋, balance=20.0]
Account [id=5, username=柳狗柱, balance=20.0]
Process finished with exit code 0
從運行結果從可以看出,數據表account中的4條記錄都已經被查詢出來。
學會如何使用Spring框架進行數據庫開發,深切的體會到Spring框架的強大。