点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | 翟永超

来源 | didispace.com/spring-boot-learning-21-3-1/

在第2章节中,我们介绍了如何通过Spring Boot来实现HTTP接口,以及围绕HTTP接口相关的单元测试、文档生成等实用技能。但是,这些内容还不足以帮助我们构建一个动态应用的服务端程序。不论我们是要做App、小程序、还是传统的Web站点,对于用户的信息、相关业务的内容,通常都需要对其进行存储,而不是像第2章节中那样,把用户信息存储在内存中(重启就丢了!)。

对于信息的存储,现在已经有非常非常多的产品可以选择,其中不乏许多非常优秀的开源免费产品,比如:MySQL,Redis等。接下来,在第3章节,我们将继续学习在使用Spring Boot开发服务端程序的时候,如何实现对各流行数据存储产品的增删改查操作。

作为数据访问章节的第一篇,我们将从最为常用的关系型数据库开始。通过一个简单例子,学习在Spring Boot中最基本的数据访问工具:JdbcTemplate。

数据源配置

在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。

首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

嵌入式数据库支持

嵌入式数据库通常用于开发和测试环境,不推荐用于生产环境。Spring Boot提供自动配置的嵌入式数据库有H2、HSQL、Derby,你不需要提供任何连接配置就能使用。

比如,我们可以在pom.xml中引入如下配置使用HSQL

<dependency><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId><scope>runtime</scope>
</dependency>

连接生产数据源

以MySQL数据库为例,先引入MySQL连接的依赖包,在pom.xml中加入:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>
</dependency>

src/main/resources/application.properties中配置数据源信息

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

连接JNDI数据源

当你将应用部署于应用服务器上的时候想让数据源由应用服务器管理,那么可以使用如下配置方式引入JNDI数据源。

spring.datasource.jndi-name=java:jboss/datasources/customers

使用JdbcTemplate操作数据库

Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired或构造函数(推荐)来注入到你自己的bean中来使用。

下面就来一起完成一个增删改查的例子:

准备数据库

先创建User表,包含属性nameage。可以通过执行下面的建表语句::

CREATE TABLE `User` (`name` varchar(100) COLLATE utf8mb4_general_ci NOT NULL,`age` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

编写领域对象

根据数据库中创建的User表,创建领域对象:

@Data
@NoArgsConstructor
public class User {private String name;private Integer age;}

这里使用了Lombok的@Data@NoArgsConstructor注解来自动生成各参数的Set、Get函数以及不带参数的构造函数。如果您对Lombok还不了解,可以看看这篇文章:Java开发神器Lombok的使用与原理。

编写数据访问对象

  • 定义包含有插入、删除、查询的抽象接口UserService

public interface UserService {/*** 新增一个用户** @param name* @param age*/int create(String name, Integer age);/*** 根据name查询用户** @param name* @return*/List<User> getByName(String name);/*** 根据name删除用户** @param name*/int deleteByName(String name);/*** 获取用户总量*/int getAllUsers();/*** 删除所有用户*/int deleteAllUsers();}
  • 通过JdbcTemplate实现UserService中定义的数据访问操作

@Service
public class UserServiceImpl implements UserService {private JdbcTemplate jdbcTemplate;UserServiceImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic int create(String name, Integer age) {return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age);}@Overridepublic List<User> getByName(String name) {List<User> users = jdbcTemplate.query("select NAME, AGE from USER where NAME = ?", (resultSet, i) -> {User user = new User();user.setName(resultSet.getString("NAME"));user.setAge(resultSet.getInt("AGE"));return user;}, name);return users;}@Overridepublic int deleteByName(String name) {return jdbcTemplate.update("delete from USER where NAME = ?", name);}@Overridepublic int getAllUsers() {return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);}@Overridepublic int deleteAllUsers() {return jdbcTemplate.update("delete from USER");}}

编写单元测试用例

  • 创建对UserService的单元测试用例,通过创建、删除和查询来验证数据库操作的正确性。

