博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】使用注解和反射实现通用性…
阅读量:5146 次
发布时间:2019-06-13

本文共 5088 字,大约阅读时间需要 16 分钟。

本文出处:
接着上篇:

3,得到connection 之后就可以使用它来获取PreparedStatement,然后执行 SQL 语句,请看下面的代码;

public class CoreDao {

 

      // 定义数据库的链接

      private Connection conn;

      // 定义sql语句的执行对象

      private PreparedStatement pstmt;

      // 定义查询返回的结果集合

      private ResultSet resultSet;

 

 

      public void list() {

            conn = DBConnUtils.getConnection();

            String sql = "select * from user";

            try {

                  //  预编译 SQL 语句

                  pstmt = conn.prepareStatement(sql);

                  //  执行查询

                  resultSet = pstmt.executeQuery();

                  while (resultSet.next()) {

                        System.out.println("username = " + resultSet.getString("username"

                                    + ", birth = " + resultSet.getDate("birth"

                                    + ", detail_time = " + resultSet.getDate("detail_time"));

                  }

            } catch (SQLException e) {

                  e.printStackTrace();

            }

      }

    

      

      public static void main(String[] args) {

            new CoreDao().list();

      }

}

运行 main 方法,看到如下打印信息;

可以看到代码正确获取到数据库的数据库;

 

4关闭数据库链接释放资源

         有经验的开发者一眼就能看出上述代码的问题了!!!不知道你是否也发现了呢?代码并没有关闭 connection 释放资源。如果不释放并且随着访问量的增加 connection 会越来越多,导致服务器内存被占满,出现内存溢出问题!!所以记得一定要关闭数据库连接。

public void list() {

            conn = DBConnUtils.getConnection();

            String sql = "select * from user";

            try {

                  //…… 代码同上,不在列出

            } catch (SQLException e) {

                  e.printStackTrace();

            } finally {  //关闭数据库连接释放资源

                  try {

                     if (null != pstmt) {

                          pstmt.close();

                     }

               } catch (SQLException e) {

                     e.printStackTrace();

               }

               try {

                     if (null != pstmt) {

                          conn.close();

                     }

               } catch (SQLException e) {

                     e.printStackTrace();

               }

            }

      }

 

最后给出完成的增上改查的代码示例;

package com.ubuntuvim.core;

 

public class CoreDao {

 

      // 定义数据库的链接

      private Connection conn;

      // 定义sql语句的执行对象

      private PreparedStatement pstmt;

      // 定义查询返回的结果集合

      private ResultSet resultSet;

      

      private int commId = 35;

 

      

      //  新增数据

      @Test

      public void add() {

            conn = DBConnUtils.getConnection();

            String sql = " insert into user(id, username, birth) values(?, ?, ?)";

            try {

                  //  预编译 SQL 语句

                  pstmt = conn.prepareStatement(sql);

                  pstmt.setInt(1, commId);  //为了方便测试直接指定了 id,实际使用中通常不需要指定 id,默认设置为自增类型即可

                  pstmt.setString(2, "新增测试");  //1表示 SQL 语句中的第一个问号

                  pstmt.setDate(3, new Date(System.currentTimeMillis()));

                  //  执行SQL

                  int i = pstmt.executeUpdate();

                  // 提交事务

                  conn.commit();

                  if (i > 0)

                        System.out.println(新增成功...");

            } catch (SQLException e) {

                  e.printStackTrace();

                  // 出错回滚事务

                  try {

                        conn.rollback();

                  } catch (SQLException e1) {

                        e1.printStackTrace();

                  }

            } finally {  //关闭数据库连接释放资源

                  try {

                        if (null != pstmt) {

                              pstmt.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

                  try {

                        if (null != pstmt) {

                              conn.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

            }

      }

 

      //  测试查询

      public void list() {

            

            conn = DBConnUtils.getConnection();

            String sql = "select * from user";

            try {

                  //  预编译 SQL 语句

                  pstmt = conn.prepareStatement(sql);

                  //  执行查询

                  resultSet = pstmt.executeQuery();

                  while (resultSet.next()) {

                        

                        System.out.println("id = " + resultSet.getInt("id") + ", username = " + resultSet.getString("username"

                                    + ", birth = " + resultSet.getDate("birth"

                                    + ", detail_time = " + resultSet.getObject("detail_time"));

                  }

            } catch (SQLException e) {

                  e.printStackTrace();

            } finally {  //关闭数据库连接释放资源

                  try {

                        if (null != pstmt) {

                              pstmt.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

                  try {

                        if (null != pstmt) {

                              conn.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

            }

      }

      

      //  测试更新

      public void update() {

            conn = DBConnUtils.getConnection();

            String sql = " update user set username = ? where id = ?";

            try {

                  //  预编译 SQL 语句

                  pstmt = conn.prepareStatement(sql);

                  pstmt.setString(1, "update_test"); //

                  pstmt.setInt(2, commId);  //

                  //  执行更新

                  int i = pstmt.executeUpdate();

                  if (i > 0)

                        System.out.println(更新成功...");

                  

                  //记得要提交

                  conn.commit();

            } catch (SQLException e) {

                  e.printStackTrace();

                  //  如果更新出错,执行回滚

                  try {

                        conn.rollback();

                  } catch (SQLException e1) {

                        e1.printStackTrace();

                  }

            } finally {  //关闭数据库连接释放资源

                  try {

                        if (null != pstmt) {

                              pstmt.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

                  try {

                        if (null != pstmt) {

                              conn.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

            }

      }

      

      //  测试删除,删除的代码与更新的代码基本是一样的,

      //  只是 SQL 的不同而已,所以可以把更新和删除合并为一个方法,

      //  会在后续的文章实现合并

      public void del() {

            conn = DBConnUtils.getConnection();

            String sql = "  delete from user where id = ?";

            try {

                  //  预编译 SQL 语句

                  pstmt = conn.prepareStatement(sql);

                  pstmt.setInt(1, commId);  //删除 id 35的数据

                  //  执行更新

                  int i = pstmt.executeUpdate();

                  if (i > 0)

                        System.out.println(删除成功...");

                  

                  //记得要提交

                  conn.commit();

            } catch (SQLException e) {

                  e.printStackTrace();

                  //  如果更新出错,执行回滚

                  try {

                        conn.rollback();

                  } catch (SQLException e1) {

                        e1.printStackTrace();

                  }

            } finally {  //关闭数据库连接释放资源

                  try {

                        if (null != pstmt) {

                              pstmt.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

                  try {

                        if (null != pstmt) {

                              conn.close();

                        }

                  } catch (SQLException e) {

                        e.printStackTrace();

                  }

            }

      }

    

      

      public static void main(String[] args) {

            new CoreDao().list();

            new CoreDao().add();

            new CoreDao().list();

            new CoreDao().update();

            new CoreDao().list();

            new CoreDao().del();

            new CoreDao().list();

      }

}

 

 【转载】使用注解和反射实现通用性的 <wbr>jdbc操作数据库之最简单的 <wbr>jdbc <wbr>操作_2

到此相信你已经学会最简单的 jdbc 操作数据了。对数据库的操作基本上都是在增删改查的基本上添加复杂的业务逻辑。当然,使用 jdbc 也可调用存储过程,但是本系列文章暂时不讨论,本系列文章主要讲讲怎么从简单的 jdbc 一步步提升为基于注解的通用性 jdbc 操作。

      最终想达到的目标是:

1.   查询能返回 list  model对象数组

2.   新增方法只需要传入 model对象即可

3.   不需要手动一个个写 getter/setter,sptmt.setXxx()

4.   怎么使用 java 注解并解析定义的注解(仿照 java 的 Persistence 类)

如果需要完成的项目请从我的 github 空间上下载,网址为:

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/ubuntuvim/p/4796526.html

你可能感兴趣的文章
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
ios应用版本号设置规则
查看>>