记录:290
场景:基于Spring Boot应用Java原生JDBC操作数据库。包括查、增、改、删操作。对应SQL关键字是select、insert into、update、delete。
版本:
JDK 1.8
MySQL 5.7.33
Spring Boot 2.6.3
Spring Framework 5.3.15
名词:
JDBC:即Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。
操作类:
java.sql.Connection
java.sql.DriverManager
java.sql.PreparedStatement
java.sql.ResultSet
java.lang.Class
com.mysql.cj.jdbc.Driver
目的:
便于查阅Java原生JDBC的查、增、改、删操作。清楚描述一个函数,了解函数入参类型,了解返回值类型,应该就可以参透这个函数,至少应用层面是没问题。
一、查
查,即使用Java原生JDBC对数据库的数据做查询操作。
SQL关键字:select。
1.步骤
(1)获取数据库连接信息
(2)加载驱动(com.mysql.cj.jdbc.Driver)
(3)获取数据库连接(java.sql.Connection)
(4)获取查询SQL
(5)获取查询条件参数
(6)创建PreparedStatement与设置入参(java.sql.PreparedStatement)
(7)执行SQL: select语句与获取结果集
(8)遍历ResultSet和封装成List<Map<String, Object>>,(java.sql.ResultSet)
(9)异常处理
(10)关闭操作的相关资源
2.实例
本例查询一条数据并把结果集封装为List<Map<String, Object>>。
/**
* 查
* 1. java.sql.Connection
* 2. java.sql.DriverManager
* 3. java.sql.PreparedStatement,函数executeQuery()
* 4. java.sql.ResultSet
*/
public static List<Map<String, Object>> f1() {
// 1.获取数据库连接信息
DatabaseInfo dbInfo = new DatabaseInfo();
String username = dbInfo.getUsername();
String password = dbInfo.getPassword();
String jdbcUrl = dbInfo.getJdbcUrl();
String driverName = dbInfo.getDriverName();
Connection conn = null;
PreparedStatement pStatement = null;
List<Map<String, Object>> result = null;
ResultSet resultSet = null;
try {
// 2.加载驱动
Class.forName(driverName);
// 3.获取数据库连接
conn = DriverManager.getConnection(jdbcUrl, username, password);
// 4.获取查询SQL
String sql = getSelectSql01();
// 5.获取查询条件参数
Object[] args = new Object[]{"杭州", "1"};
// 6.创建PreparedStatement与设置入参
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, args[0]);
pStatement.setObject(2, args[1]);
// 7.执行SQL: select语句与获取结果集
resultSet = pStatement.executeQuery();
// 8.遍历ResultSet和封装成List<Map<String, Object>>
result = new ArrayList<>();
while (resultSet.next()) {
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
Map<String, Object> oneRow = new HashMap<>();
for (int i = 1; i < columnCount + 1; i++) {
String columnName = rsmd.getColumnName(i);
oneRow.put(columnName, resultSet.getObject(columnName));
}
result.add(oneRow);
}
} catch (Exception e) {
// 9.异常处理
closeResultSet(resultSet);
closePreparedStatement(pStatement);
closeConnection(conn);
e.printStackTrace();
} finally {
// 10.相关操作关闭
closeResultSet(resultSet);
closePreparedStatement(pStatement);
closeConnection(conn);
}
return result;
}
/**
* 1.select语句
* 2.入参带查询条件
*/
public static String getSelectSql01() {
String sql01 = "SELECT\n" +
" ID,CITY_NAME,LAND_AREA,POPULATION,GROSS,\n" +
" CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME\n" +
"FROM t_city " +
"WHERE CITY_NAME = ? AND ID =? ";
return sql01.toString();
}
二、增
增,即使用Java原生JDBC对数据库的数据做插入操作。
SQL关键字:insert into。
1.步骤
(1)获取数据库连接信息
(2)加载驱动(com.mysql.cj.jdbc.Driver)
(3)获取数据库连接(java.sql.Connection)
(4)获取插入SQL
(5)组装插入参数
(6)创建PreparedStatement与设置入参(java.sql.PreparedStatement)
(7)执行SQL: insert语句和返回行数
(8)打印返回值
(9)异常处理
(10)关闭操作的相关资源
2.实例
本例插入一条数据。
/**
* 增
* 1. java.sql.Connection
* 2. java.sql.DriverManager
* 3. java.sql.PreparedStatement,函数executeUpdate()
*/
public static void f2() {
// 1.获取数据库连接信息
DatabaseInfo dbInfo = new DatabaseInfo();
String username = dbInfo.getUsername();
String password = dbInfo.getPassword();
String jdbcUrl = dbInfo.getJdbcUrl();
String driverName = dbInfo.getDriverName();
Connection conn = null;
PreparedStatement pStatement = null;
try{
// 2.加载驱动
Class.forName(driverName);
// 3.获取数据库连接
conn = DriverManager.getConnection(jdbcUrl, username, password);
// 4.获取插入SQL
String sql = getInsertSql01();
// 5.组装插入参数
Object[] args = new Object[]{
"杭州", "16850", "1200", "1.81",
"杭州是一个好城市", "2021", "2022-08-07 11:16:18"
};
// 6.创建PreparedStatement与设置入参
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, args[0]);
pStatement.setObject(2, args[1]);
pStatement.setObject(3, args[2]);
pStatement.setObject(4, args[3]);
pStatement.setObject(5, args[4]);
pStatement.setObject(6, args[5]);
pStatement.setObject(7, args[6]);
// 7.执行SQL: insert语句和返回行数
int rows = pStatement.executeUpdate();
// 8.打印返回值
System.out.println("rows = " + rows);
}catch (Exception e){
// 9.异常处理
closePreparedStatement(pStatement);
closeConnection(conn);
e.printStackTrace();
}finally {
// 10.相关操作关闭
closePreparedStatement(pStatement);
closeConnection(conn);
}
}
/**
* 1.insert语句,插入数据
* 2.入参带插入数据
*/
public static String getInsertSql01() {
String sql01 = "INSERT INTO t_city (\n" +
" CITY_NAME,LAND_AREA,POPULATION,\n" +
" GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME\n" +
")\n" +
"VALUES (?, ?, ?, ?, ?, ?, ?)";
return sql01.toString();
}
三、改
改,即使用Java原生JDBC对数据库的数据做修改操作。
SQL关键字:update。
1.步骤
(1)获取数据库连接信息
(2)加载驱动(com.mysql.cj.jdbc.Driver)
(3)获取数据库连接(java.sql.Connection)
(4)获取修改SQL
(5)组装修改参数
(6)创建PreparedStatement与设置入参(java.sql.PreparedStatement)
(7)执行SQL: 执行SQL: update语句
(8)打印返回值
(9)异常处理
(10)关闭操作的相关资源
2.实例
本例修改一条数据。
/**
* 改
* 1. java.sql.Connection
* 2. java.sql.DriverManager
* 3. java.sql.PreparedStatement,函数executeUpdate()
*/
public static void f3() {
// 1.获取数据库连接信息
DatabaseInfo dbInfo = new DatabaseInfo();
String username = dbInfo.getUsername();
String password = dbInfo.getPassword();
String jdbcUrl = dbInfo.getJdbcUrl();
String driverName = dbInfo.getDriverName();
Connection conn = null;
PreparedStatement pStatement = null;
try{
// 2.加载驱动
Class.forName(driverName);
// 3.获取数据库连接
conn = DriverManager.getConnection(jdbcUrl, username, password);
// 4.获取修改SQL
String sql = getUpdateSql01();
// 5.组装修改参数
Object[] args = new Object[]{"杭州是互联网城市", "2022-08-07 11:18:57", "杭州", "1"};
// 6.创建PreparedStatement与设置入参
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, args[0]);
pStatement.setObject(2, args[1]);
pStatement.setObject(3, args[2]);
pStatement.setObject(4, args[3]);
// 7.执行SQL: update语句
int rows = pStatement.executeUpdate();
// 8.打印返回值
System.out.println("rows = " + rows);
}catch (Exception e){
// 9.异常处理
closePreparedStatement(pStatement);
closeConnection(conn);
e.printStackTrace();
}finally {
// 10.相关操作关闭
closePreparedStatement(pStatement);
closeConnection(conn);
}
}
/**
* 1.update语句,修改数据
* 2.入参带修改数据
*/
public static String getUpdateSql01() {
String sql = "UPDATE t_city\n" +
"SET CITY_DESCRIBE = ?,UPDATE_TIME = ?\n" +
"WHERE CITY_NAME = ? AND ID = ? ";
return sql.toString();
}
四、删
删,即使用Java原生JDBC对数据库的数据做删除操作。
SQL关键字:delete。
1.步骤
(1)获取数据库连接信息
(2)加载驱动(com.mysql.cj.jdbc.Driver)
(3)获取数据库连接(java.sql.Connection)
(4)获取删除SQL
(5)组装删除条件参数
(6)创建PreparedStatement与设置入参(java.sql.PreparedStatement)
(7)执行SQL: 执行SQL: delete语句
(8)打印返回值
(9)异常处理
(10)关闭操作的相关资源
2.实例
本例删除一条数据。
/**
* 删
* 1. java.sql.Connection
* 2. java.sql.DriverManager
* 3. java.sql.PreparedStatement,函数executeUpdate()
*/
public static void f4() {
// 1.获取数据库连接信息
DatabaseInfo dbInfo = new DatabaseInfo();
String username = dbInfo.getUsername();
String password = dbInfo.getPassword();
String jdbcUrl = dbInfo.getJdbcUrl();
String driverName = dbInfo.getDriverName();
Connection conn = null;
PreparedStatement pStatement = null;
try{
// 2.加载驱动
Class.forName(driverName);
// 3.获取数据库连接
conn = DriverManager.getConnection(jdbcUrl, username, password);
// 4.获取删除SQL
String sql = getDeleteSql01();
// 5.组装删除条件参数
Object[] args = new Object[]{"杭州", "1"};
// 6.创建PreparedStatement与设置入参
pStatement = conn.prepareStatement(sql);
pStatement.setObject(1, args[0]);
pStatement.setObject(2, args[1]);
// 7.执行SQL: delete语句
int rows = pStatement.executeUpdate();
// 8.打印返回值
System.out.println("rows = " + rows);
}catch (Exception e){
// 9.异常处理
closePreparedStatement(pStatement);
closeConnection(conn);
e.printStackTrace();
}finally {
// 10.相关操作关闭
closePreparedStatement(pStatement);
closeConnection(conn);
}
}
/**
* 1.delete语句,删除数据
* 2.入参带删除条件
*/
public static String getDeleteSql01() {
String sql = "DELETE FROM t_city WHERE CITY_NAME = ? AND ID = ?";
return sql.toString();
}
五、共用函数
本例的查增改查,都会需要数据源信息和关闭资源操作。
1.数据源对象
数据源对象参数,本例只给出必须的4个,其它按需添加。
@Data
private static class DatabaseInfo {
private String username = "***填写自定义***";
private String password = "***填写自定义***";
private String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/***填写自定义***";
private String driverName = "com.mysql.cj.jdbc.Driver";
}
2.关闭资源操作
对数据库操作,对于资源类的操作,使用完毕后需手动关闭。当使用框架时,基本上不用手动关闭,而是框架会帮助关闭,比如使用org.springframework.jdbc.core.JdbcTemplate时,springframework框架自动做此事。本例是使用Java原生JDBC操作数据库,因此手动关闭是必须的而且优雅的。
/**
* 关闭资源: ResultSet
* */
public static void closeResultSet(@Nullable ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException var2) {
var2.printStackTrace();
}
}
}
/**
* 关闭资源: Connection
* */
public static void closeConnection(@Nullable Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭资源: PreparedStatement
* */
public static void closePreparedStatement(@Nullable PreparedStatement pStatement) {
if (pStatement != null) {
try {
pStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
六、支撑
针对本例使用Java原生JDBC对数据库的数据做查增改删操作,使用到的建表语句和数据初始化语句。
1.建表语句
建表语句,主键使用了MySQL的自增功能,即插入一条数据,可以不用赋值,但是赋值的话需判断不重复即可。
CREATE TABLE t_city (
ID BIGINT(16) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
CITY_NAME VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名',
LAND_AREA DOUBLE DEFAULT NULL COMMENT '城市面积',
POPULATION BIGINT(16) DEFAULT NULL COMMENT '城市人口',
GROSS DOUBLE DEFAULT NULL COMMENT '生产总值',
CITY_DESCRIBE VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述',
DATA_YEAR VARCHAR(16) COLLATE utf8_bin DEFAULT NULL COMMENT '数据年份',
UPDATE_TIME DATETIME DEFAULT NULL COMMENT '更新时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市信息表';
2.插入语句
插入语句,插入数据便于验证查询、更新、删除功能。
INSERT INTO t_city (
ID,CITY_NAME,LAND_AREA,POPULATION,
GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME)
VALUES
('1','杭州','16850','1200','1.61','杭州是一个好城市','2020','2022-08-07 11:39:32'),
('2','杭州','16850','1200','1.81','杭州是一个好城市','2021','2022-08-07 11:39:33');
以上,感谢。
2022年8月7日