【Spring Boot】Java 的数据库连接模板:JDBCTemplate

Java 的数据库连接模板:JDBCTemplate

  • [1.JDBCTemplate 初识](#1.JDBCTemplate 初识)
    • [1.1 JDBC](#1.1 JDBC)
    • [1.2 JDBCTemplate](#1.2 JDBCTemplate)
  • [2.JDBCTemplate 实现数据的增加、删除、修改和查询](#2.JDBCTemplate 实现数据的增加、删除、修改和查询)
    • [2.1 配置基础依赖](#2.1 配置基础依赖)
    • [2.2 新建实体类](#2.2 新建实体类)
    • [2.3 操作数据](#2.3 操作数据)
      • [2.3.1 创建数据表](#2.3.1 创建数据表)
      • [2.3.2 添加数据](#2.3.2 添加数据)
      • [2.3.3 查询数据](#2.3.3 查询数据)
      • [2.3.4 查询所有记录](#2.3.4 查询所有记录)
      • [2.3.5 修改数据](#2.3.5 修改数据)
      • [2.3.6 删除数据](#2.3.6 删除数据)
  • [3.认识 ORM](#3.认识 ORM)

1.JDBCTemplate 初识

1.1 JDBC

在学习使用 JDBCTemplate 之前,我们先来了解一下 JDBC(Java DataBase Connectivity)。它是 Java 用于连接数据库的规范,也就是用于执行数据库 SQL 语句的 Java API。从 JDBC 的名称上看,它似乎没有指定某种数据库。可以猜想它可以为多种数据库提供统一访问的接口,这更合程序设计的模式。实际上,它由一组用 Java 语言编写的类和接口组成,为大部分 关系型数据库 提供访问接口。

JDBC 需要每次进行数据库连接,然后处理 SQL 语句、传值、关闭数据库。如果都由开发员编写代码,则很容易出错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCtemplate 就被设计出来了。

1.2 JDBCTemplate

JDBCTemplate = JDBC + Template 的组合,是对 JDBC 的封装。它更便于程序实现,替我们完成所有的 JDBC 底层工作。因此,对于数据库的操作,不再需要每次都进行连接、打开、关闭了。现在通过 JDBCTemplate 不需要进行全局修改,就可以轻松地应对开发人员常常要面对的增加删除、修改和查询操作。

🚀 JDBC 和 JDBCTemplate 就像是仓库管理员,负责从仓库(数据库)中存取物品。而后者不需要 "每次进入都开门,取完关门",因为有电动门自动控制。

2.JDBCTemplate 实现数据的增加、删除、修改和查询

2.1 配置基础依赖

要使用 JDBCTemplate,则需要添加其 Starter 依赖。因为要操作数据库,所以也需要配置数据库(以 MySQL为例)的连接依赖,见以下代码:

xml 复制代码
<!-- JDBCTemplate 依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 数据库依赖 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

添加完依赖后,还需要配置数据库的连接信息。这样 JDBCTemplate 才能正常连接到数据库在 application.properties 配置文件中配置数据库的地址和用户信息,见以下代码:

xml 复制代码
spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2.2 新建实体类

新建一个测试实体类 User,实现 RowMapper 类,重写 mapRow 方法,以便实体字段和数据表字段映射(对应)。映射是指把 Java 中设置的实体字段和 MySQL 数据库的字段对应起来,因为实体的 id 可以对应数据库字段的 u_id,也可以对应 idname 等。如果不重写,则程序不知道何对应。具体代码如下:

java 复制代码
package com.example.demo.model;

import lombok.Data;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

@Data
public class User implements RowMapper<User> {
    private int id;
    private String username;
    private String password;

    // 必须重写mapRow方法
    @Override
    public User mapRow(ResultSet resultSet, int i) throws SQLException {
        User user = new User();
        user.setId(resultSet.getInt("id"));
        user.setUsername(resultSet.getString("username"));
        user.setPassword(resultSet.getString("password"));
        return user;
    }
}

2.3 操作数据

JDBCTemplate 提供了以下操作数据的 3 个方法。

  • execute:表示 执行,用于直接执行 SQL 语句。
  • update:表示 更新,包括新增、修改、删除操作。
  • query:表示 查询

2.3.1 创建数据表

在使用 JDBCTemplate 之前,需要在控制器中注入 JDBCTemplate,然后就可以通过 execute 方法执行 SQL操作了,见以下代码:

java 复制代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserControllerTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    /**
    * @Description: 创建表
    */
    public void createUserTable() throws Exception {
        String sql = "CREATE TABLE `user` (\n" +
                "  `id` int(10) NOT NULL AUTO_INCREMENT,\n" +
                "  `username` varchar(100) DEFAULT NULL,\n" +
                "  `password` varchar(100) DEFAULT NULL,\n" +
                "  PRIMARY KEY (`id`)\n" +
                ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;\n" +
                "\n";

        jdbcTemplate.execute(sql);
    }
}

2.3.2 添加数据

添加数据可以通过 update 方法来执行,见以下代码:

java 复制代码
@Test
public void saveUserTest() throws Exception {
    String sql = "INSERT INTO user (USERNAME,PASSWORD) VALUES ('pipi','666666')";
    int rows = jdbcTemplate.update(sql);
    System.out.println(rows);
}

2.3.3 查询数据

以下代码是根据 name 查询单个记录,执行下面 sql 字符串里的 SQL 语句(SELECT * FROM user WHERE USERNAME = ?)。这里需要通过 query 方法来执行。

java 复制代码
@Test
public void getUserByName() throws Exception {
    String name = "pipi";
    String sql = "SELECT * FROM user WHERE USERNAME = ?";
    List<User> list = jdbcTemplate.query(sql, new User(), new Object[]{name});
    for (User user : list) {
        System.out.println(user);
    }
}

运行测试,会在控制台输出如下结果:

2.3.4 查询所有记录

查询所有记录和查询单个记录一样,也是执行 query 方法。区别是,SQL 语句使用查询通配符 *,见以下代码:

java 复制代码
@Test
public void list() throws Exception {
    String sql = "SELECT * FROM user";
    List<User> userList = jdbcTemplate.query(sql,
            new BeanPropertyRowMapper(User.class));
    for (User userLists : userList) {
        System.out.println(userLists);
    }
}

2.3.5 修改数据

要进行数据的修改,可以使用 update 方法来实现,见以下代码:

java 复制代码
@Test
public void updateUserPassword() throws Exception {
    Integer id = 1;
    String passWord = "999888";
    String sql = "UPDATE user SET PASSWORD = ? WHERE ID = ?";
    int rows = jdbcTemplate.update(sql, passWord, id);
    System.out.println(rows);
}

2.3.6 删除数据

这里删除数据并不用 DELETE 方法,而是通过 update 方法来执行 SQL 语句中的 DELETE 方法。

java 复制代码
@Test
public void deleteUserById() throws Exception {
    String sql = "DELETE FROM  user  WHERE ID = ?";
    int rows = jdbcTemplate.update(sql, 1);
    System.out.println(rows);
}

至此,已经实现了简单的 增加删除修改查询 功能。如果读者对关系型数据库的 SQL 不陌生,那么实现起来会非常简单。因为 JDBCTemplate 实现起来比 ORM 烦琐,所以大都分发人员使用的是 ORM(JPA 和 MyBatis)。但是 JDBCTemplate 依然有市场,因为学习成本低,会一些 SQL语句就能上手使用,操作虽然麻烦,但很容易学会。

3.认识 ORM

ORM(Object Relation Mapping)是 对象/关系映射。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立映射关系。它是随着面向对象的软件开发方法的发展而产生的,面向对象的开发方法依然是当前主流的开发方法。

对象关系型数据业务实体 的两种表现形式。业务实体在内存中表现为对象,在数据库中表现为关系型数据。内存中的对象不会被永久保存,只有关系型数据库(或 NoSQL 数据库,或文件)中的对象会被永久保存。

对象/关系映射(ORM)系统一般以中间件的形式存在,因为内存中的对象之间存在关联和继承关系,而在数据库中,关系型数据无法直接表达多对多的关联和继承关系。对象、数据库通过 ORM 映射的关系如下图所示。

目前比较常用的 ORM 是国外非常流行的 JPA 和国内非常流行的 MyBatis。

相关推荐
方圆想当图灵15 分钟前
缓存之美:万文详解 Caffeine 实现原理(下)
java·redis·缓存
doubt。27 分钟前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全
栗豆包29 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
Maybe_ch1 小时前
群晖部署-Calibreweb
数据库·群晖·nas
小辛学西嘎嘎1 小时前
MVCC在MySQL中实现无锁的原理
数据库·mysql
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
CC呢1 小时前
基于STM32单片机火灾安全监测一氧化碳火灾
数据库·mongodb
MasterNeverDown2 小时前
解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误
数据库·postgresql·oracle
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享