1、概念
JDBC就是使用java语言操作关系型数据库的一套API, 全称:(Java DataBase Connectivity)Java数据库连接
本质:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则 ,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
2、快速入门
package site.ieven;
import java.sql.*;
public class FirstJava {
public static void main(String[] args) throws Exception {
// 注册驱动(该行代码可以省略)
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "";
// 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
Statement stmt = conn.createStatement();
// 定义sql语句
String sql = "select * from info";
// 执行sql语句
ResultSet res = stmt.executeQuery(sql);
// 处理返回的结果
while (res.next()) {
int id = res.getInt("id");
int userId = res.getInt("user_id");
String desc = res.getString("desc");
System.out.println("id:" + id);
System.out.println("userId:" + userId);
System.out.println("desc:" + desc);
}
res.close();
stmt.close();
conn.close();
}
}
注意:为了方便操作,需要创建一个模型类(属性与数据表的属性一致,添加get, set, toString等基本方法),把数据放到模型类中,并且可以定义一个ArrayList来存放数据
3、api详解
DriverManager对象
DriverManager对象主要目前的两个功能,一个是注册Driver,在jdbc的代码如下
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!");
}
}
}
功能二:获取连接
// 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
Statement stmt = conn.createStatement();
dml操作: 目前update与delete, insert一样都是使用 executeUpdate进行操作
public class FirstJava {
public static void main(String[] args) throws Exception {
// 注册驱动(该行代码可以省略)
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "";
// 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
Statement stmt = conn.createStatement();
long dt = new Date().getTime() / 1000;
// 定义sql语句
String sql = "INSERT INTO info(user_id, `desc`, create_time, update_time) VALUES (1, \"efg\", "+ dt +", "+ dt +")";
// 执行sql语句
int res = stmt.executeUpdate(sql);
System.out.println(res); // 执行成功后返回受影响的行数
stmt.close();
conn.close();
}
}
dql参看快速案例中的例子
jdbc中的事务操作
package site.ieven;
import java.sql.*;
public class FirstJava {
public static void main(String[] args) throws Exception {
// 注册驱动(该行代码可以省略)
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/even?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "";
// 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
// 获取执行sql的对象
Statement stmt = conn.createStatement();
String sql1 = "UPDATE `info` SET `desc`='AAA' WHERE `id`=1";
String sql2 = "UPDATE `info` SET `desc`='BBB' WHERE `id`=2";
String sql3 = "UPDATE `info` SET `desc`='CCC' WHERE `id`=3";
try{
// 开启事务
conn.setAutoCommit(false);
int res1 = stmt.executeUpdate(sql1);
int res2 = stmt.executeUpdate(sql2);
int res3 = stmt.executeUpdate(sql3);
System.out.println(res1);
System.out.println(res2);
System.out.println(res3);
//提交事务
conn.commit();
}catch(Exception err) {
conn.rollback();
err.printStackTrace();
}
stmt.close();
conn.close();
}
}
3、API扩展
preparedStatement: 预编译SQL语句并执行,预防SQL注入问题
注:SQL注入是通过操作输入来修改事先定义好的SQL语句, 用以达到执行代码对服务器进行攻击的方法