Spring Boot:整合JdbcTemplate

综合概述

Spring对数据库的操作在jdbc上面做了更深层次的封装,而JdbcTemplate便是Spring提供的一个操作数据库的便捷工具。我们可以借助JdbcTemplate来执行所有数据库操作,例如插入,更新,删除和从数据库中检索数据,并且有效避免直接使用jdbc带来的繁琐编码。

JdbcTemplate主要提供以下五种类型的方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。
  • update、batchUpdate方法:用于执行新增、修改、删除等语句。
  • query方法及queryForXXX方法:用于执行查询相关的语句。
  • call方法:用于执行数据库存储过程和函数相关的语句。

当然,在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate或者Spring Data JPA,我们这里讲解JdbcTemplate的整合,只是告诉大家有这么一种操作数据库的方式。

实现案例

接下来,我们就以一个具体的例子来学习如何利用Spring的JdbcTemplate来进行数据库操作。

生成项目模板

为方便我们初始化项目,Spring Boot给我们提供一个项目模板生成网站。

  1. 打开浏览器,访问:https://start.spring.io/

  2. 根据页面提示,选择构建工具,开发语言,项目信息等。

  3. 点击 Generate the project,生成项目模板,生成之后会将压缩包下载到本地。

  4. 使用IDE导入项目,我这里使用Eclipse,通过导入Maven项目的方式导入。

Spring Boot:整合JdbcTemplate

创建数据库表

这里使用MySQL数据库,版本是8.0.16,在项目根目录下新建db目录,然后在其中编写一个数据库脚本文件。

在MySQL数据库新建一个springboot数据库,然后在此数据库中执行下面的提供的脚本创建项目的用户表。

脚本文件

Spring Boot:整合JdbcTemplate

SQL脚本内容

springboot.sql

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user (
  id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
  name varchar(50) NOT NULL COMMENT '用户名',
  nick_name varchar(150) DEFAULT NULL COMMENT '昵称',
  avatar varchar(150) DEFAULT NULL COMMENT '头像',
  password varchar(100) DEFAULT NULL COMMENT '密码',
  salt varchar(40) DEFAULT NULL COMMENT '加密盐',
  email varchar(100) DEFAULT NULL COMMENT '邮箱',
  mobile varchar(100) DEFAULT NULL COMMENT '手机号',
  status tinyint(4) DEFAULT NULL COMMENT '状态  0:禁用   1:正常',
  dept_id bigint(20) DEFAULT NULL COMMENT '机构ID',
  create_by varchar(50) DEFAULT NULL COMMENT '创建人',
  create_time datetime DEFAULT NULL COMMENT '创建时间',
  last_update_by varchar(50) DEFAULT NULL COMMENT '更新人',
  last_update_time datetime DEFAULT NULL COMMENT '更新时间',
  del_flag tinyint(4) DEFAULT '0' COMMENT '是否删除  -1:已删除  0:正常',
  PRIMARY KEY (id),
  UNIQUE KEY name (name)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8 COMMENT='用户管理';

添加相关依赖

添加项目需要的相关依赖,这里需要添加上WEB和Swagger和JDBC和MYSQL的依赖,Swagger的添加是为了方便接口测试。

pom.xml

"1.0" encoding="UTF-8"?>
"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">
    4.0.0

        org.springframework.boot
        spring-boot-starter-parent
        2.1.5.RELEASE

    com.louis.springboot
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot

        1.8

                org.springframework.boot
                spring-boot-starter-web

            io.springfox
            springfox-swagger2
            2.9.2

            io.springfox
            springfox-swagger-ui
            2.9.2

            org.springframework.boot
            spring-boot-starter-jdbc

            mysql
            mysql-connector-java

            org.springframework.boot
            spring-boot-starter-test
            test

                org.springframework.boot
                spring-boot-maven-plugin

                src/main/java

                    **/sqlmap/*.xml

                false

                src/main/resources

                        **/*.*

                    true

添加相关配置

1.添加数据源配置

将application.properties文件改名为application.yml ,并在其中添加MySQL数据源连接信息。

注意:

这里需要首先创建一个MySQL数据库,并输入自己的用户名和密码。这里的数据库是springboot。

另外,如果你使用的是MySQL 5.x及以前版本,驱动配置driverClassName是com.mysql.jdbc.Driver。

server:
  port: 8080
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
    username: root
    password: 123456
  1. 添加swagger 配置

添加一个swagger 配置类,在工程下新建 config 包并添加一个 SwaggerConfig 配置类。

SwaggerConfig.java

package com.louis.springboot.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any()).build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("SpringBoot API Doc")
                .description("This is a restful api document of Spring Boot.")
                .version("1.0")
                .build();
    }

}

