【Spring】Spring的數據庫開發 - 2、Spring JdbcTemplate的常用方法(execute、update、query)


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框架的強大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM