免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3824 | 回复: 7
打印 上一主题 下一主题

帮看下我自己封装了个JDBC的通用查询,更新函数有没有什么问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-16 19:34 |只看该作者 |倒序浏览
函数功能实现通用的增删改查,这个是第一版,还需要加的功能很多,希望把问题在萌芽阶段就找出来。

  1. public class DBJdbcRunners {
  2.         private static Log log = LogFactory.getLog(DBJdbcRunners.class);
  3.         private boolean autoCommit;
  4.     Connection connection = null;
  5.        
  6.     public DBJdbcRunners()throws SQLException{
  7.             autoCommit = true;
  8.             try {
  9.                      connection = DBUtils.getConnection();
  10.                 } catch (SQLException e) {
  11.                          throw new SQLException();
  12.                 }
  13.     }
  14.     public void begintx()throws SQLException{
  15.             autoCommit = false;
  16.             if (connection != null){
  17.                     try {
  18.                     connection.setAutoCommit(false);
  19.                     } catch (SQLException e) {
  20.                             throw new SQLException();
  21.                    }
  22.       }
  23.     }
  24.     public void committx()throws SQLException{
  25.             autoCommit = false;
  26.             if (connection != null){
  27.                     try {
  28.                     connection.commit();
  29.                     connection.setAutoCommit(true);
  30.                     autoCommit = true;
  31.                     } catch (SQLException e) {
  32.                      log.equals("committx exception is ->["+e+"]");
  33.                             throw new SQLException();
  34.                    }finally{
  35.                             DBUtils.closeConnection(connection);
  36.             }
  37.       }
  38.     }

  39.           public int executeUpdate (String sql) throws SQLException,
  40.                  InputIllegalException
  41.           {
  42.                Statement statement = null;               
  43.               try
  44.               {
  45.        
  46.                   statement = connection.createStatement();
  47.                  int i = statement.executeUpdate(sql);
  48.                                 return i;
  49.            }catch( SQLException e){
  50.                    log.error("error sql is-->["+sql+"]");
  51.                    log.error(e);
  52.                    if(!autoCommit){
  53.                    try{
  54.                    connection.rollback();
  55.                    }catch(SQLException ex){
  56.                            log.error(ex);
  57.                    }
  58.                 }
  59.           throw new SQLException();
  60.            }
  61.            finally{
  62.                       DBUtils.closeStatement(statement);
  63.                    if(autoCommit){
  64.               DBUtils.closeConnection(connection);
  65.               }
  66.            }
  67.           }
  68.           

  69.   public  void executeQuery (
  70.                   String sql,boolean isgetTotalNum)
  71.           throws SQLException,InputIllegalException{
  72.           
  73.        Statement statement = null;
  74.        PreparedStatement p_statement = null;
  75.        ResultSet rs = null;
  76.        if(sql == null){
  77.                throw new InputIllegalException("in executeQuery function" +
  78.                                "sql is null");
  79.        }
  80.        try{
  81.                if(isgetTotalNum){
  82.                        statement = connection.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,  
  83.                            ResultSet.CONCUR_READ_ONLY);
  84.                }else{
  85.                statement = connection.createStatement();
  86.                }
  87.                rs = statement.executeQuery(sql);
  88.                if(isgetTotalNum){
  89.                        rs.last();
  90.                        log.debug("total row num is-->["+rs.getRow()+"]");
  91.                        rs.first();
  92.                }
  93.                ResultSetMetaData rsmd = rs.getMetaData();
  94.                int numCols = rsmd.getColumnCount();
  95.                log.debug("column num is-->["+rsmd.getColumnCount()+"]");
  96.               
  97.                while(rs.next()){
  98.                        for(int i=1;i<=numCols;i++){
  99.                                System.out.print("column "+i+" is-->["+rs.getString(i)+"]");
  100.                        }
  101.                        System.out.print("\n");
  102.                }
  103.            }catch( SQLException e){
  104.                    log.error("error sql is-->["+sql+"]");
  105.                    log.error("[ex in executeQuery function]-->["+e+"]");
  106.                    if(!autoCommit){
  107.                      try{
  108.                             if(log.isDebugEnabled()){
  109.                                log.debug("[in executeQuery function rollback]");
  110.                          }
  111.                        connection.rollback();
  112.                      }catch(SQLException ex){
  113.                            log.error(ex);
  114.                      }
  115.                    }
  116.           throw new SQLException();
  117.            }
  118.            finally{
  119.                           DBUtils.closeResultSet(rs);
  120.                       DBUtils.closeStatement(statement);
  121.                       if(autoCommit){
  122.                    DBUtils.closeConnection(connection);
  123.                   }
  124.            }
  125.           
  126.   }
复制代码

DBJdbcRunners.rar

1.37 KB, 下载次数: 75

代码

论坛徽章:
0
2 [报告]
发表于 2006-09-16 19:39 |只看该作者

我的调用方式如下。


  1. public class testDBQuery {
  2. private static Log log = LogFactory.getLog(testDBQuery.class);
  3. public static void main(String[] args) {       
  4. DBJdbcRunners query = null;       
  5. try {        query.begintx();       
  6. query.executeUpdate("insert into user (id,name) values(9001,'wgm')");       
  7. query.executeQuery("select id, name from user order by id",true);       
  8. query.committx();
  9. } catch (Exception e) {               
  10. //System.out.print(rowSet.print());               
  11. e.printStackTrace();        }
  12. }
  13. }
复制代码

以上在MYSQL数据库,INFORMIX数据库上都已经测试过,支持事物。
查询结果正确。
说明在DBJdbcRunners中DBUtils.getConnection();
DBUtils.closeResultSet(rs); DBUtils.closeStatement(statement); DBUtils.closeConnection(connection);
是写的一个通用方法DBUtils,管理连接,结果集和statement。
但我不知道这种调用方式会不会有其他的问题,所以请大家帮我参考下。

论坛徽章:
0
3 [报告]
发表于 2006-09-16 19:40 |只看该作者

解释几个问题.

0。我最关心的这个代码会不会出现连接无限增长,无法关闭的问题。
rs.last()在数据量很大的时候会不会出现性能问题。
这样的事务调用方式,累似hibernate的调用方式,虽然生效,但不知道会不会有其他问题和弊病。

1.为什么不用现成的开源产品如hibernate,ibats?
回答:并不是每个项目都适合用hibernate,不是说hibernate的能力适用不适用,而是开发人员的学习能力。毕竟hibernate中还是有很多东西需要学习,如果有些问题注意不好会出现性能问题,比如我前段时间碰见过延迟加载没有设置,导致列表页面超级慢。比如关联删除没有设置好,也会出问题。还有出了问题,人的第一个放应是框架的问题,不是自己问题。

而我写的JDBC只是简单的封装,学习门槛低,对付一些小的项目是很合适的。hibernate虽然开源,但真正能大体看懂源码得人很少。

2。这个代码不适合预处理查询和大字段(BLOB)的查询
是,这个需要在之后加入。
预处理查询 可以参考 Jdon彭老师 的jdbcUtil.setQueryParams(queryParams, ps);
blob 我只想写一个插入函数,和查询findbykey()的方法,不会在一般列表查询中也把blob,查询出来。

3.rs.getString都用这个函数似乎有偷工减料的嫌疑。
rs.getString 对一般的类型都可以取出,可能效率不是最好,但是问题应该不大。取出后在进行类型的转换。
Jdon的彭老师用的 rs.getObject
这个也是我有疑问的地方。
4。这个代码不支持分页查询
是,这个也需要在之后加入。
5。查询的结果没有返回,只是打印。
是,我回将结果放入的一个rowSet 种,rowSet中放入row.
6.不够优化,没有对各种数据库进行优化。
是,我看了hibernate的Dialect,可以搬过来。

最后我觉得这个东西还是有用的,适合比较简单,业务不复杂但要求进度的项目。

论坛徽章:
0
4 [报告]
发表于 2006-09-17 23:07 |只看该作者
轻量级SqlBean,嘿嘿~~我原来也写过,有创意!考虑做成框架式的?PoEAA里的那几个模式。

论坛徽章:
0
5 [报告]
发表于 2006-09-24 03:21 |只看该作者
是否应该加入同步的方法~~

论坛徽章:
0
6 [报告]
发表于 2006-09-28 11:20 |只看该作者
我以前也写过类似的东西,不过后来发现绝大多数功能用spring的jdbc template就已经实现了,代码又简单,不用担心关闭连接的问题,通过配置文件就可以自动集成连接池,建议楼主有空看看。

论坛徽章:
0
7 [报告]
发表于 2006-09-28 16:31 |只看该作者
楼主有这样的积极性,是值得表扬的。
但是正如版主所说的,Spring的JdbcTemplate确实是好东西

楼主有创造轮子的嫌疑

另外,对于Hibernate,iBatis这些东西,没有必要敬而远之
你知道它帮你做了什么东西之后,就会从中获益匪浅

论坛徽章:
0
8 [报告]
发表于 2006-09-28 17:40 |只看该作者
jakieyoung   
圣骑士说的有道理!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP