我在上一章節中,重點講解了Spring中關於DataSource的一些理論知識點,接下來本章節我主要是帶大家學習JdbcTemplate的使用。
一. JdbcTemplate
1. JdbcTemplate簡介
JDBC雖然能夠滿足大部分用戶最基本的需求,但是在使用JDBC時,必須自己來管理數據庫的資源,如獲取PreparedStatement,設置SQL語句參數,關閉連接等操作,使用起來非常的麻煩。
所以爲了簡化對JDBC的操作,Spring爲數據庫JDBC做了深層次的封裝。它利用DI注入功能,把DataSource注入到了JdbcTemplate之中,從而得到了JdbcTemplate操作模板類。JdbcTemplate的出現,使得JDBC的操作更加簡單易用。
2. JdbcTemplate的作用
JdbcTemplate可以幫助我們處理資源的建立和釋放,運行核心的JDBC工作流,如Statement的建立和執行,而我們只需要提供SQL語句和提取結果;並且也可以使我們避免一些常見的錯誤,比如忘記關閉數據庫連接。
3. JdbcTemplate依賴包介紹
JdbcTemplate位於spring-jdbc-xxx.jar包中,其全限定命名爲org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemplate還需一個spring-tx-xxx.jar依賴包,該包包含了事務和異常控制。
4. JdbcTemplate主要提供以下五類方法:
- execute方法:可以用於執行任何SQL語句,一般用於執行DDL語句;
- update方法及batchUpdate方法:update方法用於執行INSERT、UPDATE、DELETE等DML語句;batchUpdate方法用於執行批處理相關語句;
- query方法及queryForXXX方法:用於執行DQL查詢相關語句;
- call方法:用於執行存儲過程、函數相關語句。
5. JdbcTemplate使用步驟
- 導入數據庫相關依賴包,比如jpa或者jdbc;
- 獲取所需的某個DataSource數據源連接池對象;
- 創建JdbcTemplate對象,傳入到連接池中;
- 調用execute、update、queryXxx等方法。
二. Spring Boot中整合JdbcTemplate
1. 準備工作
- SpringBoot 2.x
- jdk 1.8
- maven 3.0
- ideal
- mysql
2. 創建一個web項目(略)
將該項目改造成spring-boot項目,具體過程請參考我之前關於spring-boot項目創建的章節。
項目結構:
3. pom.xml文件中添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入Druid依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
4. 添加application.yml配置信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db5?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true
username: root
password: syc
driver-class-name: com.mysql.cj.jdbc.Driver #mysql6.0之後推薦使用這個驅動包
注意:
- mysql-connector-java版本6.0以前使用的是com.mysql.jdbc.Driver;
- 6.0以後的使用com.mysql.cj.jdbc.Driver
5. 創建數據庫配置
下面是第一種數據源配置方式。
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第一種配置方式
*/
@ComponentScan
@Configuration
public class DbConfig {
@Autowired
private Environment env;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
}
也可以採用第二種配置方式:
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第二種配置數據源的方式
*/
@Data
@ComponentScan
@Configuration
@ConfigurationProperties(prefix="spring.datasource")
public class SecondDbConfig {
private String url;
private String username;
private String password;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
6. 創建Users實體類
package com.yyg.boot.domain;
import lombok.Data;
import lombok.ToString;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Data
@ToString
public class Users {
private Integer id;
private String username;
private String password;
}
7. 創建Dao層代碼
7.1 dao層的IUserDao接口
package com.yyg.boot.dao;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserDao {
int add(Users student);
int update(Users student);
int delete(int id);
Users findUserById(int id);
List<Users> findUserList();
}
7.2 dao層的UserDaoImpl接口實現
package com.yyg.boot.dao.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int add(Users user) {
return jdbcTemplate.update("insert into users(username, password) values(?, ?)",
user.getUsername(),user.getPassword());
}
@Override
public int update(Users user) {
return jdbcTemplate.update("UPDATE users SET username=? ,password=? WHERE id=?",
user.getUsername(),user.getPassword(),user.getId());
}
@Override
public int delete(int id) {
return jdbcTemplate.update("DELETE from TABLE users where id=?",id);
}
@Override
public Users findUserById(int id) {
// BeanPropertyRowMapper 使獲取的 List 結果列表的數據庫字段和實體類自動對應
List<Users> list = jdbcTemplate.query("select * from users where id = ?", new Object[]{id}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list.get(0):null;
}
@Override
public List<Users> findUserList() {
// 使用Spring的JdbcTemplate查詢數據庫,獲取List結果列表,數據庫表字段和實體類自動對應,可以使用BeanPropertyRowMapper
List<Users> list = jdbcTemplate.query("select * from users", new Object[]{}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list:null;
}
}
8. 創建Service層代碼
8.1 創建service層的IUserService接口
package com.yyg.boot.service;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserService {
int add(Users user);
int update(Users user);
int delete(int id);
Users findUserById(int id);
List<Users> findUserList();
}
8.2 創建service層的UserServiceImpl接口實現
package com.yyg.boot.service.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public int add(Users user) {
return userDao.add(user);
}
@Override
public int update(Users user) {
return userDao.update(user);
}
@Override
public int delete(int id) {
return userDao.delete(id);
}
@Override
public Users findUserById(int id) {
return userDao.findUserById(id);
}
@Override
public List<Users> findUserList() {
return userDao.findUserList();
}
}
9. 創建Web層的Controller
package com.yyg.boot.web;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService iUserService;
@PostMapping("")
public int addUser(@RequestBody Users user){
return iUserService.add(user);
}
@PutMapping("/{id}")
public String updateUser(@PathVariable Integer id, @RequestBody Users user){
Users oldUser = new Users();
oldUser.setId(id);
oldUser.setUsername(user.getUsername());
oldUser.setPassword(user.getPassword());
int t = iUserService.update(oldUser);
if (t == 1){
return user.toString();
}else {
return "更新學生信息錯誤";
}
}
@GetMapping("/{id}")
public Users findUserById(@PathVariable Integer id){
return iUserService.findUserById(id);
}
@GetMapping("/list")
public List<Users> findUserList(){
return iUserService.findUserList();
}
@DeleteMapping("/{id}")
public int deleteUserById(@PathVariable Integer id){
return iUserService.delete(id);
}
}
10. 創建啓動類
package com.yyg.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@SpringBootApplication
public class JdbcApplication {
public static void main(String[] args){
SpringApplication.run(JdbcApplication.class,args);
}
}
11. 完整項目結構
12. 接口測試
在瀏覽器或者postman中測試我們剛纔創建的接口。
其他接口不一一測試,都可以正常使用!