【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。

相关推荐
曹轲恒3 小时前
Java中断
java·开发语言
xxxmine3 小时前
Java并发wait(timeout)
java
豆芽脚脚3 小时前
MongoDB 导出和导入完整指南
数据库·mongodb
烧饼Fighting3 小时前
Mysql替换为瀚高数据库部分函数转换V4.5版本
数据库·mysql
冰冰菜的扣jio3 小时前
Redis缓存问题——一致性问题、事务、持久化
java·spring·mybatis
施棠海3 小时前
监听与回调的三个demo
java·开发语言
上善若水_厚德载物3 小时前
Centos7 Mysql 5.7 读写分离
数据库·mysql
Mr__Miss4 小时前
Redis的持久化
数据库·redis·缓存
毕设源码-钟学长4 小时前
【开题答辩全过程】以 家政服务平台为例,包含答辩的问题和答案
java
CCPC不拿奖不改名4 小时前
SQL基础(SQL小白教程):MySQL语句+环境一键搭建+面试习题
数据库·sql·计算机网络·mysql·oracle·面试·职场和发展