一、持久化
持久化(Persistence),是将数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中,或者是存储在磁盘文件中、XML文件中等等。
- JDBC就是一种持久化机制,文件IO也是一种持久化机制;
- 浅显的理解,在一定周期内保持不变的就是持久化,,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,自己要不去修改或删除;
二、JDBC简介
1、什么是JDBC
JDBC(Java Data Base Connectivity 数据库连接)是一种用于执行SQL语句的Java API ,可以为多种数据库提供统一访问,它是由一组用Java语言编写的类和接口组成。 JDBC提供了一组标准,据此可以构建更高级别的工具和接口,使数据库开发人员能够编写数据库应用程序。
- 有了JDBC向各种数据库发送SQL语句就是一件很容易的事;
- Java数据库连接体系结构是用于Java应用程序
2、JDBC的三大作用
- 与数据库建库建立连接;
- 将Java中拼写的SQL语句发送到数据库中执行;
- 处理执行结果。
3、JDBC简介
- JDBC在JavaEE开发中的作用:
1、在技术上,JDBC实现了数据的添加、删除、修改、查询等操作,是Java应用程序与数据通信的桥梁。
2、软件开发中界面负责数据输入,并将输入的数据提交给Java程序,Java程序通过JDBC将数据保存到数据库中。JDBC也负责从数据库中获取数据,然后将数据交给Java程序,最后Java程序将数据交给界面显示,如下图所示:
4、JDBC API
- Java程序访问数据库,使用JDBC提供的一套标准的API,这套API主要是接口,有各个数据库厂商提供,并封装成jar报的形式提供给开发人员,如下图所示:
- 在实际项目开发当中,我们要确定连接的数据库,在对应的数据库官方网站下载厂商已经实现的数据库连接用的驱动jar包,将驱动jar包导入到我们的项目中即可完成对特定数据库连接的支持。
- 项目支持了数据库的连接之后,就需要开发人员开发具体的程序来实现数据库数据的操作。Java提供了以下接口和类俩支持和数据库之间的操作:
类或接口 | 作用 |
java.sql.DriverManager 类 | 表示数据库驱动包的管理对象 |
java.sql.Connection 接口 | 表示数据库的连接对象 |
java.sql.Statement 接口 | 表示发送SQL给数据库执行对象 |
java.sql.PreparedStatement 接口 | java.sql.Statement的子接口,表示SQL预编译对象 |
java.sql.ResultSet接口 | 表示从数据库查询返回的结果数据 |
- JDBC在运行时大致步骤如下图,执行的顺序如下:
1、由DriverManager()类驱动数据库;
2、由Connection()接口负责将Java程序和数据库连接起来;
3、由Statement()接口将SQL语句发送到数据库中;
4、由ResultSet接口处理数据库返回的结果集。
1、DriverManager类:
- DriverManager管理一组JDBC驱动程序的基本服务,可以通过该类来建立并获取和指定数据库之间的链接。
返回值 | 方法名称 |
Connection | getConnection(String url, String str2) |
Connection | getConnection(String url) |
- 数据库连接字符串:
DriverManager类在加载数据库驱动时,需要指明url,这里url通常称作数据库连接字符串。数据库连接字符串用于确定连接协议、连接的数据库服务器、端口号、数据库名称及其连接参数。
数据库连接字符串格式如下:
主协议:子协议://数据库服务器:端口号/数据库名称:?连接参数
2、Connection接口
- Connection接口的作用让Java程序与数据库之间建立连接。只有在数据库连接后 ,才能将SQL语句发送到数据库中执行。Connection接口常用方法如下表:
返回值 | 方法名称 |
Statement | statement() 创建一个Statement对象将SQL语句发送到数据库 |
PreparedStatement | PreparedStatement(String sql) 创建一个PreparedStatement对象来讲参数化的SQL语句发送到数据库 |
PreparedStatement | prepareStatement(String SQL, int autoGeneratedKets) 创建一个默认的PreparedStatement对象,该对象能获取自动生成的键 |
void | setAutoCommit(Boolean autoCommit) 将此连接的自动提交模式设定为给定状态 |
void | commit() 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象当前持有的所有数据库锁 |
void | rollback() 取消在当前食事务中进行的所有更改,并释放此 Connection对象当前持有的所有数据库锁 |
boolean | isClosed() 查询此Connection对象是否已经关闭 |
void | close() 立即释放此Connection对象的数据库和JDBC资源,而不是等待他们自动释放 |
3、Statement接口
- Statement接口负责将SQL语句发送到数据库中,并告知数据库执行SQL语句,获取数据执行的结果。Statement接口常用的方法如下表:
返回值 | 方法名称 |
boolean | execute(String sql) 执行给定的SQL语句该句可能返回多个结果 |
boolean | execute(Sreing sql ,int autoGeneratedKeys) 执行给定的SQL语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取 |
int | executeUpdate(String sql) 执行给定的SQL语句,该语句可能为INSERT、UPDATE、DELETE语句,或者不返回任何内容的SQL语句 |
int | executeUpdate(String sql, int autoGeneratedKey) 执行给定的SQL语句,并用给定标记通知驱动程序由此Statement生成的自动生成键是否可用于获取 |
ResultSet | executeQuery(String sql) 执行给定的SQL语句,该语句返回单个ResultSet对象 |
boolean | isClosed() 获取是否已关闭了此Statement对象 |
void | close() 立即释放此Statement的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作 |
4、PreparedStatement接口
- PreparedStatement接口是Statement接口的子接口,表示预编译的SQL语句的对象,SQL对象被预编译并存储在Preparement对象中,然后可以使此对象多次高效的执行该语句。
返回值 | 方法名称 |
boolean | execute() 在此PreparedSetment对象中执行SQL语句,该语句可以是任何种类的SQL语句 |
void | setObject(int parameterindex, Object x) 使用给定对象指定参数的值 |
int | executeUpdate(int parameterIndex, Object x) 在此PreparedStatement对象中执行SQL语句,给语句必须是一个DML语句 |
ResultSet | executeQuery() 在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象 |
5、ResultSet接口
- ResultSet接口表示查询的结果集,通常通过执行查询数据库的语句生成。ResultSet对象具有指向其当前数据行的光标。最初,光标被置于前一行之前,next烦方法将光标移至下一行,因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。
返回值 | 方法名称 |
boolean | next() 将光标从当前位置向前移一行 |
Object | getObject(int columnIndex) 以Java编程语言中Object的形式获取此ResultSet对象的当前行中指定的列的值 |
Object | getObject(String cloumnLabel) 以Java编程语言中Object的形式获取此ResultSet对象的当前行中指定的列的值 |
boolean | isClosed() 获取此ResultSet对象是否已关闭 |
void | close() 立即释放此ResultSet对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作 |
6、ResultSetMeteData接口
- ResultSetMeteData接口可用于获取关于ResultSet对象中列的类型和属性信息的对象,列的类型和属性信息称为表的元数据。
返回值 | 方法名称 |
String | getCatelogName(int column) 获取指定列的表目录名称。 |
String | getColumnClassName(int column) 如果调用方法ResultSet.getObject从列表中获取值,则返回构造其实例的Java类的完全限定名。 |
int | getColumnCount() 返回ResultSet对象中的列数。 |
int | getColumnDisplaySize(int column) 指示指定列的最大标准宽度,以字符为单位。 |
String | getColumnLabel(int column) 6. 处理执行结果; |
String | getColumnName(int column) 获取指定列的名称。 |
int | getColumnType(int column) 获取指定列的SQL类型。 |
String | getColumnTypeName(int column) 获取指定列的数据库特定的类型名称。 |
int | getPrecision(int column) 获取指定列的指定列宽。 |
int | getScale(int column) 获取指定列的小数点右边的位数。 |
String | getSchemaName(int column) 获取指定列的表模式。 |
String | getNameTable(int column) 获取指定列的名称。 |
boolean | isAutoIncrement(int column) 指示是否自动为指定列进行编号。 |
boolean | isCaseSensitive(int column) 指示列的大小写是否有关系。 |
boolean | isCurrency(int column) 只是指定的列是否是一个哈希代码值。 |
boolean | isDefinitelyWritable(int column) 指示在指定的列上进行写操作是否明确可以获得成功。 |
int | isNullable(int column) 指示指定列中列中的值是否可以为null |
boolean | isReadOnly(int column) 只是指定的列是否明确不可写入。 |
boolean | isSearchable(int column) 指示是否可以在where子句中使用指定的列。 |
boolean | isSigned(int column) 指示指定列中的值是否带正负号。 |
boolean | isWritable(int column) 指示在指定列上进行写操作的是否可以获得成功。 |
三、使用JDBC实现部门管理业务
JDBC操作数据库分为7步
- 导入数据库驱动jar包;
- 注册数据库驱动程序;
- 建立和数据库之间的连接;
- 拼写SQL语句;
- 向数据库发送并执行SQL语句;
- 处理执行结果;
- 关闭资源。
1、创建数据库以及实体表
- 创建数据库命名为:jdbcdemo,在jdbcdemo数据库中创建user表,user表的结构如下表。利用jdbcdemo数据库完成jdbc操作数据库的任务。
列名称 | 类型 | 约束 |
id | int | 主键、自增长 |
username | varchar(20) | 用户名 |
userpass | varchar(20) | 密码 |
createDate | Datetime | 创建时间 |
- 创建测试jdbc数据库
CREATE DATABASE IF NOT EXISTS jdbcdemo;
USE jdbcdemo;
CREATE TABLE users(
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20),
userpass VARCHAR(20),
createDate Datetime
);
2、实现添加用户业务
业务分析:
- 创建java project ,命名为UserManager;
- 在UserManager项目中创建一个目录,命名为libs;
- 将MySQL驱动jar包导入到libs目录中;
- 将libs目录中的MySQL驱动jar包添加到构建路径中;
- 在scr中创建包,命名为:com.husung.jdbc.test01;
- 在com.husung.jdbc.test01包中创建AddUser类;
- 在AddUser类中创建main方法;
- 在main方法中编写添加用户代码。
将libs目录下的jar包添加到构建路径中的方法File —> Project Structure —>Project Settings —> Modules 进行如下设置:
添加用户
/**
* 使用jdbc添加用户的实例
*
* @Author 郑虎虎
* date 2020/11/29 20:44
*/
package com.husung.jdbc.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class AddUserDemo {
public static void main(String[] args) {
addUser("宋江", "123456");
addUser("晁盖","123456");
addUser("吴用","123456");
addUser("武松","123456");
}
/**
* 添加用户的方法
*
* @param username 用户名称
* @param userpass 用户密码
*/
public static void addUser(String username, String userpass) {
Connection conn = null;
Statement stat = null;
try {
// 1、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2、建立和数据库之间的连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");
// 3、拼写SQL语句
String sql = "INSERT INTO users(username, userpass) values('" + username + "', '" + userpass + "')";
// 4、向数据库发送并执行SQL语句
stat = conn.createStatement();
int rows = stat.executeUpdate(sql);
// 5、处理执行结果
System.out.println("数据库中有" + rows + "条语句执行成功...");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 6、关闭资源
if (stat != null) {
try {
stat.close();
stat = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
conn = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
- 查看数据库中是否插入:
SELECT
id,
username,
userpass
FROM
users;
3、实现修改密码业务
目标: 将id为1的用户的密码更改为789。
/**
* 通过jdbc修改用户密码的实例
*
* @Author 郑虎虎
* date 2020/11/29 21:53
*/
package com.husung.jdbc.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class UpdateUserDemo {
public static void main(String[] args) {
updateUser(1,"789");
}
/**
* 修改用户
* @param id
* @param userpass
*/
public static void updateUser(int id, String userpass){
Connection conn = null;
Statement stat = null;
try {
// 1、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2、建立和数据库之间的连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");
// 3、拼写sql语句
String sql = "UPDATE users SET userpass='789' WHERE id=1;";
// 4、向数据库发送并执行SQL对象
stat = conn.createStatement();
int rows = stat.executeUpdate(sql);
// 5、处理执行结果
System.out.println("数据库中有" + rows + "条语句执行了。");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally{
// 6、关闭资源
if (stat != null) {
try {
stat.close();
stat = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
conn = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
- 在数据库中查看
SELECT
id,
username,
userpass
FROM
users
WHERE
id = 1;
4、实现删除用户业务
/**
* 使用jdbc删除用户的实例
*
* @Author 郑虎虎
* date 2020/11/30 11:41
*/
package com.husung.jdbc.test01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteUser {
public static void main(String[] args) {
delete(1);
}
/**
* 根据id删除用户
* @param id
*/
public static void delete(int id){
Connection conn = null;
Statement stat = null;
try {
// 1、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 2、建立和数据之间的连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "数据库名称", "数据库密码");
// 3、拼写SQL语句
String sql = "DELETE FROM users WHERE id='1';";
// 4、向数据库发送并执行SQL
stat = conn.createStatement();
int rows = stat.executeUpdate(sql);
// 5、处理执行结果
System.out.println("数据库中有" + rows + "条语句执行了!");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
// 6、关闭资源
if (stat != null) {
try {
stat.close();
stat = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
conn = null;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
- 在数据库中查看:
SELECT
id,
username,
userpass
FROM
users;