▊ JDBC初识
Java DataBase Connectivity,Java数据库连接, 即用Java语言操作数据库
JDBC的本质:其实是Sun公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商(Oracle,MySql)去实现这套接口,各自提供数据库驱动(jar包)。我们使用这套接口(JDBC)去编程,真正执行的是数据库驱动(jar包)中的实现类———面相接口,通过多态,实现了一套代码操作操作多种数据库
▊ 使用到的对象
- DriverManager:驱动管理
- Connection:数据库连接
- Statement:执行静态sql对象
- ResultSet:结果集
- PreparedStatement:执行动态sql对象(Statement的子接口)
tip:
cmd窗口mysql -u root -p,如果闪退或出错说明你的mysql服务还没打开
services.msc进入控制面板的服务项手动打开;net start mysql命令也可以
DriverManager
java">1. 注册驱动:告诉程序该使用哪一个数据库驱动jar包
该类有一个registerDriver静态方法用于注册驱动,它被使用在com.mysql.cj.jdbc.Driver类的静态代码块中。
当执行`Class.forName("com.mysql.cj.jdbc.Driver")` 语句,类被加载,驱动也就被注册。
注: mysql5之后的驱动jar包可以省略注册驱动的步骤
2. 获取数据库连接
getConnection(String url, String user, String password) ,静态方法,返回Connection对象
三个参数:url,用户名,密码
其中url的组成是:"jdbc:mysql://ip地址(域名):端口号/数据库名称",如"jdbc:mysql://localhost:3306/myDB";
解决时区问题还要加上"?serverTimezone=GMT%2B8"
Connection
java">功能:
1. 获取执行sql 的对象
> createStatement() 返回Statement
> preparedStatement(String sql) 返回PreparedStatement
2. 管理事务:
> 开启事务:setAutoCommit(false)
> 提交事务:commit()
> 回滚事务:rollback()
Statement
java">功能: 执行静态sql语句
execute(String sql) 执行任意的sql(很少使用)
executeUpdate(String sql) 执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句。DML返回int:影响的行数,DDL返回0
executeQuery(String sql) 执行DQL(select)语句。查询语句当然是返回ResultSet
ResultSet
java">next() 游标向下移动一行。返回boolean,代表是否已经到达末尾
getXxx(列编号/列名) Xxx是指定返回的数据类型;参数可以是 从1开始的列编号(int)或列名(String)
// Demo:
while(result.next()) {
System.out.println(result.getString(姓名));
}
PreparedStatement
java">如果利用字符串拼接生成静态sql,使用Statement对象,会出现"sql注入"的危险
解决方案是使用动态sql(预编译sql),使用PreparedStatement对象
获取静态的sql执行对象createStatement(不传参) -> 执行sql(传参)
获取动态的sql执行对象prepareStatement(传参) -> setXxx(index, content)设置参数 -> 执行sql(不传参)
// 静态sql
Statement statement = conn.createStatement();
String sql = "select * from accountTable where account = 'Loli' and age = 12"
ResultSet result = statement.executeQuery(sql);
// 动态sql
String sql = "select * from accountTable where account = ? and password = ?";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, "Alice");
preparedStatement.setInt(2, 12);
ResultSet result = preparedStatement.executeQuery();
▊ Demo
经典代码——向表中插入数据 (静态DML语句)
java">>>> 基本步骤(★)
>>> 注册驱动 -> 获取连接 -> 获取sql执行对象 -> 执行sql -> 释放资源
java">Connection conn = null; // 提升作用域(否则在finally的作用域无法使用conn和statement)
Statement statement = null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myLoli?serverTimezone=GMT%2B8", "root", "2062120d");
statement = conn.createStatement();
int count = statement.executeUpdate("insert into student values('201810223016','萝莉控')");
System.out.println("影响行数:" + count);
} catch (ClassNotFoundException e){ // 抓com.mysql.cj.jdbc.Driver类不存在异常
e.printStackTrace();
} catch (SQLException e){ // 抓SQL异常
e.printStackTrace();
} finally { // 释放资源写在finally块里,保证一定执行(如果有ResultSet,也需要释放)
if(statement != null){ // 避免空指针异常(statement不一定被赋值)
try {
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn != null){ // 避免空指针异常(conn不一定被赋值)
try {
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
▊ JDBC控制事务
事务(Transaction)是并发控制的单位。要么全部完成,要么全部失败。
java">我们使用Connection对象管理事务 :
setAutoCommit(false) 开启事务
commit() 提交事务
rollback() 回滚事务
>>> 调用者是Connection对象: conn.commit()
>>> 用法:setAutoCommit(false)和commit()包裹代码块;rollback()写在catch块中
♬ End