JDBC简介
一. 引言
1. 如何操作数据库
使用客户端工具访问数据库,需要手工建立连接,输入用户名和密码登录,编写 SQL 语句,点击执行,查看操作结果(结果集或受影响行数)。
2. 实际开发中,会采用客户端操作数据库吗?
在实际开发中,当用户的数据发生改变时,不可能通过客户端操作执行 SQL 语句,因为操作量过大,无法保证效率和正确性。
二. 概述
1. 由来
提供者:Sun公司
- 我们开发的同一套Java代码是无法操作不同的关系型数据库,因为每一个关系型数据库的底层实现细节都不一样。如果这样,问题就很大了,在公司中可以在开发阶段使用的是MySQL数据库,而上线时公司最终选用oracle数据库,我们就需要对代码进行大批量修改,这显然并不是我们想看到的。我们要做到的是同一套Java代码操作不同的关系型数据库,而此时sun公司就指定了一套标准接口(JDBC),JDBC中定义了所有操作关系型数据库的规则。众所周知接口是无法直接使用的,我们需要使用接口的实现类,而这套实现类(称之为:驱动)就由各自的数据库厂商给出。
2. 概括
JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成CRUD 操作。
3. 概念
- JDBC: 就是Java语言操作关系型数据库的一套API
全称:(Java DataBase Connectivity) Java 数据库 连接
4. 本质
- 官方(
sun公司
)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供
数据库驱动jar包
- 我们可以
使用这套接口(JDBC)编程
,真正执行的代码是驱动jar包中的实现类
5. 好处
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。
- mysql-connector-java-5.1.X 适用于 5.X 版本
mysql-connector-java-8.0.X 适用于 8.X版本 - 如下图就是MySQL驱动包(我所提供的是5.1)
百度云链接:https://pan.baidu.com/s/1mG9-n6yZ4vr7VDugGrDdCw
提取码:SGS1
注意:在IDEA下,
- 在项目下新建 lib 文件夹,用于存放 jar 文件。
- 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
- 选中 lib 文件夹右键 Add as Libraay,点击 OK。
6. JDBC API
- JDBC 是由多个接口和类进行功能实现。
类型 | 权限定名 | 简介 |
---|---|---|
Class | java.sql.DriverManager |
管理多个数据库驱动类,提供了获取数据库连接的方法 |
interface | java.sql.Connection |
代表一个数据库连接(当connection不是null时,表示已连接数据库) |
interface | java.sql.Statement |
发送SQL语句到数据库工具 |
interface | java.sql.ResultSet |
保存SQL查询语句的结果数据(结果集) |
class | java.sql.SQLException |
处理数据库应用程序时所发生的异常 |
三. JDBC(Java Database Connectivity)
1. 流程
- 第一步:编写java代码
- 第二步:Java代码SQL发送到Mysql服务端
- 第三步:Mysql服务端接收到SQL语句并执行SQL语句
- 第四步:将SQL语句执行的结果返回给Java代码
2. 编写代码步骤
- 创建工程,导入驱动jar架包
常用接口
- DriverManager(驱动管理)类:管理不同的驱动
- Connection(连接)接口:连接数据库
- Statement(声明)接口:执行sql语句
- ResultSet(结果集)接口:接收查询的结果集
- 注册驱动
使用 Class.forName("com.mysql.jdbc.Driver");手动加载字节码文件到 JVM 中
- 方案一
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
- 方案二:反射机制
会加载类,在加载类时,就会执行静态代码块
在静态代码块中有创建驱动对象已经注册驱动代码
加载驱动的操作只会被执行一次
Class.forName("com.mysql.jdbc.Driver");
- 获取连接数据库
URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成
Java代码需要发送SQL给MySQL服务端,就需要先建立连接
url:数据库的连接地址
mysql的url形式:jdbc:mysql://
主机地址:端口号/数据库名称?连接参数
username:用户名
password:密码
Connection conn=DriverManager.getConnection(url,username,password);
- 获取SQL对象
通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement发射对象
Statement stmt = conn.createStatement();
- 执行SQL对象
注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 '值'
statement.execute(sql);//何sql语句都能执行 返回值true代表有结果集,false代表没有
stmt.executeUpdate(sql);//执行非查询语句一般指DML和DDL
/**
* DML:返回值代表受影响的行数
* DDL:返回值为0
*/
stmt.executeQuery(sql);//执行select,show有结果集的
- 处理返回结果
查询结果集:迭代、依次获取。
ResultSet resultSet = statement.getResultSet();
/**
* rs.next() 如果返回值为true还有记录
* 调用完next方法之后,rs结果集对象本身就引用了一条记录
* 每调用一次next方法,rs就引用下一条记录
*/
while (resultSet.next()) {
//通过结果集对象,获取记录中的字段值
int id = resultSet.getInt("id");//resultSet.getInt("字段名");根据字段名获取
String name = resultSet.getString("name");
double price = resultSet.getDouble("money");
System.out.println("{id="+id+",name="+name+",price="+price+"}");
}
受影响行数:逻辑判断、方法返回。
if(result == 1){
System.out.println("Success");
}
可以让rs指向指定的记录,参数为记录的行
resultSet.afterLast();//直接移动到最后一行
resultSet.beforeFirst()//重新指向最开始位置
resultSet.first() //指向第一条
resultSet.last() //最后一条
resultSet.findColumn() //根据字段名获取所在列
resultSet.insertRow();增加一行 结果集和数据库
resultSet.deleteRow();删除一行
resultSet.updateRow();更新一行
- 释放资源
遵循先开后关原则,释放所使用到的资源对象
stmt.close();
conn.close();
3. 具体操作
创建新的空的项目
定义项目的名称,并指定位置
对项目进行设置,JDK版本、编译版本
创建模块,指定模块的名称及位置
导入驱动包
将mysql的驱动包放在模块下的lib目录(随意命名)下,并将该jar包添加为库文件
在添加为库文件的时候,有如下三个选项
- Global Library:全局有效
- Project Library:项目有效
- Module Library:模块有效
- 在src下创建类
- 编写代码如下
/**
* JDBC快速入门
*/
public class JDBCDemo {
public static void main(String[] args) throws
Exception {
//1. 注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url =
"jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";
String password = "1234";
Connection conn =
DriverManager.getConnection(url, username,
password);
//3. 定义sql
String sql = "update account set money =
2000 where id = 1";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6. 处理结果
System.out.println(count);
//7. 释放资源
stmt.close();
conn.close();
}
}
结果: