今日目标
- 掌握JDBC的的CRUD
- 理解JDBC中各个对象的作用
- 掌握Druid的使用
在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。
JDBC 就是使用Java语言操作关系型数据库的一套API
全称:( Java DataBase Connectivity ) Java 数据库连接
我们开发的同一套Java代码是无法操作不同的关系型数据库,因为每一个关系型数据库的底层实现细节都不一样。如果这样,问题就很大了,在公司中可以在开发阶段使用的是MySQL数据库,而上线时公司最终选用oracle数据库,我们就需要对代码进行大批量修改,这显然并不是我们想看到的。我们要做到的是同一套Java代码操作不同的关系型数据库,而此时sun公司就指定了一套标准接口(JDBC),JDBC中定义了所有操作关系型数据库的规则。众所周知接口是无法直接使用的,我们需要使用接口的实现类,而这套实现类(称之为:驱动)就由各自的数据库厂商给出。
以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。如下图就是MySQL驱动包
先来看看通过Java操作数据库的流程
创建工程,导入驱动jar包
注册驱动
Class.forName("com.mysql.jdbc.Driver");
获取连接
Connection conn = DriverManager.getConnection(url, username, password);
Java代码需要发送SQL给MySQL服务端,就需要先建立连接
定义SQL语句
String sql = “update…” ;
获取执行SQL对象
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象(初始化对象)
Statement stmt = conn.createStatement();
执行SQL
stmt.executeUpdate(sql);
处理返回结果
释放资源
将mysql的驱动包放在模块下的lib目录(随意命名)下,并将该jar包添加为库文件
编写代码如下:
package com.cyc.java;
/*
*@title: JdbcDemo
*@description:JDBC 快速入门
*@author: 小辰
*@version: 1.0
*@create: 2023/7/9 7:29
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcDemo {
/**
* @description
* @author 小辰
* @param[1] args
* @throws
* @time 2023/7/9 7:31
*/
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 = "12345678";//改为自己的密码
Connection connection = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql = "update tb_brand set ordered = 2000 where id = 1";//执行sql注意改为自己的表
//4. 获取执行sql的对象 Statement
Statement statement = connection.createStatement();
//5. 执行sql
int count = statement.executeUpdate(sql);//受影响的行数
//6. 处理结果
System.out.println(count);
//7. 释放资源
statement.close();
connection.close();
}
}
注意:
上面代码如果你报下面这种错的话:
//报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate
//可能原因:连接协议被禁止或者密码不对
//如果是第一种情况的话:最简单的方法,直接在连接MySQL时,连接参数里禁用SSL: useSSL=false
只需要改一行代码,这样就解决了上面的报错
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
学到这里JDBC的基本使用你就已经掌握了
下面我们将对JDBC Api进行粗略的讲解
DriverManager(驱动管理类)作用:
注册驱动
registerDriver方法是用于注册驱动的,但是我们上面做的入门案例并不是这样写的。而是如下实现
Class.forName("com.mysql.jdbc.Driver");
我们查询MySQL提供的Driver类,看它是如何实现的,源码如下:
在该类中的静态代码块中已经执行了 DriverManager
对象的 registerDriver()
方法进行驱动的注册了,那么我们只需要加载 Driver
类,该静态代码块就会执行。而 Class.forName("com.mysql.jdbc.Driver");
就可以加载 Driver
类。
提示:
url : 连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
user :用户名
poassword :密码
Connection(数据库连接对象)作用:
普通执行SQL对象
Statement createStatement()
上面的案例中就是通过该方法获取的执行对象。
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
通过这种方式获取的 PreparedStatement
SQL语句执行对象是我们一会重点要进行讲解的,它可以防止SQL注入。
执行存储过程的对象
CallableStatement prepareCall(sql)
通过这种方式获取的 CallableStatement
执行对象是用来执行存储过程的,而存储过程在MySQL中不常用,所以这个我们将不进行讲解。
先回顾一下MySQL事务管理的操作:
MySQL默认是自动提交事务
接下来学习JDBC事务管理的方法。
Connection几口中定义了3个对应的方法:
事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
基于事务的原子性、一致性、隔离性和持续性特征,可以将相关的数据操作定义到一个事务当中。
如果操作过程中没有发生异常情况,就提交事务(commit)
如果发生了异常,就可以利用事务回滚(rollback),将数据库恢复到事务开启之前的状态.
package com.cyc.java;
/*
*@title: JdbcDemo
*@description:JDBC - Connection详解
*@author: 小辰
*@version: 1.0
*@create: 2023/7/9 7:29
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JdbcDemo {
/**
* @description
* @author 小辰
* @param[1] args
* @throws
* @time 2023/7/9 7:31
*/
public static void main(String[] args) throws Exception{
//1. 注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
//报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate
//可能原因:连接协议被禁止或者密码不对
//如果是第一种情况的话:最简单的方法,直接在连接MySQL时,连接参数里禁用SSL: useSSL=false
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "12345678";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql1 = "update tb_brand set ordered = 1 where id = 1";
String sql2 = "update tb_brand set ordered = 20 where id = 2";
//4. 获取执行sql的对象 Statement
Statement statement = connection.createStatement();
try {
// ============开启事务==========
connection.setAutoCommit(false);
//5. 执行sql
int count1 = statement.executeUpdate(sql1);//受影响的行数
//6. 处理结果
System.out.println(count1);
int i = 3/0;
//5. 执行sql
int count2 = statement.executeUpdate(sql2);//受影响的行数
//6. 处理结果
System.out.println(count2);
// ============提交事务==========
//程序运行到此处,说明没有出现任何问题,则需求提交事务
connection.commit();
} catch (Exception e) {
// ============回滚事务==========
//程序在出现异常时会执行到这个地方,此时就需要回滚事务
connection.rollback();
e.printStackTrace();
}
//7. 释放资源
statement.close();
connection.close();
}
}
执行代码:发现异常
执行后再看数据库数据:
在开启事务后,执行前后的值没有发生改变!!!!
关掉事务后,发现报错,但是数据库中id为1的ordered的值发生改变,id为2的值没有发生改变。
看下面内容前先了解DDL、DML、DQL
- DDL(Data Definition Language,数据定义语言)
主要用于维护存储数据的结构,这种结构包括数据库,表、视图、索引、同义词、聚簇等。
代表指令:
create 创建数据库和数据库的一些对象
drop 删除数据库/表、索引、条件约束以及数据表的权限等
alter 修改数据库表的定义及数据属性
2.DML(Data Manipulation Language,数据操纵语言)
主要用于对数据库对象中包含的数据进行操作
代表指令:
insert 向数据库中插入一条数据
delete 删除表中的一条或者多条记录
updata 修改表中的数据- DQL(Data Query Language,数据查询语言)
主要用于查询数据库当中的数据
代表指令:
selete 查询表中的数据
from 查询哪张表、视图
where 约束条件- DCL(Data Control Language,数据控制语言)
主要控制数据库对象的权限管理、事务和实时监视。
代表指令:
grant分配权限给用户
revoke废除数据库中某用户的权限
rollback 退回到某一点 (回滚)
commit 提交
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样
public static void main(String[] args) throws Exception{
//1. 注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
//报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate
//可能原因:连接协议被禁止或者密码不对
//如果是第一种情况的话:最简单的方法,直接在连接MySQL时,连接参数里禁用SSL: useSSL=false
String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String username = "root";
String password = "12345678";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql1 = "update tb_brand set ordered = 100 where id = 1";
String sql2 = "update tb_brand set ordered = 20 where id = 2";
//4. 获取执行sql的对象 Statement
Statement statement = connection.createStatement();
//5. 执行sql
int count = statement.executeUpdate(sql1);//执行完DML语句,受影响的行数
//6. 处理结果
//System.out.println(count);
if(count > 0){
System.out.println("修改成功~");
}else{
System.out.println("修改失败~");
}
//7. 释放资源
statement.close();
connection.close();
}
执行完之后显示修改成功
后面自己也可以尝试一下DDL,DQL等
感谢观看!!!