JDBC学习笔记(四)

  减少各个Dao类间的重复代码,有以下几种方式:

写一个DBConnectionManager,将公共的查询逻辑做成方法,将sql语句作为参数传递给方法。

public class DBConnectionManager{

  static{
   Class.forName("com.mysql.jdbc.Driver");
  }

 //读操作
 public static List<Map<String,Object>> selectObject(String sql, String[] params) throws Exception {
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List<Map<String,Object>>> result  = new ArrayList<Map<String,Object>>>();
  try {
   conn = DBConnectionManager.getConnection();
   pstmt = conn.prepareStatement(sql);

   for (int i = 0; params != null && i < params.length; i++) {
    pstmt.setString(i + 1, params[i]);
   }
   rs = pstmt.executeQuery();
   ResultSetMetaData meta = rs.getMetaData();
   while (rs.next()) {
    Map<String,Object> columnValue = new HashMap<String,Object>
    int size = meta.getColumnCount();
    for (int i = 1; i <= size; i++) {
     String columnName = meta.getColumnLabel(i);  //getColumnName返回的是数据库列名,getColumnLabel如有别名将返回列的别名,否则和getColumnName相同
     columnValue.add(columnName,rs.getObject(columnName));
    }
    result.add(columnValue);
   }
   return result;
  } catch (Exception e) {
   //logger.info("Execute sql : " + sql + " fail!!!");
   throw e;
  } finally {
   DBConnectionManager.free(conn, pstmt, rs);
  }
 }

 //增删改操作
 public static void updateObject(String sql, String[] params) throws Exception {
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  try {
   conn = DBConnectionManager.getConnection();
   pstmt = conn.prepareStatement(sql);

   for (int i = 0; params != null && i < params.length; i++) {
    pstmt.setObject(i + 1, params[i]);
   }
   rs = pstmt.executeUpdate();

  } catch (Exception e) {
   //logger.info("Execute sql : " + sql + " fail!!!");
   throw e;
  } finally {
   DBConnectionManager.free(conn, pstmt, rs);
  }
 }

 //更好的做法是从数据库连接池中取链接
 public static Connection getConnection(){
      String dbName = "nnm5";
      String passwrod = "OSSDB123";
      String userName = "root";
      String url = "jdbc:mysql://localhost:13306/" + dbName; 

      Connection conn = DriverManager.getConnection(url, userName,passwrod);
      return conn;
 }

 public static void free(Connection conn,PreparedStatement pstmt,ResultSet rs){
    if (rs != null) {
              try {
                  rs.close();
              } finally{
         if(ps != null){
           try{
             ps.close();
                        }finally{
             if(conn != null){
               conn.close();
                         }
                      }
          }
          }
     }

}

  上述方法不好的地方在于返回的结果是 List<Map<String,Object>>,如果希望能像ORM框架那样的返回对象,就可以实现一个RowMapper,类似于Spring中提供的SimpleJdbcTemplate。

代码中加上RowMapper也有两种方式,第一种是使用模板方式,第二种是使用策略方式。

使用模板方式的例子如下,修改上面的模板类中的方法:

public static List selectObject(String sql, String[] params) throws Exception {
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List<Map<String,Object>>> result  = new ArrayList<Map<String,Object>>>();
  try {
   conn = DBConnectionManager.getConnection();
   pstmt = conn.prepareStatement(sql);

   for (int i = 0; params != null && i < params.length; i++) {
    pstmt.setString(i + 1, params[i]);
   }
   rs = pstmt.executeQuery();
   List list = new ArrayList();
   int index=0;
   while (rs.next()) {
      list.add(objectMapper(rs));  //传递的是每次减去一行后的结果集
   index++;
   }
   return list ;
  } catch (Exception e) {
   //logger.info("Execute sql : " + sql + " fail!!!");
   throw e;
  } finally {
   DBConnectionManager.free(conn, pstmt, rs);
  }
 }

public abstract  Object objectMapper(ResultSet rs);

  具体的Dao中的代码如下:

public List getPerson(Integer id){
     String sql="select id,name from person where id<?";
     Object [] objs=new Object[]{id};
     return super.getObject(sql,objs);  //实际调用的还是该类中的objectMapper。
}

public Object objectMapper(ResultSet rs){
     Person person=new Person;
   try{
              person.setId((Integer)rs.getObject(1));
              person.setName((String)rs.getObject(2));
      }catch(Exception e){
           logger.log(e.printStackTrace());
     }
     return person;
}

  

使用策略模式修改模板类中的代码如下:

首先需要一个接口:

public interface RowMapper {
    public Object objectMapper(ResultSet rs);
}

再修改模板类:

public static List selectObject(String sql, String[] params, RowMapper mapper) throws Exception {
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List<Map<String,Object>>> result  = new ArrayList<Map<String,Object>>>();
  try {
   conn = DBConnectionManager.getConnection();
   pstmt = conn.prepareStatement(sql);

   for (int i = 0; params != null && i < params.length; i++) {
    pstmt.setString(i + 1, params[i]);
   }
   rs = pstmt.executeQuery();
   List list = new ArrayList();
   int index=0;
   while (rs.next()) {
      list.add(mapper.objectMapper(rs));  //传递的是每次减去一行后的结果集
   index++;
   }
   return list ;
  } catch (Exception e) {
   //logger.info("Execute sql : " + sql + " fail!!!");
   throw e;
  } finally {
   DBConnectionManager.free(conn, pstmt, rs);
  }
 }

  具体的Dao中的代码:

public List getPerson(Integer id) {
         String sql="select id,name from person where id<?";
         Object [] objs=new Object[]{id};
         return mu.getObject(sql,objs,new MyRowMapper1());
}

class MyRowMapper1 implements RowMapper{
         public Object objectMapper(ResultSet rs) {
         Person person=new Person();
         try{
                             person.setId((Integer)rs.getObject(1));
                             person.setName((String)rs.getObject(2));
         }catch(Exception e){
              logger.log(e.printStackTrace());
         }
         return person;
      }
}
时间: 2024-10-12 19:02:44

JDBC学习笔记(四)的相关文章

JDBC学习笔记四

PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Statement的子接口,我们在执行查询或者更新数据表数据的时候,拼写SQL语句是一个很费力并且容易出错的事情,PreparedStatement可以简化这样的一个过程. PreParedStatement1).why?我们为什么要使用它 使用Statement需要进行拼写SQl语句,辛苦并且容易出错,之前使用

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

Android学习笔记四:添加Source

问题描述 Source not foundThe JAR file D:\.....\sdk\platforms\android-20\android.jar has no source attachment. 问题原因及解决办法 1. 使用SDK Manager下载最新版本的Sources for Android SDK 一般文件下载目录默认在SDK下的sources文件中即 \adt-bundle-windows-x86_64-20130522\sdk\sources\android-20

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期