Spring學習(七)Spring JdbcTemplate
Spring JdbcTemplate
lombok
以前的Java專案中,充斥著太多不友好的程式碼:POJO的getter/setter/toString;異常處理;I/O流的關閉操作等等,這些樣板程式碼既沒有技術含量,又影響著程式碼的美觀,Lombok應運而生。
lombok是一個工具類庫,可以用簡單的註解形式來簡化程式碼,提高開發效率。
如果你想要了解更多:lombok用法 - 樑子領域 - 部落格園 (cnblogs.com)
在maven新增依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency>
使用
直接在相應的實體類上加上@Data註解即可;
使用前
package com.template; public class User { private String id; private String lastName; private int age; private String email; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
使用後
package com.template;
import lombok.Data;
@Data
public class User {
private String id;
private String lastName;
private int age;
private String email;
}
簡介
Spring對資料庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource註冊到JdbcTemplate之中。
其全限定命名為org.springframework.jdbc.core.JdbcTemplate。
JdbcTemplate主要提供五類方法
- execute方法:可以用於執行任何SQL語句,一般用於執行DDL語句;
- update方法:update方法用於執行新增、修改、刪除等語句;
- batchUpdate方法:batchUpdate方法用於執行批處理相關語句;
- query方法及queryForXXX方法:用於執行查詢相關語句;
- call方法:用於執行儲存過程、函式相關語句。
準備工作
1.在pom.xml檔案中,增加依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<!--事務-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
2.建立資料庫
CREATE DATABASE jdbc_test;
USE jdbc_test;
CREATE TABLE user (
id VARCHAR(32) NOT NULL,
name VARCHAR(32),
age INT(2),
email VARCHAR(32)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
配置
在 Spring 中,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.xsd">
<!-- 配置資料來源 -->
<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/xx" />
<!--連線資料庫的使用者名稱-->
<property name="username" value="root" />
<!--連線資料庫的密碼-->
<property name="password" value="root" />
</bean>
<!--配置JDBC模板-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--預設必須使用資料來源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置注入類-->
<bean id="xxx" class="xxx">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
...
</beans>
當前使用MySQL 資料庫,如果您使用的是其它資料庫,需要對內容進行相應的修改。
上述程式碼中定義了 3 個 Bean,分別是 dataSource、jdbcTemplate 和需要注入類的 Bean。其中 dataSource 對應的是 DriverManagerDataSource 類,用於對資料來源進行配置;jdbcTemplate 對應 JdbcTemplate 類,該類中定義了 JdbcTemplate 的相關配置。
在 dataSource 中,定義了 4 個連線資料庫的屬性,如下表所示。
屬性名 | 說明 |
---|---|
driverClassName | 所使用的驅動名稱,對應驅動 JAR 包中的 Driver 類 |
url | 資料來源所在地址 |
username | 訪問資料庫的使用者名稱 |
password | 訪問資料庫的密碼 |
上表中的屬性值需要根據資料庫型別或者機器配置的不同進行相應設定。如果資料庫型別不同,則需要更改驅動名稱。如果資料庫不在本地,則需要將 localhost 替換成相應的主機 IP。
在定義 JdbcTemplate 時,需要將 dataSource 注入到 JdbcTemplate 中。而在其他的類中要使用 JdbcTemplate,也需要將 JdbcTemplate 注入到使用類中(通常注入 dao 類中)。
使用方法
在 JdbcTemplate 類中,提供了大量的查詢和更新資料庫的方法,如 query()、update() 等,如下表所示。
方法 | 說明 |
---|---|
public int update(String sql) | 用於執行新增、修改、刪除等語句 args 表示需要傳入到 query 中的引數 |
public int update(String sql,Object... args) | 用於執行新增、修改、刪除等語句 args 表示需要傳入到 query 中的引數 |
public void execute(String sql) | 可以執行任意 SQL,一般用於執行 DDL 語句 action 表示執行完 SQL 語句後,要呼叫的函式 |
public T execute(String sql, PreparedStatementCallback action) | 可以執行任意 SQL,一般用於執行 DDL 語句 action 表示執行完 SQL 語句後,要呼叫的函式 |
public T query(String sql, ResultSetExtractor rse) | 用於執行查詢語句 以 ResultSetExtractor 作為引數的 query 方法返回值為 Object,使用查詢結果需要對其進行強制轉型 以 RowMapper 作為引數的 query 方法返回值為 List |
public List query(String sql, RowMapper rse) | 用於執行查詢語句 以 ResultSetExtractor 作為引數的 query 方法返回值為 Object,使用查詢結果需要對其進行強制轉型 以 RowMapper 作為引數的 query 方法返回值為 List |
示例
package com.template;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
public User(){
}
private String id;
private String name;
private int age;
private String email;
}
package com.template;
import java.util.List;
public interface UserDao {
/**
* 儲存使用者
*/
void saveUser(User user);
/**
* 查詢使用者
*/
List<User> listUser();
}
package com.template;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
private UserDao userDao;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setDataSource(DataSource datasource) {
this.jdbcTemplate = new JdbcTemplate(datasource);
}
@Override
public void saveUser(User user) {
this.jdbcTemplate.update("INSERT INTO USER(id,name,age,email) VALUES (?,?,?,?)",user.getId(), user.getName(), user.getAge(),user.getEmail());
}
@Override
public List<User> listUser() {
List<User> users = this.jdbcTemplate.query("SELECT id,name,age,email FROM user", new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
user.setEmail(rs.getString("email"));
return user;
}
});
return users;
}
}
package com;
import com.template.User;
import com.template.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MainApp {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
UserDao dao = (UserDao) ctx.getBean("userdao");
dao.saveUser(new User("1","青杉", 12,"Emial"));
dao.saveUser(new User("2","青杉2", 20,"Emial"));
List<User> users = dao.listUser();
for (User user : users) {
System.out.println("姓名:" + user.getName() + "\t年齡:" + user.getAge());
}
}
}
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 配置資料來源 -->
<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/jdbc_test?useUnicode=true&useJDBCCompliantTimezoneShift=true&serverTimezone=UTC&characterEncoding=utf8" />
<!--連線資料庫的使用者名稱 -->
<property name="username" value="root" />
<!--連線資料庫的密碼 -->
<property name="password" value="123456" />
</bean>
<!--配置JDBC模板 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<!--預設必須使用資料來源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="userdao" class="com.template.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>
執行MainApp輸出結果
姓名:青杉 年齡:12
姓名:青杉2 年齡:20