回顾:
脏读:未提交事务的数据
不可重复读:已提交数据 update
幻读或者虚读:已经提交了数据的行数 insert delete
JDBC介绍(掌握)
核心API
1.DriverManager 驱动管理类
2.connection连接接口
3.Statement 发送SQL语句的接口 Statement的子接口PreparedStatement 预编译接口,防止SQL注入问题
4.ResultSet 结果集 接收查询的数据
JDBC编程六步(掌握)
注册驱动
Class.forName("com.mysql.jdbc.Driver");
数据库获取连接
使用驱动管理类DriverManager中的静态方法:
static Connection getConnection(String url, String user, String password)试图建立到给定数据库 URL 的连接。
参数:
url -连接数据库的地址
url整体格式:jdbc:mysql://连接数据库服务器的ip地址:连接数据库的端口号/具体的数据库名
user -数据库用户,root
password -用户的密码1234
*/
//2.获取和数据库的连接String url = "jdbc:mysql://localhost:3306/day04_db";//连接数据库的地址String user = "root";//数据库用户String password = "1234";//用户的密码Connection conn = DriverManager.getConnection(url, user, password);
获取发送SQL语句对象
使用驱动管理类DriverManager中的静态方法:
static Connection getConnection(String url, String user, String password)试图建立到给定数据库 URL 的连接。
参数:
url -连接数据库的地址
url整体格式:jdbc:mysql://连接数据库服务器的ip地址:连接数据库的端口号/具体的数据库名
user -数据库用户,root
password -用户的密码1234
*/
//2.获取和数据库的连接String url = "jdbc:mysql://localhost:3306/day04_db";//连接数据库的地址String user = "root";//数据库用户String password = "1234";//用户的密码Connection conn = DriverManager.getConnection(url, user, password);
3.获取Statement对象
在java.sql.Connection接口中有如下方法获取到Statement对象
Statement的API介绍
int executeUpdate(String sql)
根据执行的DML(insert、update、delete)语句,发挥影响的行数
2.resultSet excuteQuery(String sql)
根据执行的结果集,只能执行select语句
注意:在MySQL中,只要不是查询就是修改。
executeUpdate:用于执行增删改
executeQuery:用于执行查询
使用步骤
1.注册驱动
2。获取连接
3.获取Statement对象
4.使用Statement对象执行SQL语句
5.释放资源
JDBC实现对单标查询
Result原理
1.ResultSet内部有一个指针,开始记录开始位置
2.调用next方法,ResultSet内部指针就会移动到下一行数据
3.我们可以通过ResultSet得到一行数据getXxx得到某列数据
public class Demo04 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");
Statement stmt = conn.createStatement();
SString sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
// 内部有一个指针,只能取指针指向的那条记录
while(rs.next()){// 指针移动一行,有数据才返回true
int id = rs.getInt("id");
String name = rs.getString(2);
String pwd= rs.getString(3);
System.out.println(id+"+++"+name+"++++"+pwd);
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
}
}
JDBC事务
开启事务(coon.setAutoCommit(false))——>执行一组SQL语句——>一切正常提交事务 coon.commit();
开启事务(coon.setAutoCommit(false))——>执行一组SQL语句——> 出现异常,回滚事务coon.rollback;
Connection 接口中与事务有关的方法
void setAutoCommit(boolean autoCommit)throws SQLException;
false:开启事务,true:关闭事务
voidcommit()throwsSQLException;
提交事务
voidrollback()throwsSQLException;
回滚事务
注意:在jdbc事务操作中,事务的控制都是通过Connection对象完成的,当一个完整的业务操作前,我们首先使用coon.setAutoCommit(false)来开启事务。默认情况下是true的,表示关闭事务,那么一条SQL语句就是一个事务,默认提交事务。如果设置为false,那么表示开启事务,所有的SQL语句就会都在一个事务中。
当业务操作完成后,如果整个操作没有问题,我们需要使用coon.commmit()来提交事务。当然了,如果出现了异常,我们需要使用coon.rollback()撤销所有的操作,所以出现事务的异常,需要进行事务的回滚。
使用步骤
1.注册驱动
2.获取连接
3.开启事务
4.获取Statement
5.使用Statement执行SQL
6.提交或回滚事务
7.关闭资源
package com.day04;
import com.mysql.jdbc.Driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC {
public static void main(String[] args)throws SQLException, ClassNotFoundException {
/* DriverManager.registerDriver(new Driver());
使用 DriverManager.registerDriver(new Driver());,存在以下不足,注册被注册两次
*/
Class.forName("com.mysql.jdbc.Driver");//注册驱动
//获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db","root","root");
System.out.println(connection);
//从连接中拿到一个Statement对象
Statement statement = connection.createStatement();
//1.插入记录
/*String sql ="insert into user values(null,'zhaoliu','abc')";
int i=statement.executeUpdate(sql);
System.out.println("影响的行数:"+i );*/
//2.修改记录
/* String sql="update user set username='tianqi'where username='zhaoliu'";
int i=statement.executeUpdate(sql);
System.out.println("影响的行数:"+i );*/
//删除记录
String sql ="delete from user where id=4";
int i=statement.executeUpdate(sql);
System.out.println("影响的行数:"+i );
statement.close();
connection.close();
}
}
编写JDBC工具类
在目录下创建jdbc.properties
jdbc.properties文件中的配置信息
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day04_db
user=root
password=root
如何读取外部文件的内容?
public static void main(String[]args) {
// 需求: 通过properties对象读取 外部配置的内容
Propertiesprop=newProperties();
try{
//对于FileInputStream流相对的路径是当前模块
FileInputStreamin=newFileInputStream("jdbc.properties");
// 加载外部的配置文件
prop.load(in);
}catch(IOExceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 读取外部配置文件的内容
StringdriverClass=prop.getProperty("driverClass");
Stringurl=prop.getProperty("url");
Stringuser=prop.getProperty("user");
Stringpassword=prop.getProperty("password");
System.out.println(driverClass);
}
获得连接的最终版
public class JDBCUtils {
static String driverClass = null;
static String url = null;
static String user = null;
static String password = null;
static {
// 需求: 通过properties对象读取 外部配置的内容
Properties prop = new Properties();
try {
FileInputStream in=new FileInputStream("jdbc.properties");
// 加载外部的配置文件
prop.load(in);
// 读取外部配置文件的内容
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
// 注册驱动
Class.forName(driverClass);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 获得连接
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url, user, password);
} catch (Exception e)
{
e.printStackTrace();
}
return con;
}
}
关闭资源
public static void release(Connection conn, Statement stmt, ResultSet rs) {
// 释放资源
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
优化后的delete方法
@Test
publicvoiddelete() {
// 需求: 删除id=3的记录
Connectionconn=null;
Statementstmt=null;
try{
// 获得连接
conn=JDBCUtils.getConnection();
// 获得发送sql的对象
stmt=conn.createStatement();
// 执行sql 获得结果
Stringsql="delete from user where id=3";
intsum=stmt.executeUpdate(sql);
// 处理结果
System.out.println(sum);
}catch(Exceptione) {
e.printStackTrace();
}finally{
// 释放资源
JDBCUtils.release(conn,stmt,null);
}
}