编写业务代码

新建model包并在其中编写model类SysUser。

SysUser.java

package com.louis.springboot.demo.model;

import java.util.Date;

public class SysUser {
    private Long id;

    private String name;

    private String nickName;

    private String avatar;

    private String password;

    private String salt;

    private String email;

    private String mobile;

    private Byte status;

    private Long deptId;

    private String createBy;

    private Date createTime;

    private String lastUpdateBy;

    private Date lastUpdateTime;

    private Byte delFlag;

    // 省略setter和getter
}

新建dao包并在其中编写dao类SysUserDao,dao包含一些基础的操作方法。

SysUserDao.java

package com.louis.springboot.demo.dao;
import java.util.List;
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 com.louis.springboot.demo.model.SysUser;

@Repository
public class SysUserDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    /**
     * 保存用户
     * @param user
     */
    public void save(SysUser user) {
        String sql = "insert into sys_user(id, name, nick_name, password, email) values(?,?,?,?,?)";
        jdbcTemplate.update(sql, user.getId(), user.getName(), user.getNickName(), user.getPassword(), user.getEmail());
    }

    /**
     * 删除用户
     * @param user
     */
    public void delete(String id) {
        String sql = "delete from sys_user where id=?";
        jdbcTemplate.update(sql, id);
    }

    /**
     * 查询全部用户
     * @return
     */
    public List findAll() {
        String sql = "select * from sys_user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper(SysUser.class));
    }
}

新建service包并在其中编写服务接口SysUserService。

SysUserService.java

package com.louis.springboot.demo.service;
import java.util.List;
import com.louis.springboot.demo.model.SysUser;

public interface SysUserService {

    /**
     * 保存用户
     * @param user
     */
    public void save(SysUser user);

    /**
     * 删除用户
     * @param id
     */
    public void delete(String id);

    /**
     * 查询全部用户
     * @return
     */
    public List findAll();

}

新建service.impl包并在其中编写服务实现类SysUserServiceImpl并调用DAO实现相关方法。

SysUserServiceImpl.java

package com.louis.springboot.demo.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.louis.springboot.demo.dao.SysUserDao;
import com.louis.springboot.demo.model.SysUser;
import com.louis.springboot.demo.service.SysUserService;

@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserDao sysUserDao;

    @Override
    public void save(SysUser user) {
        sysUserDao.save(user);
    }

    @Override
    public void delete(String id) {
        sysUserDao.delete(id);
    }

    @Override
    public List findAll() {
        return sysUserDao.findAll();
    }

}

新建controller包并在其中编写用户控制器SysUserController,并调用相关服务。

SysUserController.java

package com.louis.springboot.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.louis.springboot.demo.model.SysUser;
import com.louis.springboot.demo.service.SysUserService;

@RestController
@RequestMapping("user")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @PostMapping(value="/save")
    public Object save(@RequestBody SysUser user) {
        sysUserService.save(user);
        return 1;
    }

    @GetMapping(value="/delete")
    public Object delete(@RequestParam("id") String id) {
        sysUserService.delete(id);
        return 1;
    }

    @GetMapping(value="/findAll")
    public Object findAll() {
        return sysUserService.findAll();
    }

}

编译测试运行

  1. 右键项目 -> Run as -> Maven install,开始执行Maven构建,第一次会下载Maven依赖,可能需要点时间,如果出现如下信息,就说明项目编译打包成功了。

  2. 右键文件 DemoApplication.java -> Run as -> Java Application,开始启动应用,当出现如下信息的时候,就说明应用启动成功了,默认启动端口是8080。

Spring Boot:整合JdbcTemplate
  1. 打开浏览器,访问:http://localhost:8080/swagger-ui.html,进入swagger接口文档界面。

  2. 首先执行以下findAll接口,此时因为没有数据,所以没有返回记录。

Spring Boot:整合JdbcTemplate

接着执行两次save方法,分别保存下面两条记录。

{
  "id": 1,
  "name": "iverson",
  "nickName": "ai",
  "password": "123",
  "email": "iverson@qq.com"
}
{
  "id": 2,
  "name": "kobe",
  "nickName": "kobe",
  "password": "123",
  "email": "kobe@qq.com"
}

然后再次执行findAll接口,这时我们可以看到,成功返回了我们上面插入的两条记录。

Spring Boot:整合JdbcTemplate

接着执行一次delete方法,输入id为1,删除插入的第一条记录。

