什么是JDBC
JDBC(Java Data Base Connectivity),即Java数据库链接,就是使用Java语言来操作关系型数据库的一套API,JDBC相当于定义了一套标准接口,来操作不同的关系型数据库,间接性可以操作不同的数据库。
实现类→驱动
JDBC本质:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
步骤:
0.创建工程,导入驱动jar包
1.注册驱动
2.获取连接
3.定义SQL语句
4.获取执行SQL语句
5.执行SQL
6.返回处理结果
7.释放资源
Class.forName();//注册驱动
Connection conn = DriverManager.getConnection(url,username,password);//获取连接
String sql = "update";//定义SQL语句
Statement stmt = coon.createStatement();//获取执行SQL对象
stmt.executeUpdate(sql);//执行SQL
简单示例:
package com.cyr.jdbc;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
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/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义SQL语句
String sql = "update demo1 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();
}
}
运行结果报错;
遇到了JDBC连接数据库出现Loading class `com.mysql.jdbc.Driver’. This is deprecated.问题,参考
https://blog.csdn.net/qinleilei7760631/article/details/123560139
解决方式:重新下载低版本的jar;问题解决。
JDBC API
Driver Manager
DriverManager(驱动管理类)作用:
- 1.注册驱动
- 2.获取数据库连接
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看Driver类源码
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!");
}
}
}
2.获取连接
static Connection
getConnection(String url,String user,String password);
参数
1.url:连接路径
加入useSSL=false,warn消失
2.user:用户名
3.password:密码
Connection
2.事务管理
- MySQL事务管理
开启事务:BEGIN/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
- JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务,false为手动提交事务
提交事务:commit()
回滚事务:rollback()
package com.cyr.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo2 {
public static void main(String[] args) throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql:///test?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义SQL语句
String sql1 = "update demo1 set money = 3000 where id = 1";
String sql2 = "update demo1 set money = 3000 where id = 2";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//出现异常,回滚事务,该过程可以使用异常try catch捕获异常
try {
//开启事务
conn.setAutoCommit(false);
//5.执行sql
int count1 = stmt.executeUpdate(sql1);//受影响的行数
//6.处理结果
System.out.println(count1);
//5.执行sql
int count2 = stmt.executeUpdate(sql2);//受影响的行数
//6.处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
e.printStackTrace();
}
//7.释放资源
stmt.close();
conn.close();
}
}
正常运行
如果中途出现异常,例如int i = 3/0;
try {
//开启事务
conn.setAutoCommit(false);
//5.执行sql
int count1 = stmt.executeUpdate(sql1);//受影响的行数
//6.处理结果
System.out.println(count1);
int i = 3/0;//异常
//5.执行sql
int count2 = stmt.executeUpdate(sql2);//受影响的行数
//6.处理结果
System.out.println(count2);
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
conn.rollback();
e.printStackTrace();
}
即使第一个执行成功,也会回滚到开启事务之前的状态,两个依旧是1000
Statement
package com.cyr.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCDemo4 {
/**
* 执行DML语句
* @throws Exception
*/
@Test
public void testDML() throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql:///test?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义SQL语句
String sql = "update demo1 set money = 3000 where id = 1";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//执行完DML语句后,受影响的行数
//6.处理结果
//System.out.println(count);
if(count>0){
System.out.println("修改成功");
}
else{
System.out.println("修改失败");
}
//7.释放资源
stmt.close();
conn.close();
}
}
执行完DML语句后,受影响的行数,所以如果行数大于零,发生变化修改成功,如果等于零,就没有发生变化,修改失败;
在DDL语句时,有drop的删除操作,此时受影响的行数打印出来为0,但也执行成功了,所以DDL不使用“修改成功”“修改失败”。
ResultSet
package com.cyr.jdbc;
import java.sql.*;
public class JDBCDemo4 {
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/test?useSSL=false";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义SQL语句
String sql = "select * from demo1";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs= stmt.executeQuery(sql);//受影响的行数
//6.处理结果
//6.1光标向下移动一行,并且判断当前行是否有数据
while (rs.next()){
//6.2获取数据
int id = rs.getInt(1);
String name = rs.getString(2);
double money = rs.getDouble(3);
System.out.println(id);
System.out.println(name);
System.out.println(money);
System.out.println("-----------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
运行结果: