1. 什么是JDBC
- Java数据库连接-Java DataBase Connectivity
- JDBC可让Java通过程序操作关系型数据库
- JDBC基于驱动程序实现与数据库的连接与操作
1.2. JDBC的优点
- 统一的API,提供一致的开发过程
- 易于学习,容易上手,代码结构稳定
- 功能强大,执行效率高,可处理海量数据
2. JDBC开发流程
- 导入JDBC驱动包
- 加载并注册JDBC驱动
- 创建数据库连接
- 创建Statement对象
- 遍历查询结果
- 关闭连接,释放资源
2.1. 导入JDBC驱动包
repositories {
mavenCentral()
maven{
//查找aliyun maven库(必须添加这个地址,否则无法找到SqlServer数据库jar)
url'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
dependencies {
implementation 'com.microsoft.sqlserver:sqljdbc4:4.0'
}
2.2. 创建数据库连接代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBC {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
String dbUsername = "sa"; //数据库用户名
String dbPassword = "qzzg491166159"; //数据库密码
//1.加载并初始化JDBC驱动
Class.forName(dbDriver);
//2.创建数据库连接
Connection connection = DriverManager.getConnection(dbURL,
dbUsername, dbPassword);
}
}
2.3. Class.forName的作用
Class.forName用于加载指定的JDBC驱动类
Class.forName本质是通知JDBC注册这个驱动类
驱动由数据库厂商自行开发,连接字符串也不同
2.4. DriverManager
Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上
2.5. Connection对象
Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上
SQLSERVER连接字符串
- 格式:jdbc:sqlserver://主机ip/数据库名?参数列表
- 主机ip与端口是可选设置,默认值为127.0.0.1与1433
- 参数列表采用url编码,格式:参数1=值1&参数2=值2&...
- 3. 连接数据库的常见问题
ClassNotFoundException - 类未找到异常
Connection refuse - 数据库连接被拒绝异常
Access denied for user - 用户名与密码错误异常
4. 数据库查询操作
import java.sql.*;
public class JDBC {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
String dbUsername = "sa"; //数据库用户名
String dbPassword = "qzzg491166159"; //数据库密码
//1.加载并初始化JDBC驱动
Class.forName(dbDriver);
//2.创建数据库连接
Connection connection = DriverManager.getConnection(dbURL,
dbUsername, dbPassword);
//3. 创建Statement对象
Statement stmt = connection.createStatement();
//4. 执行SQL语句,得到查询结果集ResultSet
ResultSet rs = stmt.executeQuery("SELECT * FROM users"); //执行SQL语句
}
}
4.1. 遍历查询结果
import java.sql.*;
public class JDBC {
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
String dbUsername = "sa"; //数据库用户名
String dbPassword = "qzzg491166159"; //数据库密码
//1.加载并初始化JDBC驱动
Class.forName(dbDriver);
//2.创建数据库连接
Connection connection = DriverManager.getConnection(dbURL,
dbUsername, dbPassword);
//3. 创建Statement对象
Statement stmt = connection.createStatement();
//4. 执行SQL语句,得到查询结果集ResultSet
ResultSet rs = stmt.executeQuery("SELECT * FROM users"); //执行SQL语句
//遍历查询结果,
while(rs.next()){
Integer id = rs.getInt(1);//得到每行第1列数据,id
String user_name = rs.getString("user_name"); //得到每行员工姓名列
String pass_word = rs.getString("pass_word"); //每行员工姓名
System.out.println(id + "-" + user_name + "-" + pass_word);
}
}
}
4.2. Statement对象
Statement是用于执行SQL的工具
查询方法: ResultSet executeQuery(String sql)
注意: sql参数必须是SELECT 查询SQL语句
4.3. ResultSet对象
ResultSet结果集对象,保存查询结果
ResultSet采用迭代方式逐行获取每一行表数据
每一次迭代,使用ResultSet对象的getXXX()方法获取列数据
5. 释放数据库资源
try {
//创建Statement , 执行SQL语句 , 处理ResultSet得到结果
rs.close();
stmt.close();
} catch (Exception e) {
//y异常处理
e.printStackTrace();
} finally {
if (connection != null) {
//5. 释放数据库连接
try {
connection.close();
} catch (Exception ex) {
}
}
}
6. JDBC中的事务管理
6.1. 什么是事务
- 事务是以一种可靠的、一致的方式,访问和操作数据库的程序单元
- 说人话:要么把事情做完,要么什么都不做,不要做一半
- 事务依赖于数据库实现,MySQL通过事务区作为数据缓冲地带
6.2. JDBC两种事务模式
DBC允许两种事务模式
自动提交事务模式
手动提交事务模式
6.3. 自动提交事务模式
自动提交模式是指每执行一次写操作SQL,自动提交事务
自动提交开启方法: conn.setAutoCommit(true)
自动事务是JDBC默认行为,此模式无法保证多数据一致性
6.4. 手动提交事务模式
手动提交模式是指显式调用commit()与rollback()方法管理事务
手动提交开启方法: conn.setAutoCommit(false)
手动提交事务可保证多数据一致性,但必须手动调用提交/回滚方法
connection.commit()提交事务
String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
String dbUsername = "sa"; //数据库用户名
String dbPassword = "qzzg491166159"; //数据库密码
//1.加载并初始化JDBC驱动
Class.forName(dbDriver);
//2.创建数据库连接
Connection connection = DriverManager.getConnection(dbURL,
dbUsername, dbPassword);
//手动提交开启方法
connection.setAutoCommit(false);
//3. 创建Statement对象
Statement stmt = connection.createStatement();
String sql = "insert into users(user_name,pass_word) values(?,?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "张三");
pstmt.setString(2,"zshang123" );
//executeUpdate方法返回记录数
int cnt = pstmt.executeUpdate();
//提交事务
connection.commit();
//事务回滚
connection.rollback();
6.5. 事务回滚
如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。
如果没有发生故障,则通过以完成状态提交事务来完成更新。
connection.rollback()事务回滚
7. Apache Commons DBUtils
commons-dbutils是 Apache提供的开源 JDBC工具类库
它是对JDBC的简单封装,学习成本极低
使用commons-dbutils可以极大简化JDBC编码工作量
7.1. 导入DBUtils依赖包
dependencies {
implementation 'com.microsoft.sqlserver:sqljdbc4:4.0'
implementation 'net.sourceforge.jtds:jtds:1.3.1'
implementation 'commons-dbutils:commons-dbutils:1.7'
}
7.2. 引入DbUtil公共类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
class DbUtil {
private static String url = "jdbc:jtds:sqlserver://localhost:1433/test";
private static String username = "sa";
private static String password = "qzzg491166159";
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
7.3. 增刪改查示例
public class DBUtilsTest {
public static void testQuery() {
//创建连接
Connection conn = DbUtil.getConnection();
//创建SQL执行工具
QueryRunner queryRunner = new QueryRunner();
List list = null;
try {
//执行SQL查询,并获取结果
list = queryRunner.query(conn, "select * from users", new
BeanListHandler<> (Users.class));
} catch (SQLException e) {
e.printStackTrace();
}
if (list != null) {
//输出查询结果
list.forEach(System.out::println);
}
//关闭数据库连接
DbUtils.closeQuietly(conn);
}
public static void testUpdate() {
//创建连接
Connection conn = DbUtil.getConnection();
//创建SQL执行工具
QueryRunner queryRunner = new QueryRunner();
int rows = 0;
try {
//执行SQL插入
rows = queryRunner.update(conn, "update users set pass_word=?
where user_name=?", "24", "阡陌");
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("成功更新" + rows + "条数据!");
//关闭数据库连接
DbUtils.closeQuietly(conn);
}
public static void testDelete() {
//创建连接
Connection conn = DbUtil.getConnection();
//创建SQL执行工具
QueryRunner queryRunner = new QueryRunner();
int rows = 0;
try {
//执行SQL插入
rows = queryRunner.update(conn, "delete users where user_name=?",
"阡陌");
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("成功刪除" + rows + "条数据!");
//关闭数据库连接
DbUtils.closeQuietly(conn);
}
public static void testInsert() {
//创建连接
Connection conn = DbUtil.getConnection();
//创建SQL执行工具
QueryRunner queryRunner = new QueryRunner();
int rows = 0;
try {
//执行SQL插入
rows = queryRunner.update(conn, "INSERT INTO users (user_name,
pass_word) VALUES (?, ?)", "阡陌", "24");
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("成功插入" + rows + "条数据!");
//关闭数据库连接
DbUtils.closeQuietly(conn);
}
public static void main(String[] args) {
testInsert();
testUpdate();
testDelete();
testQuery();
}
}