JDBC编程:
JDBC(Java Database Connectivity),Java数据库连接,是一种可以执行SQL语句的Java API。
JDBC编程的大体流程:
1). 创建数据库连接Connection
2). 创建操作命令Statement
3). 使用操作命令来执行SQL
4). 处理结果集ResultSet
5). 释放资源
1 注册 Driver
加载JDBC驱动程序:反射,调用初始化com.mysql.jdbc.Driver
类,即将该类加载到JVM方法区,并执行该类的静态方法块、静态属性
Class.forName("com.mysql.jdbc.Driver"); 此处需要抛出异常
2 创建数据库连接:
String url = "jdbc:mysql://127.0.0.1:3306/java20_20191218?useSSL=false&characterEncoding=utf8”;
String username = "root";
String password = "mysql";
Connection connection = DriverManager.getConnection(
//此处需要抛出异常
url,
username,
password
);
java20_20191218:
数据库名
127.0.0.1:3306:
要连接数据库的ip和mysql标准端口
SSL
: (Secure Socket Layer) 安全的套接字层
jdbc:mysql:
在jdbc中使用默认的mysql协议
3 获取语句 Statement
通过连接获取一条语句对象(每个 statement 对象只能用于一条语句)
import java.sql.Statement;
Statement statement = connection.createStatement();
4. 执行一条sql语句 SELECT DATABASE()
String sql = "SELECT DATABASE()";
ResultSet resultSet = statement.executeQuery(sql);
5. 处理结果集,事先知道结果只有一行 + 一列
resultSet.next(); // 调一次 next 才到第一行
String name = resultSet.getString(1); // 下标是从 1 开始的
System.out.println(name);
// -3. 关闭结果集(resultSet)
resultSet.close();
sql = "SELECT id, username FROM users ORDER BY id";
resultSet = statement.executeQuery(sql);
获取结果集数据需要不同的类型,调用不同的方法
int r = resultSet.getInt();
long r = resultSet.getLong();
String r = resultSet.getString();
while (resultSet.next()) {
int id = resultSet.getInt(1); //resultSet.getLong(1);
String user = resultSet.getString(2);
除了下标也可以用字段名 如:”name”
String user = resultSet.getString(“name”);
System.out.println(id + ", " + user);
}
resultSet.close();
关闭语句
statement.close();
关闭连接
connection.close();
注意:
- Driver只注册一次;
- 可以获取多个Statement, 推荐一个语句使用一个Statement.
- Connection一般只需要连接一次,特殊情况下需要多个连接。
- 增/删/改操作insert delete update ————使用
executeUpdate
执行sql语句; - 查select————使用
executeQuery
执行sql语句,因executeQuery可以返回一个结果集。
通过 statement 对象来执行 SQL 语句
Insert:
Statement statement = connection.createStatement();
String sql = "INSERT INTO users (id, name) VALUES (1, 'glp')";
statement.executeUpdate(sql);
Update:
Statement statement = connection.createStatement();
String sql = "UPDATE users SET name = 'glp' WHERE id = 1";
statement.executeUpdate(sql);
Delete:
Statement statement = connection.createStatement();
String sql = "DELETE FROM users WHERE id = 1";
statement.executeUpdate(sql);
select:
Statement statement = connection.createStatement();
String sql = "SELECT id, name FROM users";
ResultSet resultSet = statement.executeQuery(sql);
JDBC常用连接方法
数据库连接Connection
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:
(1)一种是通过DriverManager(驱动管理类)的静态方法获取:
加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
创建数据库连接
Connection connection = DriverManager.getConnection(url);
(2)一种是通过DataSource(数据源)对象获取(实际应用中会使用DataSource对象)
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setServerName("127.0.0.1"); ip
mysqlDataSource.setPort(3306); 端口
mysqlDataSource.setUser("root"); 用户名
mysqlDataSource.setPassword(""); 密码
mysqlDataSource.setDatabaseName("java20_0211"); 数据库名
mysqlDataSource.setUseSSL(false); SSL
mysqlDataSource.setCharacterEncoding("utf8"); 编码
DataSource dataSource = mysqlDataSource;
Connection con = dataSource.getConnection();
PreparedStatement使用:
try (Connection con = dataSource.getConnection()) {
String sql = "SELECT chinese FROM voc WHERE english = ?";
try (PreparedStatement stmt = con.prepareStatement(sql)) {
stmt.setString(1, request); 尤其要注意 SQL 注入的问题
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
response = rs.getString("chinese");
}
}
}catch (SQLException e) {
e.printStackTrace();
}
如果获取插入后的 自增 id需使用Statement.RETURN_GENERATED_KEYS)
来获取:
try (PreparedStatement stmt = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS)) {
执行插入操作
}
插入成功,就可以通过 getGeneratedKeys 获取自增 id
try (ResultSet rs = stmt.getGeneratedKeys()) {
if (rs.next()) {
id = rs.getInt(1);
return new User(id);
}
}
(3)以上两种方式的区别是:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收. 优点就是有连接池,代码简单点。
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。
1)PrepareStatement: 预编译,速度快;防止 SQL 注入;代码简单点,参数化SQL查询
注意:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
- execute 用于 DDL 语句(create, drop, alter)
(4)JDBC常用写法:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Database {
private static DataSource dataSource;
static {
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setServerName("127.0.0.1");
mysqlDataSource.setPort(3306);
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("mysql");
mysqlDataSource.setDatabaseName("java20_blog04");
mysqlDataSource.setUseSSL(false);
mysqlDataSource.setCharacterEncoding("utf8");
dataSource = mysqlDataSource;
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}