一、JDBC与持久化
持久化(Persistence
),是将数据保存到可永久保存的存储设备中。JDBC就是一种持久化机制,文件IO也是一种持久化机制
1.1、JDBC简介
DBC(Java Data Base Connectivity
,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种数据库提供统一访问,它由一组用Java语言编写的类和接口组成
1.2、JDBC的作用
JDBC可以做三件事:
- 与数据库建立连接;
- 将Java中拼写的SQL语句发送到数据库中执行;
- 处理执行结果。
二、JDBC API
2.1、JDBC API简介
Java程序访问数据库,使用JDBC提供的一套标准API,这套API主要是接口
java连接数据库,配置Oracle的方法:
E:\databases\Oracle\app\oracle\product\11.2.0\server\jdbc\lib,复制该目录下的ojdbc6.jar文件到Java项目中与src平级的lib文件夹中
java提供了以下接口和类来支持和数据库之间的操作:
类或接口 | 作用 |
---|---|
java.sql.DriverManager 类 |
表示数据库驱动包的管理对象 |
java.sql.Connection 接口 |
表示数据库的连接对象 |
java.sql.Statement 接口 |
表示执行sql语句的对象 |
java.sql.PreparedStatement 接口 |
java.sql.Statement 的子接口,表示sql预编译对象 |
java.sql.ResultSet 接口 |
表示从数据库查询返回的结果数据 |
JDBC在运行时的大致步骤如下图所示,执行的顺序如下:
- 由
DriverManager
类驱动数据库; - 由
Connection
接口负责将Java程序和数据库建立连接; - 由
Statement
接口将SQL语句发送到数据库中; - 由
ResultSet
接口处理数据库返回的结果集。
2.2、DriverManager类
DriverManager
管理一组 JDBC 驱动程序的基本服务。可以通过该管理类来建立并获取和指定数据库之间的连接。
返回值 | 方法名 | 作用 |
---|---|---|
Connection |
getConnection(String url, String user, String password) |
使用账号user 和密码password ,建立到指定数据库url 的连接,连接成功后返回新的数据库连接 |
Connection |
getConnection(String url) |
建立并获取到指定url 数据库的连接 |
-
数据库连接字符串
DriverManager
类在加载数据库驱动时,需要指明url
,这里的url通常称作数据库连接字符串。数据库连接字符串用于确定连接协议、连接的数据库服务器、端口号、数据库名称及其连接参数。
数据库连接字符串,其格式如下:
-
主协议:子协议://数据库服务器:端口号/数据库名称?连接参数
-
实例: jdbc:mysql://localhost:3306/company_info?user=root&password=root
2.3、Connection接口
Connection
接口的作用让Java程序与数据库之间建立连接。只有在数据库连接后,才能将SQL语句发送到数据库中执行。Connection
接口常用方法如下表:
返回值 | 方法名 | 作用 |
---|---|---|
Statement |
createStatement() |
创建一个 Statement 对象来将 SQL 语句发送到数据库 |
PreparedStatement |
prepareStatement(String sql) |
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 |
PreparedStatement |
prepareStatement(String sql, int autoGeneratedKeys) |
创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键 |
void |
setAutoCommit(Boolean autoCommit) |
将此连接的自动提交模式设置为给定状态。 |
void |
commit() |
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection 对象当前持有的所有数据库锁。 |
void |
rollback() |
取消在当前事务中进行的所有更改,并释放此Connection 对象当前持有的所有数据库锁 |
boolean |
isClosed() |
查询此Connection 对象是否已经被关闭。 |
void |
close() |
立即释放此Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。 |
2.4、Statement接口
返回值 | 方法名 | 作用 |
---|---|---|
boolean |
execute(String sql) |
执行给定的 SQL 语句,该语句可能返回多个结果。 |
boolean |
execute(String sql, int autoGeneratedKeys) |
执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都可用于获取。 |
int |
executeUpdate(String sql) |
执行给定 SQL 语句,该语句可能为 INSERT 、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。 |
int |
executeUpdate(String sql, int autoGeneratedKeys) |
执行给定的 SQL 语句,并用给定标志通知驱动程序由此 Statement 生成的自动生成键是否可用于获取。 |
ResultSet |
executeQuery(String sql) |
执行给定的 SQL 语句,该语句返回单个ResultSet 对象。 |
boolean |
isClosed() |
获取是否已关闭了此Statement 对象。 |
void |
close() |
立即释放此Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 |
2.5、PreparedStatement接口
返回值 | 方法名 | 作用 |
---|---|---|
boolean |
execute() |
在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句 |
void |
setObject(int parameterIndex, Object x) |
使用给定对象设置指定参数的值 |
int |
executeUpdate() |
该语句必须是一个 SQL 数据操作语言(Data Manipulation Language ,DML )语句,比如 INSERT 、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。 |
ResultSet |
executeQuery() |
在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象 |
2.6、ResultSet接口
返回值 | 方法名 | 作用 |
---|---|---|
boolean |
next() |
将光标从当前位置向前移一行 |
Object |
getObject(int columnIndex) |
以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值 |
Object |
getObject(String columnLabel) |
以 Java 编程语言中 Object 的形式获取此 ResultSet 对象的当前行中指定列的值 |
boolean |
isClosed() |
获取此 ResultSet 对象是否已关闭 |
void |
close() |
立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作 |
2.7、ResultSetMetaData接口
返回值 | 方法名 | 作用 |
---|---|---|
String |
getCatalogName(int column) |
获取指定列的表目录名称 |
String |
getColumnClassName(int column) |
如果调用方法 Resultset. getobiect 从列中获取值,则返回构造其实例的Java类的完全限定名称
|
int |
getColumnCount() |
返回此 Resultset 对象中的列数 |
int |
getColumnDisplaySize(int column) |
指示指定列的最大标准宽度,以字符为单位。 |
String |
getColumnLabel(int column) |
获取用于打印输出和显示的指定列的建议标题。 |
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 |
getTableName(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) |
指示在指定的列上进行写操作是否可以获得成功 |
Oracle
监听配置文件目录:oracle\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora
java连接oracle配置文件目录:oracle\app\oracle\product\11.2.0\server\jdbc\lib
- 先将配置文件导入项目文件夹中
jdbc:oracle:thin:@IP地址:1521(端口号):XE(oracle数据库版本)",“用户名”,“用户密码”
MySQL
jdbc:mysql://127.0.0.1:3306/kfm(数据库名)?serverTimezone=UTC
- JDBC操作数据库步骤:
- 加载数据库驱动
- 连接数据库
- 创建Statement对象
- 执行SQL语句
- 处理执行结果
- 释放数据库资源(关闭数据库)
三、使用Statement
- 对数据库中数据的增删改只需改变对应的sql语句即可
//加载数据库驱动
Class.forName("oracle.jdbc.OracleDriver");
//连接数据库("jdbc:oracle:thin:@IP地址:1521(端口号):XE(oracle数据库版本)","用户名","用户密码")
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "scott", "tiger");
//创建statement对象
Statement state=conn.createStatement();
//执行sql'语句
String sql="insert into emp values(8000,'张三','MANAGER',7521,to_date('2000-01-05','yyyy-mm- d'),1500,null,10)";
int rows=state.executeUpdate(sql);
//处理执行结果
System.out.println(rows+"行数据被改变");