• 使用PrepareStatement实现插入数据、查询数据、ResultSet和ResultSetMetaData及资源释放


    目录

    一、使用PrepareStatement实现插入数据的操作

    二、使用PrepareStatement实现查询数据的操作

    三、ResultSet和ResultSetMetaData

    ResultSet:

    ResultSetMetaData:

    四、资源释放


    一、使用PrepareStatement实现插入数据的操作

    1. public class PreparedStatementUpdateTest {
    2. @Test
    3. public void testInsert() {
    4. Connection connection = null;
    5. PreparedStatement ps = null;
    6. try {
    7. //1.获取链接
    8. connection = JDBCUtils.getConnection();
    9. //2.预编译sql语句,返回PreparedStatement实例
    10. String sql = "insert into customers(name,email,birth)
    11. value(?,?,?)";
    12. ps = connection.prepareStatement(sql);
    13. //3.填充占位符
    14. ps.setString(1,"哪吒");
    15. ps.setString(2,"nezha@gmail.com");
    16. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    17. java.util.Date parse = sdf.parse("2001-03-21");
    18. long time = parse.getTime();
    19. //这个Date是sql中的Date
    20. ps.setDate(3,new Date(time));
    21. //4.执行操作
    22. ps.execute();
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }
    26. //5.资源释放
    27. JDBCUtils.closeConnection(connection,ps);
    28. }
    29. }

    二、使用PrepareStatement实现查询数据的操作

    1. public class CustomerForQuery {
    2. public Customer commonQueryForCustomer(String sql,Object ...obj){
    3. Connection conn = null;
    4. PreparedStatement ps = null;
    5. ResultSet resultSet = null;
    6. try {
    7. //1.获取连接
    8. conn = JDBCUtils.getConnection();
    9. //2.预编译sql语句,返回PreparedStatement实例
    10. ps = conn.prepareStatement(sql);
    11. //3.填充占位符
    12. for (int i = 0; i < obj.length; i++) {
    13. ps.setObject(i+1,obj[i]);
    14. }
    15. //4.执行查询操作
    16. resultSet = ps.executeQuery();
    17. //5.获取描述结果集的对象
    18. ResultSetMetaData metaData = resultSet.getMetaData();
    19. int columnCount = metaData.getColumnCount();
    20. //6.处理结果集
    21. if(resultSet.next()){
    22. Customer customer = new Customer();
    23. for (int i = 0; i < columnCount; i++) {
    24. Object object = resultSet.getObject(i + 1);
    25. String columnName = metaData.getColumnName(i + 1);
    26. Field declaredField =
    27. Customer.class.getDeclaredField(columnName);
    28. declaredField.setAccessible(true);
    29. declaredField.set(customer,object);
    30. }
    31. return customer;
    32. }
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }finally {
    36. //7.关闭资源
    37. JDBCUtils.closeConnection(conn,ps,resultSet);
    38. }
    39. return null;
    40. }
    41. @Test
    42. public void test(){
    43. String sql = "select name,email from customers where id=?";
    44. Customer customer = commonQueryForCustomer(sql, 2);
    45. System.out.println(customer);
    46. }
    47. }

    用到的bean类:

    1. public class Customer {
    2. private int id;
    3. private String name;
    4. private String email;
    5. private Date birth;
    6. public Customer() {
    7. }
    8. public Customer(int id, String name, String email, Date birth) {
    9. this.id = id;
    10. this.name = name;
    11. this.email = email;
    12. this.birth = birth;
    13. }
    14. public int getId() {
    15. return id;
    16. }
    17. public void setId(int id) {
    18. this.id = id;
    19. }
    20. public String getName() {
    21. return name;
    22. }
    23. public void setName(String name) {
    24. this.name = name;
    25. }
    26. public String getEmail() {
    27. return email;
    28. }
    29. public void setEmail(String email) {
    30. this.email = email;
    31. }
    32. public Date getBirth() {
    33. return birth;
    34. }
    35. public void setBirth(Date birth) {
    36. this.birth = birth;
    37. }
    38. @Override
    39. public String toString() {
    40. return "Customer{" +
    41. "id=" + id +
    42. ", name='" + name + '\'' +
    43. ", email='" + email + '\'' +
    44. ", birth=" + birth +
    45. '}';
    46. }
    47. }

    三、ResultSet和ResultSetMetaData

    ResultSet:

    ● 查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
    ● ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现

    ● ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通
    过 ResultSet 对象 的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有
    效,该方法返回 true,且指针下移。 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每
    一列的值。 例如: getInt(1), getString("name")
    注意:Java与数据库交互涉及到的相关Java API中的索引都从1开始

    ResultSetMetaData:

    ◆ 可用于获取关于ResultSet对象中列的类型和属性信息的对象
    ◆ 通过ResultSet的getMetaData()方法获取
    ◆ 常用方法
            getColumnName(int column)方法,获取指定列的名称
            getColumnLabel(int column)方法,获取指定列的别名,如果不指定别名则返回名称
            getColumnCount()方法,返回当前 ResultSet 对象中的列数

    四、资源释放

    ● 释放ResultSet, Statement,Connection。
    ● 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机
    ● Connection的使用原则是尽量晚创建,尽量早的释放。 可以在finally中关闭,保证及时其他代码出现异常,资源也一定能被关闭。

     

  • 相关阅读:
    WMS仓储条码管理系统集成ERP的解决方案
    万物皆可集成系列:低代码释放用友深度价值(1)—系统对接集成
    Spring Data MongoDB SpEL表达式注入漏洞(CVE-2022-22980)分析与利用
    Dom4J解析XML、Xpath检索XML
    解决CondaHTTPError HTTP 000 CONNECTION FAILED for url解决方法
    SQL group by、where和having语句用法
    大模型下一场战事,为什么是AI Agent?
    第28章_瑞萨MCU零基础入门系列教程之基于面向对象的工程结构
    使用C语言+USRP B210从零开始实现无线通信(3) DASK差分幅度键控调制
    react-intl国际化在项目中的使用
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/126931897