zoukankan      html  css  js  c++  java
  • jdbc数据库操作的"工厂类"及较高性能的分页代码(ZZ)

    很早就琢磨着把最近在项目的用到的感觉较好的代码整理出来,一直没时间,今天搞了差不多半个下午清理了一下,在这里贴出来,供大家参考参考,希望能在以后用到这类东西时能有参考的价值,有很多不足地方,请各位朋友们、大哥大姐们、高手们多多指教、批评。

    第一部分 jdbc数据库操作“工厂”

    一、数据库连接池的定义

    1、定义建立连接池缓存类DataCache ,其作用是每次在获取连接时,先检查是否空闲状态的数据库连接,没有的话才重新建立新的连接,代码如下:

    package com.star.db;

     import java.util.HashMap;

    import javax.naming.Context;

    import javax.naming.InitialContext;

     import javax.naming.NamingException;

     import javax.sql.DataSource; /** * 建立连接池缓存类 * * @author star * @version 1.0 2008/07/08 */

    public class DataCache {

     // Cache table protected static final HashMap<Object, DataSource> map = new HashMap<Object, DataSource>();

     private static final Object lock = new Object(); // 防止在外部实例化

     private DataCache() { }

     public static Object getData(Object key) {

         Object v = map.get(key);

         if (v == null) { synchronized (lock) { // Check again to avoid re-load v = map.get(key); if (v == null) { loadDataSource(key);// 重新建立连接 } // 取出空闲状态的数据库连接,retrieves data v = map.get(key); } } return v; } /* * Load data from data source. */ protected static synchronized void loadDataSource(Object key) { System.out.println("************ build a new connection…… ************"); try { /** * 在javax.naming包中提供了Context接口, 该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。 */ Context initCtx = new InitialContext(); /* * lookup(String name):返回与指定的名字绑定的对象,获得数据库连接工厂,这里返回mysql的数据源 * java:comp/env/ejb/Interest是它的JNDI名,根据不同的应用服务器会有区别,这是在tomcat下的jndi名称 */ DataSource value = (DataSource) initCtx.lookup("java:comp/env/jdbc/mysql"); map.put(key, value); } catch (NamingException e) { e.printStackTrace(); } } }
    2、建立连接池类DbConnPool,里面包含了查询executeQuery和更新executeUpdate,以及获取连接的getConnnection方法

    package com.star.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import javax.sql.rowset.CachedRowSet; import com.star.impl.ResultSetImpl; import com.sun.rowset.CachedRowSetImpl; /** * 数据库连接池类,这里使用了单例模式 * * @author star * @version 1.0 2008/07/08 */ public class DbConnPool { /** *********************************************************** */ //防止在外部实例化 private static DbConnPool instance = null; protected DbConnPool() { } public static DbConnPool getInstance() { if(instance == null) instance = new DbConnPool(); return instance; } /** *********************************************************** */ /** * 函数:getConnection 功能:攻取数据库的连接 */ public static Connection getConnection() { try { DataSource db = (DataSource) DataCache.getData("dbSource"); return db.getConnection(); } catch (Exception e) { e.printStackTrace(); } return null; } /** *********************************************************** */ /** * 函数:close 功能:关闭连接 */ private static void close(Connection conn) { try { if (conn != null && !conn.isClosed()) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } /** *********************************************************** */ /* * CachedRowSet 对象是一个数据行的容器,可在内存中缓存其各行,这使得进行操作时仅仅在执行查询和更新时才需要一个数据库连接,无需总是连接到数据源 * CachedRowSet 还是一个 JavaBeansTM 组件,是可滚动、可更新、可序列化的 * * 目前您可以从Java开发者连接(http://java.sun.com/products/jdbc/download.html#rowsetcobundle1_0) * 下载CachedRowSet的实现。下载并解压缩安装文件后,将"rowset.jar"文件放到您的类目录下 */ /** * 函数:executeQuery 功能:数据查询 */ public static CachedRowSet executeQuery(String sql) { Connection conn = null; CachedRowSet crs = null; try { crs = new CachedRowSetImpl(); conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); crs.populate(new ResultSetImpl(rs)); rs.close(); stmt.close(); } catch (Exception e) { e.printStackTrace(); } finally { close(conn); } return crs; } /** *********************************************************** */ /** * 函数:executeUpdate 功能:数据更新(添加/更改/删除) */ public static boolean executeUpdate(String sql) { boolean result = false; Connection conn = getConnection(); try { PreparedStatement stmt = conn.prepareStatement(sql); if (stmt.executeUpdate() > 0) { result = true; } stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { close(conn); } return result; } }
    3、接下来,就是配置数据库连接的参数,定义一个context.xml,并将这个xml文件放在META-INF下,代码如下:

    <!-- The contents of this file will be loaded for each web application --> <Context debug="5" reloadable="true" crossContext="true"> <Resource name="jdbc/mysql" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull&useServerPrepStmts=false&autoReconnect=true" username="root" password="root" maxIdle="50" maxWait="20000" maxActive="100"/> </Context> 
    (里面的一些参数的含义就不多说了,大家一看都明白了,不清楚的baidu一下就OK明白了)

    4、最后,不要忘了把mysql的jdbc驱动放在tomcat的lib下

    这样,连接池就建立好了.

    二、创建数据库操作“工厂类”DbFactory (^V^找不到合适的词了)

    package com.star.db; import java.lang.reflect.Field; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * 数据库操作工厂类,里面包含了常用的数据库操作方法 * * @author star * @version 1.0 2008/07/08 */ public class DbFactory { private static DbFactory instance = null; // 构建受保护的构造器,防止被多次实例化 protected DbFactory() { } public static DbFactory getInstance() { if(instance == null) instance = new DbFactory(); return instance; } /** * 生成一条插入语句 * * @param object * Object 需要插入的对象,这个对象是对数据库映射的一个javabean * @return sql String 返回的sql插入语句 */ public String getInsertSql(Object object) { StringBuilder sql_fields = new StringBuilder(); StringBuilder sql_values = new StringBuilder(); String fieldName, fieldType, methodName, result; Class clazz = object.getClass(); Field fields[] = clazz.getDeclaredFields(); for (Field field : fields) { fieldName = field.getName(); fieldType = field.getType().toString(); if (!fieldName.equalsIgnoreCase("id")) { if (fieldType.endsWith("boolean")) {// boolean methodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } else { methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } try { result = (clazz.getDeclaredMethod(methodName) .invoke(object)) + ""; if (!result.equals("") && !result.equals("null")) { sql_fields.append(fieldName + ","); if (fieldType.endsWith("String")) { sql_values.append("'" + result + "',"); } else { sql_values.append(result + ","); } } } catch (Exception e) { e.printStackTrace(); } } } String table = clazz.getName(); String sql = "insert into " + table.substring(table.lastIndexOf(".") + 1) + "(" + sql_fields.substring(0, sql_fields.length() - 1) + ") values(" + sql_values.substring(0, sql_values.length() - 1) + ")"; // System.out.println(sql); return sql; } /** * 将一个对象插入数据库 * * @param object * Object 需要插入的对象,这个对象是对数据库映射的一个javabean * @return sql String 返回的结果 */ public boolean insert(Object object) { StringBuilder sql_fields = new StringBuilder(); StringBuilder sql_values = new StringBuilder(); String fieldName, fieldType, methodName, result; Class clazz = object.getClass(); Field fields[] = clazz.getDeclaredFields(); for (Field field : fields) { fieldName = field.getName(); fieldType = field.getType().toString(); if (!fieldName.equalsIgnoreCase("id")) { if (fieldType.endsWith("boolean")) {// 锟斤拷boolean methodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } else { methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } try { result = (clazz.getDeclaredMethod(methodName) .invoke(object)) + ""; if (!result.equals("") && !result.equals("null")) { sql_fields.append(fieldName + ","); if (fieldType.endsWith("String")) { sql_values.append("'" + result + "',"); } else { sql_values.append(result + ","); } } } catch (Exception e) { e.printStackTrace(); } } } String table = clazz.getName(); String sql = "insert into " + table.substring(table.lastIndexOf(".") + 1) + "(" + sql_fields.substring(0, sql_fields.length() - 1) + ") values(" + sql_values.substring(0, sql_values.length() - 1) + ")"; // System.out.println(sql); return DbConnPool.executeUpdate(sql); } /** * 通过ID查询某个对象的所有信息 * * @param o * Object 需要查询的对象,这个对象是对数据库映射的一个javabean * @param id * int 查询的ID * @return object Object 查询的结果 */ public Object selectById(Object o, int id) { Object object = null; Class clazz = o.getClass(); String table = clazz.getName(); String sql = "select * from " + table.substring(table.lastIndexOf(".") + 1) + " where id=" + id; try { ResultSet rs = DbConnPool.executeQuery(sql); while (rs.next()) { object = clazz.newInstance(); Field fields[] = clazz.getDeclaredFields(); String fieldName, methodName; Class fieldType; for (Field field : fields) { fieldName = field.getName(); fieldType = field.getType(); methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (fieldType.toString().endsWith("String")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getString(fieldName)); } if (fieldType.toString().endsWith("int") || fieldType.toString().endsWith("Integer")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getInt(fieldName)); } if (fieldType.toString().endsWith("float") || fieldType.toString().endsWith("Float")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getFloat(fieldName)); } if (fieldType.toString().endsWith("Date")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getDate(fieldName)); } } } rs.close(); } catch (Exception e) { e.printStackTrace(); } return object; } /** * 查询某个对象的集合 * * @param o * Object 需要查询的对象,这个对象是对数据库映射的一个javabean * * @return objects List<Object> 查询的结果集 */ public List<Object> selectAll(Object o) { List<Object> objects = new ArrayList<Object>(); Class clazz = o.getClass(); String table = clazz.getName(); String sql = "select * from " + table.substring(table.lastIndexOf(".") + 1); try { ResultSet rs = DbConnPool.executeQuery(sql); Object object; while (rs.next()) { object = clazz.newInstance(); Field fields[] = clazz.getDeclaredFields(); String fieldName, methodName; Class fieldType; for (Field field : fields) { fieldName = field.getName(); fieldType = field.getType(); methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (fieldType.toString().endsWith("String")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getString(fieldName)); } if (fieldType.toString().endsWith("int") || fieldType.toString().endsWith("Integer")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getInt(fieldName)); } if (fieldType.toString().endsWith("float") || fieldType.toString().endsWith("Float")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getFloat(fieldName)); } if (fieldType.toString().endsWith("Date")) { clazz.getDeclaredMethod(methodName, fieldType).invoke( object, rs.getDate(fieldName)); } } objects.add(object); } rs.close(); } catch (Exception e) { e.printStackTrace(); } return objects; } /** * 通过SQL查询一个对象的所有信息,只返回一条记录 * * @param o * Object 需要查询的对象,这个对象是对数据库映射的一个javabean * @param sql * String 查询的语句 * @return object Object 查询的结果 */ public Object selectObjectBySql(Object obj, String sql) { Object object = null; Class clazz = obj.getClass(); // String className = clazz.getName(); // String table = className.substring(className.lastIndexOf(".") + 1); try { ResultSet rs = DbConnPool.executeQuery(sql); ResultSetMetaData meta = rs.getMetaData(); int colCount = meta.getColumnCount(); /** ***********获得结果集合************ */ if (rs.next()) { object = clazz.newInstance(); Field fields[] = clazz.getDeclaredFields(); String fieldName, methodName; Class fieldType; for (int i = 1; i <= colCount; i++) { String columnName = meta.getColumnName(i); Object fieldValue = rs.getObject(columnName); if (fieldValue == null) { fieldValue = ""; } for (Field field : fields) { fieldName = field.getName(); if (fieldName.equals(columnName)) { fieldType = field.getType(); methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (fieldType.toString().endsWith("String")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getString(columnName)); } else if (fieldType.toString().endsWith("int") || fieldType.toString().endsWith("Integer")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getInt(columnName)); } else if (fieldType.toString().endsWith("float") || fieldType.toString().endsWith("Float")) { clazz .getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getFloat(columnName)); } else if (fieldType.toString().endsWith("Date")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getDate(columnName)); } break; } } } } rs.close(); } catch (Exception e) { e.printStackTrace(); } return object; } /** * 通过SQL查询某个对象的列表,返回多条记录 * * @param o * Object 需要查询的对象,这个对象是对数据库映射的一个javabean * @param sql * String 查询的语句 * @return object Object 查询的结果 */ public List selectObjectListBySql(Object obj, String sql) { List list = new ArrayList(); Class clazz = obj.getClass(); try { ResultSet rs = DbConnPool.executeQuery(sql); ResultSetMetaData meta = rs.getMetaData(); int colCount = meta.getColumnCount(); /** ***********获得结果集合************ */ while (rs.next()) { Object object = clazz.newInstance(); Field fields[] = clazz.getDeclaredFields(); String fieldName, methodName; Class fieldType; for (int i = 1; i <= colCount; i++) { String columnName = meta.getColumnName(i); Object fieldValue = rs.getObject(columnName); if (fieldValue == null) { fieldValue = ""; } for (Field field : fields) { fieldName = field.getName(); if (fieldName.equals(columnName)) { fieldType = field.getType(); methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (fieldType.toString().endsWith("String")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getString(columnName)); } else if (fieldType.toString().endsWith("int") || fieldType.toString().endsWith("Integer")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getInt(columnName)); } else if (fieldType.toString().endsWith("float") || fieldType.toString().endsWith("Float")) { clazz .getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getFloat(columnName)); } else if (fieldType.toString().endsWith("Date")) { clazz.getDeclaredMethod(methodName, fieldType) .invoke(object, rs.getDate(columnName)); } break; } } } list.add(object); } rs.close(); } catch (Exception e) { e.printStackTrace(); } return list; } /** * 通过ID更新对象 * * @param object * Object 需要更新的对象,这个对象是对数据库映射的一个javabean * @return 返回的sql更新语句 */ public boolean updateById(Object o) { StringBuilder fields_values = new StringBuilder(); String fieldName, methodName, result = ""; Class fieldType; Class clazz = o.getClass(); Field fields[] = clazz.getDeclaredFields(); String id = "0"; for (Field field : fields) { fieldName = field.getName(); fieldType = field.getType(); methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try { result = clazz.getDeclaredMethod(methodName).invoke(o) + ""; } catch (Exception e) { e.printStackTrace(); } if (!fieldName.equals("id")) { if (!result.equals("") && !result.equals("null")) { if (fieldType.toString().endsWith("String")) { fields_values.append(fieldName + "='" + result + "',"); } else { fields_values.append(fieldName + "=" + result + ","); } } } else { id = result; } } String table = clazz.getName(); String sql = "update " + table.substring(table.lastIndexOf(".") + 1) + " set " + fields_values.substring(0, fields_values.length() - 1) + " where id=" + id; return DbConnPool.executeUpdate(sql); } /** * 查看指定记录 * * @param sql * String 执行查询sql语句 * * @return list List 返回查询结果 */ public List<HashMap> getDataList(String sql) { int colCount; List<HashMap> list = new ArrayList<HashMap>(); try { ResultSet rs = DbConnPool.executeQuery(sql); ResultSetMetaData meta = rs.getMetaData(); if (meta != null) { colCount = meta.getColumnCount(); /** ***********获得结果集合************ */ while (rs.next()) { HashMap map = new HashMap(); for (int i = 1; i <= colCount; i++) { String fieldName = meta.getColumnName(i); Object fieldValue = rs.getObject(fieldName); if (fieldValue == null) { fieldValue = ""; } map.put(fieldName.toUpperCase(), fieldValue); } list.add(map); } // 完成取结果集合工作 } rs.close(); } catch (Exception e) { e.printStackTrace(); } if (list == null) { list = new ArrayList<HashMap>(); } return list; } /** * 获取指定表中的所有数据 * * @param tableName * String 指定需要得到数据的表名 * * @return list ArrayList 返回指定表中的所有数据 */ public List getDataFromTable(String tableName) { String sql = "select * from " + tableName; List list = new ArrayList(); try { ResultSet rs = DbConnPool.executeQuery(sql); ResultSetMetaData meta = rs.getMetaData(); int colCount = meta.getColumnCount(); /** ***********获得结果集合************ */ while (rs.next()) { HashMap map = new HashMap(); for (int i = 1; i <= colCount; i++) { String fieldName = meta.getColumnName(i); Object fieldValue = rs.getObject(fieldName); if (fieldValue == null) { fieldValue = ""; } map.put(fieldName.toUpperCase(), fieldValue); } list.add(map); } // 完成取结果集合工作 rs.close(); } catch (Exception e) { e.printStackTrace(); } if (list == null) { list = new ArrayList(); } return list; } /** * 获取sql语句指定的HashMap对象 * * @param sql * String 指定sql语句 * * @return map HashMap 返回指定sql要求的对象 */ public HashMap getObjectBySql(String sql) { HashMap map = new HashMap(); int colCount; try { ResultSet rs = DbConnPool.executeQuery(sql); ResultSetMetaData meta = rs.getMetaData(); colCount = meta.getColumnCount(); /** ***********获得结果集合************ */ if (rs.next()) { for (int i = 1; i <= colCount; i++) { String fieldName = meta.getColumnName(i); Object fieldValue = rs.getObject(fieldName); if (fieldValue == null) { fieldValue = ""; } map.put(fieldName.toUpperCase(), fieldValue); } } // 完成取结果集合工作 rs.close(); } catch (Exception e) { e.printStackTrace(); } return map; } /** * 获取sql语句指定的某条数据 * * @param sql * String 指定sql语句 * * @return s String 返回指定sql要求的记录 */ public String getStringBySql(String sql) { String s = ""; try { ResultSet rs = DbConnPool.executeQuery(sql); if (rs.next()) { s = rs.getString(1); } rs.close(); } catch (SQLException e) { e.printStackTrace(); } return s; } /** * 根据Sql语句执行更新 * * @param sql * String 执行更新sql语句 * * @return Boolean 返回更新结果 */ public boolean updateBySql(String sql) { return DbConnPool.executeUpdate(sql); } }
    之所以称它为一个数据库操作工厂类,是因为里面基本上包含了数据的所有操作,用起来相对比较方便(大部分需要自己传入sql语句,这样个人觉得比较灵活)

    需要注意的是,在取值的时候,都是用HashMap进行封装的,并且里面存的是用表的字段名的大写-字段的值的键值对,如果你更习惯用javaBean,则有的方法

    得需要自己重写或用其他方式实现。

    ……(待续)……


     

  • 相关阅读:
    sql 生成开始日期到结束日期相差天数或日期
    自定义表做存储过程变量
    [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove
    [转]JQuery.Ajax之错误调试帮助信息
    解决IOS safari在input focus弹出输入法时不支持position fixed的问题
    查看 存储过程的执行时间
    ListView
    android矩阵详解
    跳出圈子 “莫忘初心,方得始终”
    Eclipse使用
  • 原文地址:https://www.cnblogs.com/peggy89321/p/2283050.html
Copyright © 2011-2022 走看看