4.2 使用JDBC操作数据库

JDBC的全名是Java DataBase Connectivity,可能是我们最先接触到的数据库连接,通过JDBC可以直接使用Java编程来操作数据库。其实我们可以这样理解JDBC,它就是一个可以执行SQL语句的Java API。

4.1节讲了很多数据库,本节以MySQL为例介绍Spring Boot使用JDBC操作MySQL数据库。

4.2.1 JDBC依赖配置

新建项目,在pom文件中加入JDBC依赖和MySQL依赖以及Web功能的依赖,如代码清单4-17所示。

4.2.2 配置数据库信息

在配置文件中配置数据库信息,与4.1节介绍的一样,配置文件内容如代码清单4-18所示。

4.2.3 创建实体类

创建一个实体类,用作接收表数据,这里省略set、get方法,代码如代码清单4-19所示。

4.2.4 使用Controller进行测试

新建一个UserController,由于这个类只是用来测试使用JDBC操作数据库,因此我们在类上加入@RestController注解,熟悉Spring的人都知道,这个注解其实相当于@ResponseBody和@Controller两个注解结合起来使用。并且在UserController内注入JdbcTemplate,代码如代码清单4-20所示。

其中,@Autowired注解是Spring用于自动装配类的注解,功能和@Resource类似。刚刚我们注入的JdbcTemplate就是Spring Boot使用JDBC操作数据库的核心,接下来进一步对它进行学习。

对于操作数据库来说,其实基本上就是创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。而对于JdbcTemplate操作数据库的CURD,基本上分为三种方法:

1. execute方法

execute方法用来直接执行SQL语句,是最直接的操作数据库的方法。接下来我们在UserController内写一个建表方法createTable来使用它,方法内容如代码清单4-21所示。

启动项目,在浏览器上访问http://localhost:8080/createTable,显示如下。然后查看数据库,顺利地创建了User表。这里是以创建表为例,其实也可以直接执行CURD操作,就不一一举例了。

    创建User表成功
2. update方法

update方法多用于增、删、改操作,update方法默认返回一个int值,了解SQL的人应该知道,方法的返回值就是影响的数据行数,比如我们数据库中存在两条性别为男的用户数据,当执行update语句修改性别为男的数据时,执行成功后,我们可以得到返回值2,这个就是我们执行update方法的返回值,新增、删除操作的原理类似。当然,也支持直接执行SQL语句,比如下面的方法saveUserSql,直接执行一个插入语句,代码如代码清单4-22所示。

重启项目,在浏览器访问可以看到:

    执行成功,影响1行

上面的场景可能并不常用,甚至基本上用不到,因为插入的数据不可能是已知的并且都是固定的。插入的数据是动态的怎么办呢?update方法中也是支持传值进去的,只需要在执行的SQL上用问号来代替参数,其中update方法内第一个参数是执行的SQL,接着对应传入动态的参数即可。下面3个方法分别列举了增、删、改的方法,代码如代码清单4-23所示。

这里就不一一测试了,感兴趣的读者可以自行测试。接下来我们继续学习update方法的延伸,其实JdbcTemplate中也提供了批处理方法batchUpdate,可以传入SQL和一个批处理的数组进行操作。比如下面的batchSaveUserSql方法,可以批量插入10条数据,代码如代码清单4-24所示。

3. query方法

query方法看名字就能想到,用于执行有关查询的方法。

首先我们使用一个JdbcTemplate的query方法,这里可以用到之前创建的实体类User,方法如下,根据userName查询一个列表,代码如代码清单4-25所示。

重启项目,在浏览器上访问http://localhost:8080/getUserByUserName?userName=zhangsan0,如下所示:

    [{"id":10,"user_name":"zhangsan0","user_password":"password0"}]

刚刚我们使用了一个返回List集合的方法,接下来使用一个返回Map的方法queryForMap,代码如代码清单4-26所示。

在浏览器访问http://localhost:8080/getMapById?id=1,如下所示:

    {"id":1,"user_name":"lisi","user_password":"111"}

接下来我们查询一个数据库中不存在的数据,在浏览器访问http://localhost:8080/getMapById?id=1000,页面显示如图4-14所示。

图4-14 JDBC项目Error图

我们回过头看一下控制台,报错如代码清单4-27所示。

接下来查看一下DataAccessUtils源代码,可以看到nullableSingleResult在查到空集合的时候默认抛出EmptyResultDataAccessException异常,看到就明白了。我们修改一下getMapById方法,在方法内捕获EmptyResultDataAccessException异常,方法代码修改如代码清单4-28所示。

前面介绍了返回List集合、Map集合,接下来学习一个返回User实体类的方法queryForObject。基于刚刚查不到结果抛出异常的原因,吃一堑长一智,在这个方法中直接捕获这个异常,方法如代码清单4-29所示。

测试就不再赘述了,和之前的方法一样。到这里,Spring Boot使用JDBC就告一段落了,毕竟在实际开发中对JDBC的使用不是很多,有一定基础就可以了。