热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

爆破专栏|SpringBoot2.x系列教程之使用SQL数据库

点击上方蓝字关注我们前言在前面的章节中,壹哥 给大家讲解了SpringBoot对Web模块的支持,但是我们开发时还有另一个重头戏,那就是进行数据库的操作。所以从

点击上方蓝字关注我们

前言

在前面的章节中,壹哥 给大家讲解了SpringBoot对Web模块的支持,但是我们开发时还有另一个重头戏,那就是进行数据库的操作。所以从本章开始,我会带大家学习在Spring Boot中实现数据库的操作。

我这里说的数据库,不仅仅有关系型数据库,比如MySQL,还包括非关系型数据库,比如Redis等。

我们现在进行关系型数据库操作时,可以选择的技术框架其实有很多,比如原生的Jdbc,还有Mybatis、JPA等开源框架,接下来我会分别针对这几个技术进行讲解,今天我先讲解在SpringBoot中利用JdbcTemplate实现数据库的CRUD操作。

一. 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的核心方法

在JdbcTemplate中有哪些核心方法供我们调用呢? 我们常用的重要方法有如下几类:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  • update方法:update方法用于执行INSERT、UPDATE、DELETE等DML语句;

  • batchUpdate方法用于执行批处理相关语句;

  • query方法及queryForXXX方法:用于执行DQL查询相关语句;

  • call方法:用于执行存储过程、函数相关语句。

5. JdbcTemplate使用步骤

那么JdbcTemplate到底该怎么使用呢?

  • 导入数据库相关依赖包,比如jpa或者jdbc;

  • 获取所需的某个DataSource数据源连接池对象;

  • 创建JdbcTemplate对象,传入到连接池中;

  • 调用execute、update、queryXxx等方法。

二. Spring Boot整合JdbcTemplate

接下来我就带各位利用JdbcTemplate实现CRUD操作,看看都需要做哪些事情吧。
1. 准备工作

我们要注意自己的开发环境,尽量要满足如下要求:

  • SpringBoot 2.x

  • JDK 1.8

  • Maven 3.0

  • Intellij Idea

  • MySQL

2. 创建一个web项目(略)首先我创建一个SpringBoot的Web项目,具体创建过程请参考我们之前的章节最终的项目结构如下图所示:

3. pom.xml文件中添加依赖

在项目的pom.xml文件中添加jdbc、mysql、druid数据源的依赖包。


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


   mysql
   mysql-connector-java


   com.alibaba
   druid
   1.1.10

4. 配置application.yml文件

然后我们创建一个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. 创建一个数据库配置类

因为本案例中使用的Druid作为数据源,所以我在这里封装一个配置类,把application.yml文件中的信息读取进来。

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;
    }
}

除了可以使用上面的方法读取application.yml文件中的配置信息之外,我们也可以采用第2种配置方式进行填充配置,代码如下:

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实体类

这里我们封装一个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层代码

接下来我会在dao层包中,创建一个IUserDao接口,内部封装数据库的增删改查方法。

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 findUserList();
}

7.2 dao层的UserDaoImpl接口实现

编写一个UserDaoImpl实现类,实现上面的IUserDao接口,在这个类中利用原生的SQL语句实现数据库的CRUD操作。

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 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 findUserList() {
        // 使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper
        List list = jdbcTemplate.query("select * from users", new Object[]{}, new BeanPropertyRowMapper(Users.class));
        return list.size()>0?list:null;
    }
}

8. 创建Service层代码

根据3层架构,我们会有dao层、service层、web层,所以这里我再创建service层的核心业务代码,调用dao层接口。

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 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 findUserList() {
        return userDao.findUserList();
    }
}

9. 创建Web层的Controller

然后我们再编写一个Controller,在这里定义几个RESTful风格的URL接口。

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 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中测试刚才创建的接口。


其他接口我就不再一一测试了,都是可以正常使用的!


结语

至此,我就用JdbcTemplate实现了MySQL数据库的增删改查,整体会有点麻烦,代码实现比Mybatis麻烦一些,更没有JPA简单。对于JdbcTemplate这种技术,各位简单了解即可,现在开发时很少用了。


今日小作业:
思考在SpringBoot中如何整合Mybatis?
完成任务在留言区回复:666
第一个回复666并被精选的同学可以领取一本台历哦

点击【阅读全文】,锋迷商城项目免费学



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • android ... [详细]
author-avatar
沈婧颖_491
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有