记录: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
(9)异常处理
(10)关闭操作的相关资源
2.实例
本例查询一条数据并把结果集封装为List
- /**
- * 查
- * 1. java.sql.Connection
- * 2. java.sql.DriverManager
- * 3. java.sql.PreparedStatement,函数executeQuery()
- * 4. java.sql.ResultSet
- */
- public static List
-
- // 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
- 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
- result = new ArrayList<>();
- while (resultSet.next()) {
- ResultSetMetaData rsmd = resultSet.getMetaData();
- int columnCount = rsmd.getColumnCount();
- Map
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日