@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter31ApplicationTests {@Autowiredprivate UserService userSerivce;@Beforepublic void setUp() {// 准备,清空user表userSerivce.deleteAllUsers();}@Testpublic void test() throws Exception {// 插入5个用户userSerivce.create("Tom", 10);userSerivce.create("Mike", 11);userSerivce.create("Didispace", 30);userSerivce.create("Oscar", 21);userSerivce.create("Linda", 17);// 查询名为Oscar的用户,判断年龄是否匹配List<User> userList = userSerivce.getByName("Oscar");Assert.assertEquals(21, userList.get(0).getAge().intValue());// 查数据库,应该有5个用户Assert.assertEquals(5, userSerivce.getAllUsers());// 删除两个用户userSerivce.deleteByName("Tom");userSerivce.deleteByName("Mike");// 查数据库,应该有3个用户Assert.assertEquals(3, userSerivce.getAllUsers());}}

上面介绍的JdbcTemplate只是最基本的几个操作,更多其他数据访问操作的使用请参考:JdbcTemplate API

通过上面这个简单的例子,我们可以看到在Spring Boot下访问数据库的配置依然秉承了框架的初衷:简单。我们只需要在pom.xml中加入数据库依赖,再到application.properties中配置连接信息,不需要像Spring应用中创建JdbcTemplate的Bean,就可以直接在自己的对象中注入使用。

代码示例

本文的相关例子可以查看下面仓库中的chapter3-1目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

本文通过OpenWrite的Markdown转换工具发布

关注我,回复“加群”加入各种主题讨论群

本系列连载目录

快速入门

Web开发

武汉加油!中国加油! 

Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库相关推荐

  1. Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 在本系列之前的教程中,我们已经介绍了如何使用目前最常用的 ...

  2. Spring Boot 2.x基础教程:使用Flyway管理数据库版本

    之前已经介绍了很多在Spring Boot中使用MySQL的案例,包含了Spring Boot最原始的 JdbcTemplate(https://blog.didispace.com/spring-b ...

  3. Spring Boot 2.x基础教程:使用JTA实现分布式事务

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  4. Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  5. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前两天,我们已经介绍了关于JdbcTemplate的多数 ...

  6. Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  7. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  8. Spring Boot 2.x基础教程:使用国产数据库连接池Druid

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  9. Spring Boot 2.x基础教程:使用Elastic Job的分片配置

    上一篇,我们介绍了如何使用Elastic Job实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-2/).解决了使用@Schedul ...

最新文章

  1. 《GPU高性能编程CUDA实战》中代码整理
  2. 服务器端linux发行版的选择
  3. 【转】如何单独编译Android源代码中的模块--不错
  4. php如何对 mysql 中text类型拆分存入一个数组_PHP、Mysql笔试题
  5. 一百年后,人类怎样编程?
  6. RMAN-03002、RMAN-06059
  7. 反积分饱和 程序_非常通俗易懂的PID控制(2)--积分饱和
  8. python可以调试吗_调试-有什么好的方法可以使我的Python代码首次运行?
  9. linux安装tf-gpu注意事项
  10. 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局
  11. 嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)
  12. python中常见的运行时错误_python--17个新手常见Python运行时错误
  13. linux gpio-led
  14. Kubernetes之(十四)StatefulSet控制器
  15. java简易计算器程序框图_简易计算器程序设计思路及流程图
  16. 移动网优大神VoLTE学习笔记(四):主叫信令流程
  17. wegame系统推荐头像_热点微信国旗头像刷屏,怎么回事?(附国旗获取方式)
  18. 路由器管理页面html,路由器的管理登陆页面【入口地址】
  19. 海豚湾在哪_前任3中的海豚湾在哪里揭晓 热爱海洋之人的梦中圣地
  20. 推荐的四款产品原型设计工具

热门文章

  1. linux 错误 kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0
  2. linux centos7 重启服务器报错 Run 'systemctl daemon-reload' to reload units
  3. linux c 运行报错 killed
  4. linux ubuntu ping命令安装
  5. linux 内核编译 错误 fatal error: linux/compiler-gcc6.h: No such file or directory
  6. linux环境变量 LD_LIBRARY_PATH 使用
  7. linux kernel makefile analysis
  8. optparse模块
  9. mysql if value t f_mysql常用函数
  10. 检察机关计算机涉密案例,三原县检察院:扎实做好新时代检察机关保密工作