「这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战」
1、注册驱动:
Class.forName("com.mysql.jdbc.Driver");
注册驱动的书写方法,表面上没有使用 DriverManager类,选中Driver,ctrl+b看源码可知
package com.mysql.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
它使用了 DriverManager.registerDriver()的方法
在MySQL5之后的驱动包,可以省略注册驱动的步骤
自动加载jar包中的META-INF/services/java.sql.Driver文件的驱动类
2、获取连接
static Connection getConnection(String url,String user,String password)
参数
1、url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2....
举例:jdbc:mysql://127.0.0.1:3306/db1(本机127.0.0.1,本机域名:localhost)
细节: 如果连接的是本机mysql服务器,并且mysql默认端口号是3306 ,则url可以简写为:jdbc:mysql://数据库名称?参数键值对如:jdbc:mysql:///db1
配置userSSL=false参数,禁用安全连接方式,解决警告提示
2、user:用户名
3、password:密码
解决警告提示:
?userSSL=false
String url="jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
二、Connection
Connection(数据库连接对象)作用:
1、获取执行SQL的对象
2、管理事务
1、获取执sql对象
- 普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PrepareStatement prepareStatement(sql)
- 执行存储过程对象
CallableStatement prepareCall(sql)
2、事务管理
mysql事务管理
开启事务:BEGIN;/START TRANSACTION(start transaction)
提交事务:COMMIT;
回滚事务:ROLLBACK;
(MySQL默认自动提交事务)
JDBC事务管理:
Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务,false为手动提交事务(开启事务)
提交事务:commit()
回滚事务:rollback()
演示jdbc的事务
复制前面弄过的类到包下
package com.jdbc;
import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCConnectionDemo {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接
//url的格式是:"jdbc:mysql://mysql的ip:端口号/操作的数据库"
String url="jdbc:mysql://127.0.0.1:3306/kc_db01";
//username是你的mysql用户名
String username="root";
//password是你的mysql密码
String password="123456";
Connection conn= (Connection) DriverManager.getConnection(url, username, password);
//3、定义sql
String sql1="update emp set salary=6666 where ename='zhangsan'";
String sql2="update emp set salary=6666 where ename='lisi'";
//4、获取执行sql的Statement对象
Statement stat=conn.createStatement();
//选中要处理的异常部分,ctrl+alt+t快捷键生成
try {
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1=stat.executeUpdate(sql1);
//处理结果
System.out.println("影响的行数:"+count1);
//执行时sql
int count2=stat.executeUpdate(sql2);
//处理结果
System.out.println("影响的行数:"+count2);
//提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//回滚事务(回到开启事务之前,即什么也没处理前)
conn.rollback();
}finally {
//7、释放资源(先开后释放)
stat.close();
conn.close();
}
}
}
运行之前数据库emp表:
运行结果:
运行之后数据库emp表:
try之中的发生了异常 ,就会 被catch捕获,发生回滚,回滚到还没有开启事务之前,就是数据没有修改之前,若是没有用事务,就会导致可能一个成功一个失败,这是我们不愿意看到的。 启用了事务,用了回滚事务,可以保证多个事务要么同时成功,要么同时失败。
三、Statement
Statemen作用:
1、执行sql语句
int executeUpdate(sql): 执行DML(对数据的增删改)、**DDL(对表和库的增删改)**语句
返回值:(1)DML语句影响的行数(2)DDL语句执行后,执行成功也可能返回0
ResultSet executeQuery(sql):执行**DQL(对数据的查询操作)**语句
返回值:ResultSet结果对象