---
title: Spring 之 JDBC
date: 2019-02-18 14:33:55
order: 02
categories:
- Java
- 框架
- Spring
- Spring数据
tags:
- Java
- 框架
- Spring
- SpringBoot
- JDBC
- JdbcTemplate
permalink: /pages/75f33649/
---
# Spring 之 JDBC
JDBC 是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了增、删、改、查数据库的方法。
## JDBC 入门示例
JDBC 的工作步骤大致如下:
1. 创建实体类。
2. 声明数据库读写接口的 DAO 接口。定义 DAO 的好处在于对于数据层上层的业务,调用 DAO 时仅关注对外暴露的读写方法,而不考虑底层的具体持久化方式。这样,便于替换持久化方式。
3. 创建一个 DAO 接口的实现类,使用 Spring 的 JDBC 模板去实现接口。
4. 最后,定义一个 DAO 接口的实现类的 JavaBean,并将数据源注入进去。
假设,我们要通过 Spring + JDBC 访问一张 Mysql 数据表 `user`,`user` 表的数据结构如下:
```sql
-- 创建用户表
CREATE TABLE `user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '用户名',
`age` INT(3) NOT NULL DEFAULT 0 COMMENT '年龄',
`address` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '地址',
`email` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '邮件',
PRIMARY KEY (`id`),
UNIQUE (`name`)
) COMMENT = '用户表';
INSERT INTO `user` (`name`, `age`, `address`, `email`)
VALUES ('张三', 18, '北京', 'xxx@163.com');
INSERT INTO `user` (`name`, `age`, `address`, `email`)
VALUES ('李四', 19, '上海', 'xxx@163.com');
```
### 定义实体
```java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Objects;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String address;
private String email;
}
```
### 定义 DAO 接口
```java
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
/**
* user 表 Dao 接口
*
* @author Zhang Peng
* @since 2019-11-18
*/
public interface UserDao {
// DML
// -------------------------------------------------------------------
void insert(User user);
void batchInsert(List users);
void deleteByName(String name);
void deleteAll();
void update(User user);
Integer count();
List list();
User queryByName(String name);
JdbcTemplate getJdbcTemplate();
// DDL
// -------------------------------------------------------------------
void truncate();
void recreateTable();
}
```
### 定义 DAO 实现类
通过 `JdbcTemplate` 执行对应数据源符合语法的 SQL,即可完成各种数据库访问。
```java
package io.github.dunwu.springboot.core.data.jdbc;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* user 表 Dao 接口实现类
*
* @author Zhang Peng
* @since 2019-11-18
*/
@Repository
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
public UserDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void insert(User user) {
jdbcTemplate.update("INSERT INTO user(name, age, address, email) VALUES(?, ?, ?, ?)",
user.getName(), user.getAge(), user.getAddress(), user.getEmail());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsert(List users) {
String sql = "INSERT INTO user(name, age, address, email) VALUES(?, ?, ?, ?)";
List