SpringBoot2.x系列教程41--整合使用JdbcTemplate

我在上一章節中,重點講解了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中測試我們剛纔創建的接口。

其他接口不一一測試,都可以正常使用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章