# Spring JDBC 简介
> 原文: [https://javatutorial.net/introduction-to-jdbc-in-spring](https://javatutorial.net/introduction-to-jdbc-in-spring)
在本教程中,您将学习什么是 JDBC 模块,并希望在阅读完之后可以找到用例。
![java-featured-image](https://img.kancloud.cn/05/3e/053ee0bb59842d92359246c98f815e0c_780x330.jpg)
现在,让我们创建一个代表员工的非常简单的表。
```java
CREATE TABLE Employee (
ID INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
DEPARTMENT VARCHAR(20) NOT NULL,
PRIMARY KEY(ID)
);
```
Spring JDBC Frameworks 处理底层细节,例如初始化连接,执行 SQL 查询,关闭连接等,因此为我们节省了很多时间和精力。在这种情况下,您可能想知道为我们保留的内容 去做。 好了,我们必须定义连接参数,并指定要执行的 SQL 查询,最后,我们必须在从数据库中获取数据的同时编写所有迭代的逻辑。
有许多方法和已经编写好的类可以帮助我们实现 JDBC。 在我们的例子中,我们将坚持经典的 JDBC 模板类。 它将管理所有数据库通信。
您需要了解有关 JDBC 模板类的哪些知识? 简而言之,它可以捕获 JDBC 异常,执行 SQL 查询和更新语句。 还需要注意的是,JDBC 模板类的所有实例都是线程安全的,这意味着我们可以配置 JDBC 模板类的实例,并将其作为共享引用安全地注入到多个 DAO 中。
如果您不熟悉什么是 DAO,则可以查看[我关于该主题的文章](https://javatutorial.net/what-is-dao-and-how-to-use-it)。
现在到有趣的部分。 让我们来看看如何实现所有理论。 我们将使用该教程开头显示的表格。
`EmployeeDAO.java`
```java
package com.tutorialnet;
import java.util.List;
import javax.sql.DataSource;
public interface EmployeeDAO {
public void setDataSource(DataSource ds);
public void create(String name, Integer age, String department);
public Employee getEmployee(Integer id);
public List<Employee> getEmployees();
public void delete(Integer id);
public void update(Integer id, Integer age, String department);
}
```
这是我们的 DAO 界面。 它包含所有方法声明,并且所有这些方法声明都与 CRUD 功能有关。
1. `setDataSource()`:建立数据库连接。
2. `create()`:将用于在数据库中创建新的`Employee`条目。
3. `getEmployee()`:将根据提供的 ID 返回一名员工。
4. `getEmployees()`:将返回数据库中所有雇员的列表。
5. `delete()`:将根据提供的 ID 删除员工。
6. `update()`:将更新现有员工。
`Employee.java`
```java
package com.javatutorial;
public class Employee {
private Integer id;
private String name;
private Integer age;
private String department;
public void setId(Integer id) {
this.id = id;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setDepartment(String department) {
this.department = department;
}
public Integer getId() {
return this.id;
}
public Integer getAge() {
return this.age;
}
public String getName() {
return this.name;
}
public String getDepartment() {
return this.department;
}
}
```
`EmployeeMapper.java`
```java
package com.javatutorial;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class EmployeeMapper implements RowMapper<Employee> {
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setAge(rs.getInt("age"));
employee.setDepartment(rs.getString("department"));
return employee;
}
}
```
`EmployeeJDBCTemplate.java`
```java
package com.javatutorial;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class EmployeeJDBCTemplate implements EmployeeDAO {
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
public void create(String name, Integer age, String department) {
String SQL = "insert into Employee (name, age, department) values (?, ?)";
jdbcTemplateObject.update( SQL, name, age, department);
}
public Employee getEmployee(Integer id) {
String SQL = "select * from Employee where id = ?";
Employee employee = jdbcTemplateObject.queryForObject(SQL,
new Object[]{id}, new EmployeeMapper());
return employee;
}
public List<Employee> getEmployees() {
String SQL = "select * from Employee";
List <Employee> employees = jdbcTemplateObject.query(SQL, new EmployeeMapper());
return employees;
}
public void delete(Integer id) {
String SQL = "delete from Employee where id = ?";
jdbcTemplateObject.update(SQL, id);
System.out.println("Deleted Record with ID = " + id );
}
public void update(Integer id, Integer age){
String SQL = "update Employee set age = ? where id = ?";
jdbcTemplateObject.update(SQL, age, id);
}
}
```
JDBC 类定义了我们在上面定义的接口中的所有方法声明。
`Main.java`
```java
package com.javatutorial;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tutorialspoint.EmployeeJDBCTemplate;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
EmployeeJDBCTemplate employeeJDBCTemplate = (EmployeeJDBCTemplate)context.getBean("employeeJDBCTemplate");
System.out.println("Creating records..." );
employeeJDBCTemplate.create("Jack", 11, "Software engineering");
employeeJDBCTemplate.create("Joanna", 2, "Finance");
employeeJDBCTemplate.create("Derek", 15, "Hardware engineering");
System.out.println("Listing employee entries from the database..");
List<Employee> employees = employeeJDBCTemplate.getEmployees();
for (Employee employee : employees) {
System.out.print("ID: " + employee.getId());
System.out.print("Name: " + employee.getName());
System.out.println("Age: " + employee.getAge());
System.out.println("Age: " + employee.getDepartment());
}
System.out.println("Updating a record with an id of 1");
employeeJDBCTemplate.update(1, 29, "Marketing");
System.out.println("Displaying information about record with an id of 1");
Employee employee = employeeJDBCTemplate.getEmployee(1);
System.out.print("ID: " + employee.getId());
System.out.print("Name : " + employee.getName() );
System.out.println("Age : " + employee.getAge());
ystem.out.println("Department : " + employee.getDepartment());
}
}
```
在这里,我们将调用在接口中定义的所有方法。
`Beans.xml`的配置文件:
```java
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">
<bean id="dataSource"
class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/DEMO"/>
<property name = "username" value = "root"/>
<property name = "password" value = "admin123"/>
</bean>
<bean id = "employeeJDBCTemplate"
class = "com.javatutorial.EmployeeJDBCTemplate">
<property name = "dataSource" ref = "dataSource" />
</bean>
</beans>
```
- JavaTutorialNetwork 中文系列教程
- Java 基础
- Java 概述
- 在 Ubuntu 上安装 Java 8 JDK
- Java Eclipse 教程
- Eclipse 快捷方式
- 简单的 Java 示例
- Java 基本类型
- Java 循环
- Java 数组
- Java 读取文件示例
- Java 对象和类教程
- 什么是面向对象编程(OOP)
- Java 封装示例
- Java 接口示例
- Java 继承示例
- Java 抽象示例
- Java 多态示例
- Java 中的方法重载与方法覆盖
- Java 控制流语句
- Java 核心
- 如何在 Windows,Linux 和 Mac 上安装 Maven
- 如何使用 Maven 配置文件
- 如何将自定义库包含到 Maven 本地存储库中
- 如何使用 JUnit 进行单元测试
- 如何使用 Maven 运行 JUnit 测试
- 如何在 Java 中使用 Maven 创建子模块
- 如何使用 Maven 创建 Java JAR 文件
- 如何使用 Maven 创建 Java WAR 文件
- JVM 解释
- Java 内存模型解释示例
- 捕获 Java 堆转储的前 3 种方法
- Java 垃圾收集
- Java 互斥量示例
- Java 信号量示例
- Java 并行流示例
- Java 线程同步
- Java 线程池示例
- Java ThreadLocal示例
- Java 中的活锁和死锁
- Java Future示例
- Java equals()方法示例
- Java Lambda 表达式教程
- Java Optional示例
- Java 11 HTTP 客户端示例
- Java 类加载器介绍
- Java 枚举示例
- Java hashCode()方法示例
- 如何测试独立的 Java 应用程序
- SWING JFrame基础知识,如何创建JFrame
- Java SWING JFrame布局示例
- 在JFrame上显示文本和图形
- 与JFrame交互 – 按钮,监听器和文本区域
- 如何使用 Maven 创建 Java JAR 文件
- Java Collection新手指南
- 选择合适的 Java 集合
- Java ArrayList示例
- Java LinkedList示例
- Java HashSet示例
- Java TreeSet示例
- Java LinkedHashSet示例
- Java EnumSet示例
- Java ConcurrentHashSet示例
- Java HashMap示例
- Java LinkedHashMap示例
- Java TreeMap示例
- Java EnumMap示例
- Java WeakHashMap示例
- Java IdentityHashMap示例
- Java SortedMap示例
- Java ConcurrentMap示例
- Java Hashtable示例
- Java 中ArrayList和LinkedList之间的区别
- Java HashMap迭代示例
- Java HashMap内联初始化
- Java 中HashMap和TreeMap之间的区别
- Java 图示例
- Java 深度优先搜索示例
- Java 广度优先搜索示例
- 不同的算法时间复杂度
- Java 序列化示例
- Java 反射示例
- Java 中的弱引用
- Java 8 日期时间 API
- Java 基本正则表达式
- 使用 Java 检索可用磁盘空间
- Java 生成 MD5 哈希和
- Java 增加内存
- Java 属性文件示例
- 如何在 Eclipse 上安装 Java 9 Beta
- Java 9 JShell 示例
- Java 9 不可变列表示例
- Java 9 不可变集示例
- Java 9 不可变映射示例
- Java 单例设计模式示例
- Java 代理设计模式示例
- Java 观察者设计模式示例
- Java 工厂设计模式
- Java 构建器设计模式
- Java 比较器示例
- Java 发送电子邮件示例
- Java volatile示例
- Java Docker 和 Docker 容器简介
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Java 中使用 MySQL 连接器
- 如何使用 Eclipse 调试 Java
- Java EE
- 如何在 Windows 10 中设置JAVA_HOME
- JavaBeans 及其组件简介
- 如何安装和配置 Tomcat 8
- 如何在 Tomcat 中部署和取消部署应用程序
- 从 Eclipse 运行 Tomcat
- Java Servlet 示例
- Java Servlet POST 示例
- Servlet 请求信息示例
- Servlet 注解示例
- 使用初始化参数配置 Java Web 应用程序
- Java Servlet 文件上传
- Java JSP 示例
- Glassfish 启用安全管理
- 如何使用 MySQL 配置 Glassfish 4
- Java 文件上传 REST 服务
- Glassfish 和 Jetty 的 Java WebSockets 教程
- 基于 Glassfish 表单的身份验证示例
- 如何使用 Java EE 和 Angular 构建单页应用程序
- Spring
- 在 Eclipse 中安装 Spring STS
- 使用 STS 创建简单的 Spring Web App
- Spring Web Framework 简介
- Java Docker 和 Docker 容器简介
- 在 Spring 中实现控制器
- Spring 中的PathVariable注解
- Spring 中的RequestBody注解
- Spring 中的RequestParam注解
- Spring 拦截器
- Spring IOC
- Java Spring IoC 容器示例
- Spring 中的DispatcherServlet
- Spring 示例中的依赖注入
- 实现 Spring MVC 控制器
- Spring ORM 简介
- 什么是 DAO 以及如何使用它
- 如何对 DAO 组件进行单元测试
- 如何对控制器和服务执行单元测试
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Spring 中处理登录身份验证
- Spring Security 简介及其设置
- 如何使用 Spring 创建 RESTful Web 服务
- Spring CSRF 保护
- Spring 中基于 OAuth2 的身份验证和授权
- Spring Boot 简介
- Spring MVC 框架介绍
- Spring JDBC 简介
- 如何 docker 化 Spring 应用程序
- Spring 的@Autowired注解
- Spring AOP 中的核心概念和建议类型
- Sping Bean 简介
- 如何在 Java 中使用 MySQL 连接器
- 安卓
- 安装和配置 Android Studio
- 将 Android 设备连接到 Android Studio
- Android 简介,活动,意图,服务,布局
- 创建一个简单的 Android 应用
- 运行和调试 Android 应用程序
- 在虚拟设备上运行 Android 应用程序
- Android 活动示例
- Android 意图示例
- Android 服务示例
- Android 线性布局示例
- Android 相对布局示例
- Android Web 视图示例
- Android 列表视图示例
- Android 网格视图示例
- 带有ListAdapter的 Android ListView示例
- Android SQLite 数据库介绍
- Android SQLite 数据库示例
- Android 动画教程
- Android 中的通知
- Android 中的事件处理
- 如何在 Android 中发送带有附件的电子邮件
- 杂项
- 选择您的 JAVA IDE:Eclipse,NetBeans 和 IntelliJ IDEA
- Java S3 示例
- 如何在 Ubuntu 上为多个站点配置 Apache
- 如何在 Liferay DXP 中替代现成的(OOTB)模块
- 简单的 Git 教程
- 使用 Java 捕获网络数据包
- Selenium Java 教程
- 使用特定工作区运行 Eclipse
- 在 Eclipse 中安装 SVN
- 如何运行 NodeJS 服务器
- SQL 内连接示例
- SQL 左连接示例
- SQL 右连接示例
- SQL 外连接示例
- 树莓派
- Raspberry Pi 3 规格
- 将 Raspbian 安装到 SD 卡
- Raspberry Pi 首次启动
- 远程连接到 Raspberry Pi
- 建立 Raspberry Pi 远程桌面连接
- Raspberry Pi Java 教程
- 使用 PWM 的 Raspberry Pi LED 亮度调节
- Raspberry Pi 控制电机速度
- Raspberry Pi 用 Java 控制直流电机的速度和方向