• 基于Spring Boot应用Java原生JDBC操作数据库(查增改删)


    记录:290

    场景:基于Spring Boot应用Java原生JDBC操作数据库。包括查、增、改、删操作。对应SQL关键字是select、insert into、update、delete。

    版本:

    1. JDK 1.8
    2. MySQL 5.7.33
    3. Spring Boot 2.6.3
    4. Spring Framework 5.3.15

    名词:

    JDBC:即Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。

    操作类:

    1. java.sql.Connection
    2. java.sql.DriverManager
    3. java.sql.PreparedStatement
    4. java.sql.ResultSet
    5. java.lang.Class
    6. 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>,(java.sql.ResultSet)

    (9)异常处理

    (10)关闭操作的相关资源

    2.实例

    本例查询一条数据并把结果集封装为List>。

    1. /**
    2. * 查
    3. * 1. java.sql.Connection
    4. * 2. java.sql.DriverManager
    5. * 3. java.sql.PreparedStatement,函数executeQuery()
    6. * 4. java.sql.ResultSet
    7. */
    8. public static List> f1() {
    9. // 1.获取数据库连接信息
    10. DatabaseInfo dbInfo = new DatabaseInfo();
    11. String username = dbInfo.getUsername();
    12. String password = dbInfo.getPassword();
    13. String jdbcUrl = dbInfo.getJdbcUrl();
    14. String driverName = dbInfo.getDriverName();
    15. Connection conn = null;
    16. PreparedStatement pStatement = null;
    17. List> result = null;
    18. ResultSet resultSet = null;
    19. try {
    20. // 2.加载驱动
    21. Class.forName(driverName);
    22. // 3.获取数据库连接
    23. conn = DriverManager.getConnection(jdbcUrl, username, password);
    24. // 4.获取查询SQL
    25. String sql = getSelectSql01();
    26. // 5.获取查询条件参数
    27. Object[] args = new Object[]{"杭州", "1"};
    28. // 6.创建PreparedStatement与设置入参
    29. pStatement = conn.prepareStatement(sql);
    30. pStatement.setObject(1, args[0]);
    31. pStatement.setObject(2, args[1]);
    32. // 7.执行SQL: select语句与获取结果集
    33. resultSet = pStatement.executeQuery();
    34. // 8.遍历ResultSet和封装成List>
    35. result = new ArrayList<>();
    36. while (resultSet.next()) {
    37. ResultSetMetaData rsmd = resultSet.getMetaData();
    38. int columnCount = rsmd.getColumnCount();
    39. Map oneRow = new HashMap<>();
    40. for (int i = 1; i < columnCount + 1; i++) {
    41. String columnName = rsmd.getColumnName(i);
    42. oneRow.put(columnName, resultSet.getObject(columnName));
    43. }
    44. result.add(oneRow);
    45. }
    46. } catch (Exception e) {
    47. // 9.异常处理
    48. closeResultSet(resultSet);
    49. closePreparedStatement(pStatement);
    50. closeConnection(conn);
    51. e.printStackTrace();
    52. } finally {
    53. // 10.相关操作关闭
    54. closeResultSet(resultSet);
    55. closePreparedStatement(pStatement);
    56. closeConnection(conn);
    57. }
    58. return result;
    59. }
    60. /**
    61. * 1.select语句
    62. * 2.入参带查询条件
    63. */
    64. public static String getSelectSql01() {
    65. String sql01 = "SELECT\n" +
    66. " ID,CITY_NAME,LAND_AREA,POPULATION,GROSS,\n" +
    67. " CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME\n" +
    68. "FROM t_city " +
    69. "WHERE CITY_NAME = ? AND ID =? ";
    70. return sql01.toString();
    71. }

    二、增

    增,即使用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. /**
    2. * 增
    3. * 1. java.sql.Connection
    4. * 2. java.sql.DriverManager
    5. * 3. java.sql.PreparedStatement,函数executeUpdate()
    6. */
    7. public static void f2() {
    8. // 1.获取数据库连接信息
    9. DatabaseInfo dbInfo = new DatabaseInfo();
    10. String username = dbInfo.getUsername();
    11. String password = dbInfo.getPassword();
    12. String jdbcUrl = dbInfo.getJdbcUrl();
    13. String driverName = dbInfo.getDriverName();
    14. Connection conn = null;
    15. PreparedStatement pStatement = null;
    16. try{
    17. // 2.加载驱动
    18. Class.forName(driverName);
    19. // 3.获取数据库连接
    20. conn = DriverManager.getConnection(jdbcUrl, username, password);
    21. // 4.获取插入SQL
    22. String sql = getInsertSql01();
    23. // 5.组装插入参数
    24. Object[] args = new Object[]{
    25. "杭州", "16850", "1200", "1.81",
    26. "杭州是一个好城市", "2021", "2022-08-07 11:16:18"
    27. };
    28. // 6.创建PreparedStatement与设置入参
    29. pStatement = conn.prepareStatement(sql);
    30. pStatement.setObject(1, args[0]);
    31. pStatement.setObject(2, args[1]);
    32. pStatement.setObject(3, args[2]);
    33. pStatement.setObject(4, args[3]);
    34. pStatement.setObject(5, args[4]);
    35. pStatement.setObject(6, args[5]);
    36. pStatement.setObject(7, args[6]);
    37. // 7.执行SQL: insert语句和返回行数
    38. int rows = pStatement.executeUpdate();
    39. // 8.打印返回值
    40. System.out.println("rows = " + rows);
    41. }catch (Exception e){
    42. // 9.异常处理
    43. closePreparedStatement(pStatement);
    44. closeConnection(conn);
    45. e.printStackTrace();
    46. }finally {
    47. // 10.相关操作关闭
    48. closePreparedStatement(pStatement);
    49. closeConnection(conn);
    50. }
    51. }
    52. /**
    53. * 1.insert语句,插入数据
    54. * 2.入参带插入数据
    55. */
    56. public static String getInsertSql01() {
    57. String sql01 = "INSERT INTO t_city (\n" +
    58. " CITY_NAME,LAND_AREA,POPULATION,\n" +
    59. " GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME\n" +
    60. ")\n" +
    61. "VALUES (?, ?, ?, ?, ?, ?, ?)";
    62. return sql01.toString();
    63. }

    三、改

    改,即使用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. /**
    2. * 改
    3. * 1. java.sql.Connection
    4. * 2. java.sql.DriverManager
    5. * 3. java.sql.PreparedStatement,函数executeUpdate()
    6. */
    7. public static void f3() {
    8. // 1.获取数据库连接信息
    9. DatabaseInfo dbInfo = new DatabaseInfo();
    10. String username = dbInfo.getUsername();
    11. String password = dbInfo.getPassword();
    12. String jdbcUrl = dbInfo.getJdbcUrl();
    13. String driverName = dbInfo.getDriverName();
    14. Connection conn = null;
    15. PreparedStatement pStatement = null;
    16. try{
    17. // 2.加载驱动
    18. Class.forName(driverName);
    19. // 3.获取数据库连接
    20. conn = DriverManager.getConnection(jdbcUrl, username, password);
    21. // 4.获取修改SQL
    22. String sql = getUpdateSql01();
    23. // 5.组装修改参数
    24. Object[] args = new Object[]{"杭州是互联网城市", "2022-08-07 11:18:57", "杭州", "1"};
    25. // 6.创建PreparedStatement与设置入参
    26. pStatement = conn.prepareStatement(sql);
    27. pStatement.setObject(1, args[0]);
    28. pStatement.setObject(2, args[1]);
    29. pStatement.setObject(3, args[2]);
    30. pStatement.setObject(4, args[3]);
    31. // 7.执行SQL: update语句
    32. int rows = pStatement.executeUpdate();
    33. // 8.打印返回值
    34. System.out.println("rows = " + rows);
    35. }catch (Exception e){
    36. // 9.异常处理
    37. closePreparedStatement(pStatement);
    38. closeConnection(conn);
    39. e.printStackTrace();
    40. }finally {
    41. // 10.相关操作关闭
    42. closePreparedStatement(pStatement);
    43. closeConnection(conn);
    44. }
    45. }
    46. /**
    47. * 1.update语句,修改数据
    48. * 2.入参带修改数据
    49. */
    50. public static String getUpdateSql01() {
    51. String sql = "UPDATE t_city\n" +
    52. "SET CITY_DESCRIBE = ?,UPDATE_TIME = ?\n" +
    53. "WHERE CITY_NAME = ? AND ID = ? ";
    54. return sql.toString();
    55. }

    四、删

    删,即使用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. /**
    2. * 删
    3. * 1. java.sql.Connection
    4. * 2. java.sql.DriverManager
    5. * 3. java.sql.PreparedStatement,函数executeUpdate()
    6. */
    7. public static void f4() {
    8. // 1.获取数据库连接信息
    9. DatabaseInfo dbInfo = new DatabaseInfo();
    10. String username = dbInfo.getUsername();
    11. String password = dbInfo.getPassword();
    12. String jdbcUrl = dbInfo.getJdbcUrl();
    13. String driverName = dbInfo.getDriverName();
    14. Connection conn = null;
    15. PreparedStatement pStatement = null;
    16. try{
    17. // 2.加载驱动
    18. Class.forName(driverName);
    19. // 3.获取数据库连接
    20. conn = DriverManager.getConnection(jdbcUrl, username, password);
    21. // 4.获取删除SQL
    22. String sql = getDeleteSql01();
    23. // 5.组装删除条件参数
    24. Object[] args = new Object[]{"杭州", "1"};
    25. // 6.创建PreparedStatement与设置入参
    26. pStatement = conn.prepareStatement(sql);
    27. pStatement.setObject(1, args[0]);
    28. pStatement.setObject(2, args[1]);
    29. // 7.执行SQL: delete语句
    30. int rows = pStatement.executeUpdate();
    31. // 8.打印返回值
    32. System.out.println("rows = " + rows);
    33. }catch (Exception e){
    34. // 9.异常处理
    35. closePreparedStatement(pStatement);
    36. closeConnection(conn);
    37. e.printStackTrace();
    38. }finally {
    39. // 10.相关操作关闭
    40. closePreparedStatement(pStatement);
    41. closeConnection(conn);
    42. }
    43. }
    44. /**
    45. * 1.delete语句,删除数据
    46. * 2.入参带删除条件
    47. */
    48. public static String getDeleteSql01() {
    49. String sql = "DELETE FROM t_city WHERE CITY_NAME = ? AND ID = ?";
    50. return sql.toString();
    51. }

    五、共用函数

    本例的查增改查,都会需要数据源信息和关闭资源操作。

    1.数据源对象

    数据源对象参数,本例只给出必须的4个,其它按需添加。

    1. @Data
    2. private static class DatabaseInfo {
    3. private String username = "***填写自定义***";
    4. private String password = "***填写自定义***";
    5. private String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/***填写自定义***";
    6. private String driverName = "com.mysql.cj.jdbc.Driver";
    7. }

    2.关闭资源操作

    对数据库操作,对于资源类的操作,使用完毕后需手动关闭。当使用框架时,基本上不用手动关闭,而是框架会帮助关闭,比如使用org.springframework.jdbc.core.JdbcTemplate时,springframework框架自动做此事。本例是使用Java原生JDBC操作数据库,因此手动关闭是必须的而且优雅的。

    1. /**
    2. * 关闭资源: ResultSet
    3. * */
    4. public static void closeResultSet(@Nullable ResultSet rs) {
    5. if (rs != null) {
    6. try {
    7. rs.close();
    8. } catch (SQLException var2) {
    9. var2.printStackTrace();
    10. }
    11. }
    12. }
    13. /**
    14. * 关闭资源: Connection
    15. * */
    16. public static void closeConnection(@Nullable Connection conn) {
    17. if (conn != null) {
    18. try {
    19. conn.close();
    20. } catch (SQLException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. }
    25. /**
    26. * 关闭资源: PreparedStatement
    27. * */
    28. public static void closePreparedStatement(@Nullable PreparedStatement pStatement) {
    29. if (pStatement != null) {
    30. try {
    31. pStatement.close();
    32. } catch (SQLException e) {
    33. e.printStackTrace();
    34. }
    35. }
    36. }

    六、支撑

    针对本例使用Java原生JDBC对数据库的数据做查增改删操作,使用到的建表语句和数据初始化语句。

    1.建表语句

    建表语句,主键使用了MySQL的自增功能,即插入一条数据,可以不用赋值,但是赋值的话需判断不重复即可。

    1. CREATE TABLE t_city (
    2. ID BIGINT(16) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    3. CITY_NAME VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名',
    4. LAND_AREA DOUBLE DEFAULT NULL COMMENT '城市面积',
    5. POPULATION BIGINT(16) DEFAULT NULL COMMENT '城市人口',
    6. GROSS DOUBLE DEFAULT NULL COMMENT '生产总值',
    7. CITY_DESCRIBE VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述',
    8. DATA_YEAR VARCHAR(16) COLLATE utf8_bin DEFAULT NULL COMMENT '数据年份',
    9. UPDATE_TIME DATETIME DEFAULT NULL COMMENT '更新时间'
    10. ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市信息表';

    2.插入语句

    插入语句,插入数据便于验证查询、更新、删除功能。

    1. INSERT INTO t_city (
    2. ID,CITY_NAME,LAND_AREA,POPULATION,
    3. GROSS,CITY_DESCRIBE,DATA_YEAR,UPDATE_TIME)
    4. VALUES
    5. ('1','杭州','16850','1200','1.61','杭州是一个好城市','2020','2022-08-07 11:39:32'),
    6. ('2','杭州','16850','1200','1.81','杭州是一个好城市','2021','2022-08-07 11:39:33');

    以上,感谢。

    2022年8月7日

  • 相关阅读:
    科技连接美好未来 | 美格智能5G FWA解决方案持续推进
    AI项目十三:PaddleOCR训练自定义数据集
    java IO流面试总结
    英语简单句
    prometheus Histogram 统计原理
    局域网靶机渗透操作指南
    计算机网络题库--第五单元传输层
    洋码头API接口
    JSON是什么文件
    Python 教程之从头开始构建个人助理,如何在 Python 中构建概念验证个人助理:意图分类、语音到文本和文本到语音(教程含源码)
  • 原文地址:https://blog.csdn.net/zhangbeizhen18/article/details/126209113