jdbctemplate 添加_SpringBoot2.x系列教程41--整合使用JdbcTemplate

news/2024/7/16 4:35:08 标签: jdbctemplate 添加

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项目创建的章节。

项目结构:

2a05cacca02950a717888fc7e507381c.png

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. 完整项目结构

16694deed660935cde1dffd87d4168b1.png

12. 接口测试

在浏览器或者postman中测试我们刚才创建的接口。

b444dbe741d022f334c704bbaa661a7a.png

其他接口不一一测试,都可以正常使用!


http://www.niftyadmin.cn/n/712655.html

相关文章

HDU 2014:超级楼梯(动态规划)

题目传送门&#xff1a;HDU 2014&#xff1a;超级楼梯 简单动态规划&#xff08;斐波那契数列&#xff09; #include <iostream> using namespace std;int main() {int cases, n, g, f;cin >> cases;while (cases--) {cin >> n;g 0; f 1;while (n--) {f …

openssh安装_CVE202015778:OpenSSH命令注入漏洞复现

上方蓝色字体关注我们&#xff0c;一起学安全&#xff01;作者&#xff1a;Menge&小泫Timeline Sec本文字数&#xff1a;1160阅读时长&#xff1a;3&#xff5e;4min声明&#xff1a;请勿用作违法用途&#xff0c;否则后果自负0x01 简介OpenSSH是SSH(Secure SHell)协议的免…

20个梦露的商业计划书

如果说让一个程序员除了写代码&#xff0c;还要路演项目ppt,书写商业计划书。那真的是让人兴奋&#xff0c;甚至还有些小激动。作为担当此任的我不由自主得又吹起了牛逼。额&#xff5e;好吧&#xff0c;如此真情流露的“诚实”确实是让人头大。开始我们话题吧。 1962年8月5号玛…

Extjs Design 可视化开发工具

2019独角兽企业重金招聘Python工程师标准>>> Extjs 出可视化开发工具啦! 不清楚Ext可视化的可以看一下http://www.screencast.com/users/JackSlocum这里的三个视频哈。 安装和汉化的步骤 第一步下载&#xff1a;Ext需要支持AIR的支持 下载并安装 http://aird…

asBroadcastStream

StreamSubscription sc StreamSubscription(); Stream s Stream(); sc.addStream(s); var bs sc.stream.asBroadcastStream(); // this works转载于:https://www.cnblogs.com/pythonClub/p/10839163.html

HDU 2044:一只小蜜蜂...(动态规划)

题目地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2044 斐波那契数列&#xff0c;动态规划&#xff0c;打表 观察可知&#xff1a;要到达一个蜂房&#xff0c;如果这个蜂房在第一排&#xff0c;只能从它左边的蜂房或者左下方的蜂房过来&#xff1b;如果这个蜂…

冲压模板自动标注LISP_史上最全的冲压模具资料(连载一)

★冲压模具的概念冲压模具&#xff0c;也称冲模、五金模具、五金冲压模具&#xff0c;意思差不多都是一样的。是指利用固定在冲床或压力机上的模具对金属或非金属板材施加一定的压力&#xff0c;使材料产生分离或成型&#xff0c;从而获得一定尺寸要求、外观质量合格的零件的压…

win 8 共享连接数是多少_解决不同系统间的共享问题

WindowsXP系统的计算机有时无法访问Windows7或Windows10系统中的共享文件夹。如何解决呢&#xff1f;请看以下图解&#xff1a;步骤1打开“控制面板”窗口&#xff0c;单击“系统和安全”分类下的"Windows防火墙“链接&#xff0c;打开”Windows防火墙“窗口&#xff0c;如…