Spring Boot:整合JdbcTemplate

然后再次执行findAll接口,这时我们可以看到,我们插入的第一条记录已经成功被删除。

Spring Boot:整合JdbcTemplate

相关导航

Spring Boot 系列教程目录导航

Spring Boot:快速入门教程

Spring Boot:整合Swagger文档

Spring Boot:整合MyBatis框架

Spring Boot:实现MyBatis分页

源码下载

码云:https://gitee.com/liuge1988/spring-boot-demo.git

作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。

Original: https://www.cnblogs.com/xifengxiaoma/p/11046099.html
Author: 朝雨忆轻尘
Title: Spring Boot:整合JdbcTemplate

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540479/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 格式化的输出

    可以使用 System.out.print(s)将数值输出到控制台中; Java SE 5.0沿用了C语言库函数中的printf方法,例如: System.out.printf(“…

    Java 2023年6月9日
    083
  • 容器内的Linux诊断工具0x.tools

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 Linux上有大量的问题诊断工具,如perf、bcc等,但这些诊断工具,虽然功能强大,但却需要很高的…

    Java 2023年6月7日
    098
  • spring事务失效的几种场景以及原因 spring事务传播机制

    1.抛出编译异常 ,事务只能捕捉运行时异常和error 解决方案: 配置rollbackFor eg. 配置@Transactional(rollbackFor = Excepti…

    Java 2023年6月6日
    0100
  • Java常用工具类(自用)

    自己做项目的一些统一配置 统一响应格式 Response类 @JsonInclude(JsonInclude.Include.NON_NULL) public class Resp…

    Java 2023年6月7日
    083
  • NumPy学习笔记

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0114
  • 纪念第一次创建博客

    在2021年10月1日,在这个重要的日子里,我在博客园对我的博客进行了第一次改动,修改了博客的背景图片和博客的模板。 Original: https://www.cnblogs.c…

    Java 2023年6月9日
    088
  • IO流(其余流的介绍)

    可以读写基本数据类型的数据* 数据输入流:DataInputStream* DataInputStream(InputStream in)* 数据输出流:DataOutputStr…

    Java 2023年6月5日
    075
  • SpringCloud 在Feign上使用Hystrix(断路由)

    SpringCloud 在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在prop…

    Java 2023年5月30日
    067
  • 【Docker入门】Docker的常用命令

    了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同。 二、Docker镜像命令 各个选项说明: REP…

    Java 2023年6月13日
    081
  • Vue学习之——–深入理解Vuex之多组件共享数据(2022/9/4)

    在上篇文章的基础上:Vue学习之——–深入理解Vuex之getters、mapState、mapGetters 1、在state中新增用户数组 …

    Java 2023年6月14日
    0116
  • 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的

    大家好,又见面了~ kafka作为一种高吞吐量的分布式发布订阅消息系统,在业务系统中被广泛的使用。 如果问你,如何提高kafka队列中的消息消费速度呢?答案很简单,topic多分几…

    Java 2023年6月7日
    096
  • 一个较重的代码坏味:“炫技式”的单行代码

    风格和习惯很重要。 很多代码坏味都是由于不良的风格和习惯导致的,并不涉及高深复杂的技术。 有一些众所周知的代码坏味。当然,也有一些个人觉得很不好的习惯和做法。我个人就不喜欢把多行代…

    Java 2023年6月9日
    076
  • nacos、ribbon和feign的简明教程

    nacos简明教程 为什么需要nacos? 在微服务架构中,微服务之间经常要相互通信和调用,而且一个服务往往存在多个实例来降低负荷或保证高可用。我们假定A服务要调用B服务,最简单的…

    Java 2023年6月7日
    093
  • 设计模式之单例模式

    1、什么是单例模式 ​ 单例模式是指保证 某个类在整个软件系统中只有一个对象实例,并且该类仅提供一个返回其对象实例的方法(通常为静态方法) 2、单例模式的种类 ​ 经典的单例模式实…

    Java 2023年6月8日
    088
  • NGINX转发端口后却跳转到80端口的解决方法

    问题原因: nginx没有正确的把端口信息传送到后端,没能正确的配置nginx,下面这行是关键 proxy_set_header Host $host:$server_port; …

    Java 2023年5月30日
    080
  • Vuex项目Example中的源码学习(1)

    @ counter 代码跑起来 项目结构 项目效果 揣测下大概思路 具体代码实现 学习到的知识点 counter 代码跑起来 从github上把代码下载下来(https://git…

    Java 2023年6月7日
    0123
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球