一、JDBC 简介

image.png
二、JDBC 使用步骤

image.png
代码:
package cn.test.jdbc;
import java.sql.*;
/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {
public static void main(String[] args) throws SQLException {
// 1.导入驱动jar包右键选择Add as Library
// 2.注册驱动
//Class.forName("com.mysql.jdbc.Driver"); // MySQL 5 之后的驱动包可以省略,会自动加载
// 3.获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");
// 4.定义sql语句
String sql = "update student set age=20 where id=1";
// 5.获取执行sql对象的 statement
Statement statement = connection.createStatement();
// 6.执行sql
int resultSet = statement.executeUpdate(sql); // 返回的实际受影响行数
// 7.处理结果
System.out.println(resultSet);
// 8.释放资源
statement.close(); // 先释放statement
connection.close();
}
}
注意:需要先下载并导入mysql的驱动包
三、JDBC API 详解
1.DriverManager
- 注册驱动
DriverManager.registerDriver
上面
Class.forName("com.mysql.jdbc.Driver")里面可以看到源码里面是静态代码块里面调用了 registerDriver 方法来注册驱动
- 获取数据库连接对象
DriverManager.getConnection
image.png
2.Connection
- 获取执行 SQL 的对象
image.png
- 管理事务
image.png
package cn.test.jdbc;
import java.sql.*;
/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {
public static void main(String[] args) throws SQLException {
shiWu();
}
// jdbc 事务处理
public static void shiWu() throws SQLException {
// 获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");
//获取执行sql对象的 statement
Statement statement = connection.createStatement();
try {
// 开启事务
connection.setAutoCommit(false);
// 定义sql语句
String sql1 = "update student set age=20 where id=1";
String sql2 = "update student set age=20 where id=2";
// 执行sql
int result1 = statement.executeUpdate(sql1);
System.out.println(result1);
int result2 = statement.executeUpdate(sql2);
System.out.println(result2);
// 提交事务
connection.commit();
} catch (Exception e) {
e.printStackTrace();
// 回滚事务
connection.rollback();
}
// 8.释放资源
statement.close(); // 先释放statement
connection.close();
}
}
3.Statement (基本不用了,因为有SQL注入问题)
因为 Statement 会造成sql注入问题,因此后面使用 PreparedStatement 替代 Statement
Statement 作用:执行SQL语句
image.png
4.ResultSet

image.png
package cn.test.jdbc;
import java.sql.*;
public class jdbcDemo2 {
public static void main(String[] args) throws SQLException {
fn_DQL();
}
// DQL(查询语句)
private static void fn_DQL() throws SQLException {
// 2.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
// 3.获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql:///db1", "root", "root");
// 4.获取执行sql对象的 statement
Statement statement = connection.createStatement();
// 5.定义sql语句
String sql = "select * from student";
// 6.执行sql
ResultSet resultSet = statement.executeQuery(sql);
// 7.处理结果
// 游标下移
while (resultSet.next()) {
// 获取每行数据中指定列---有点麻烦,每列需要用不同的get方法获取
int id = resultSet.getInt(1); // 根据列index获取,index从1开始
String name = resultSet.getString("name");// 或者根据列名获取
int age = resultSet.getInt("age");
Date birthday = resultSet.getDate("birthday");
System.out.println(id + "---" + name + "---" + age + "---" + birthday);
}
// 释放资源
resultSet.close();
statement.close();
connection.close();
}
}
5.PreparedStatement - (常用)
因为 Statement 会造成sql注入问题,因此后面使用 PreparedStatement 替代 Statement
image.png
image.png
package cn.test.jdbc;
import java.sql.*;
/*
当前mysql版本是 5.5.28
jdbc快速入门
*/
public class jdbcDemo1 {
public static void main(String[] args) throws SQLException {
prepareStatementUse();
}
// PreparedStatement 的使用
private static void prepareStatementUse() throws SQLException {
// 模拟登录
String name = "张三";
String password = "123123";
// 获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db1", "root", "root");
String sql1 = "SELECT * FROM user WHERE name = ? && password=?";
//获取执行sql对象的 PreparedStatement
PreparedStatement pst = connection.prepareStatement(sql1);
// 设置sql 语句中 ?占位符对应的值
pst.setString(1, name);
pst.setString(2, password);
// 执行sql
ResultSet res = pst.executeQuery();
if(res.next()) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
// 8.释放资源
res.close();
pst.close(); // 先释放statement
connection.close();
}
}

image.png
四、数据库连接池
和线程池类似,都是为了复用,省去创建和释放的时间。

image.png

image.png
五、Druid (德鲁伊)数据库连接池的使用

image.png
定义 druid.properties 配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db2
username=root
password=root
# 初始连接数量
initialSize=5
# 最大连接数量
maxActive=10
# 最大等待时间
maxWait=3000
代码
package cn.test;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class Druid_Demo {
public static void main(String[] args) throws Exception {
// 1 导入jar包
// 2.定义配置文件
// 3.加载配置文件
Properties pro = new Properties();
InputStream is = Druid_Demo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
// 4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 5.获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
// 6.归还连接
connection.close();
}
}
参考:黑马javaWeb教程





