JDBC

Intro

jdbc 是一套连接数据库的规范,由各数据库分别实现。

MySQL:mysql-connector-java (mvnrepository.com)

注册驱动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Class.forName("com.mysql.cj.jdbc.Driver");


/* com.mysql.cj.jdbc.Driver */
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!");
}
}
}

DriverManager

驱动管理,调用静态方法 getConnection 获取数据库连接对象。

1
2
3
4
5
6
7
// 常用方法:static Connection getConnection(String url, String user, String password)
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "123456";
Connector con = DriverManager.getConnection(url,user,password);
// TODO 数据库操作
con.close()

PreparedStatement

Statement 使用的字符串拼接的方式执行 SQL 语句,因此有 SQL 注入风险,必须使用 PreparedStatement。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
1、执行查询操作
ResultSet executeQuery()

2、执行除查询以外的其他操作,返回影响的 row num
int executeUpdate()

3、执行任何 sql 代码,如果返回的是 resultset 对象则返回 true,返回 int 则返回 false
boolean execute()

3、设置占位符对应值 parameterIndex 从 1 开始
void setInt(int parameterIndex, int x)
void setDate(int parameterIndex, java.sql.Date x)
void setString(int parameterIndex, String x)
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
// 定义查询 SQL 语句,使用 ? 作为占位符,用于填充
String sql = "SELECT * FROM user WHERE id = ?";
// 获取 PreparedStatement 对象
PreparedStatement ps = con.prepareStatement(sql);
// 填充占位符的值
ps.setInt(1, 2);
// 执行 SQL 语句
ResultSet rs = ps.executeQuery();

// TODO 解析数据

// 关闭资源
ps.close();

ResultSet

保存查询记录

1
2
3
4
5
6
7
8
9
10
/*
1、调用一次会将游标向下移动,如果当当前行可用返回 true,反之返回 false
boolean next()

2、获取当前行的数据,可以使用列索引(1 开始),也可以使用列名
String getString(int columnIndex)
String getString(String columnLabel)
int getInt(int columnIndex)
int getInt(String columnLabel)
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<User> al = new ArrayList<>();
try(Connection cn = JDBCUtils.getConnection();
PreparedStatement pre = cn.prepareStatement("select * from user");
ResultSet rs = pre.executeQuery();){
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
String password = rs.getString("password");
al.add(new User(id, name, email, password));
}
}catch(SQLException e){
JDBCUtils.printSQLException(e);
}

Transactions

Connection 默认获取的连接是自动提交事务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
1、设置自动提交
void setAutoCommit(boolean autoCommit)

2、提交事务
void commit()

3、设置保存点
Savepoint setSavepoint()

4、事务回滚
void rollback()
void rollback(Savepoint savepoint)
*/

Druid

德鲁伊是阿里巴巴开发的连接池技术。druid (mvnrepository.com)

1
2
3
4
5
6
7
8
9
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
characterEncoding=utf-8
username=root
password=123456
initialSize=10
maxActive=50
maxWait=5000
testWhileIdle=true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 读取配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src\\druid.properties"));

// 注册连接池
DataSource ds = DruidDataSourceFactory.createDataSource(prop);

// 获取连接对象
Connection cn = ds.getConnection();

// TODO 数据库操作

// 归还连接到连接池中
cn.close();

JDBC
https://reajason.vercel.app/2021/11/25/JavaWebJDBC/
作者
ReaJason
发布于
2021年11月25日
许可协议