10、将数据库连接池集成到GenericityJDBCUtils中,以提高效率
来源:互联网 发布:mac safari 缓存 编辑:程序博客网 时间:2024/05/17 04:10
1、由于获取数据库的连接是一个耗时的操作,所以可以一次获取多个,形成一个数据库连接池.以提高效率
2、将前面的JDBCPool与GenericityJDBCUtils结合使用
3、使用JDBCPool去获取连接的GenericityJDBCUtils代码如下
package com.jdbc.enhancegenericitypool.utils;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import com.jdbc.entity.User;import com.jdbc.utils.MyJDBCUtils;public class GenericityJDBCUtils {// 自己定义的,数据库连接池,用于获取数据库的连接,提高效率private static JDBCPool jdbcPool = new JDBCPool();private static Connection conn;private static PreparedStatement pstate;private static ResultSet rs;/** * 获取一个数据库的连接 * * @return */public static Connection getConnection() {try {return jdbcPool.getConnection();} catch (SQLException e) {throw new RuntimeException("从连接池里面,获取数据库连接失败" + e);}}/** * 释放数据库的连接 * * @param conn * @param st * @param rs */public static void release(Connection conn, Statement st, ResultSet rs) {if (rs != null) {try {rs.close();} catch (Exception e) {throw new RuntimeException("ResultSet关闭异常");}rs = null;}if (st != null) {try {st.close();} catch (Exception e) {throw new RuntimeException("Statement关闭异常");}st = null;}if (conn != null) {try {conn.close();} catch (Exception e) {throw new RuntimeException("Connection关闭异常");}conn = null;}}/** * * @param clazz * 要返回的类型的字节码 * @param id * 要查找记录在表里面的id * @return 在数据库里面查找到的记录,并返回 */public static <T> T findById(Class<T> clazz, int id) {T bean = null;// System.out.println(clazz.getSimpleName());try {bean = clazz.newInstance();String tableName = clazz.getSimpleName();String sql = "select * from " + tableName + " where id = ? ";conn = getConnection();pstate = conn.prepareStatement(sql);pstate.setInt(1, id);rs = pstate.executeQuery();if (rs.next()) {// 得到结果集的元数组ResultSetMetaData metaData = rs.getMetaData();int count = metaData.getColumnCount();for (int i = 0; i < count; i++) {// 注意jdbc的下标,从1开始// 去获取到数据库中的列的名称String name = metaData.getColumnName(i + 1);// 获取到,数据库列对应的数值Object value = rs.getObject(name);// 反射bean上与列名相同的属性Field f = bean.getClass().getDeclaredField(name);f.setAccessible(true);f.set(bean, value);}}return bean;} catch (Exception e) {throw new RuntimeException("在数据库中,查找id为" + id + "的User记录失败." + e);} finally {// 释放资源,关闭与数据库的连接release(conn, pstate, rs);}}/** * 郑强版本的sql查询,支持查询一个具体的实体或者是一个实体集合 * * @param sql * 查询的sql语句 * @param args * 对应sql语句中的参数 * @param handle * 具体的ResultSet处理器, BeanHandle用于处理一个具体的实体类, * ListBeanHandle用于处理返回一个集合的情况 * @return */public static <T> T query(String sql, Object[] args,ResultSetHandle<T> handle) {try {// 获取连接Connectionconn = getConnection();// 获取PreparedStatementpstate = conn.prepareStatement(sql);// 设置参数for (int i = 0; i < args.length; i++) {pstate.setObject(i + 1, args[i]);}// 获取rsrs = pstate.executeQuery();// 通过ResultSetHandle处理ResultSet,并返回结果return handle.handle(rs);} catch (Exception e) {throw new RuntimeException(e);} finally {release(conn, pstate, rs);}}/** * 适应于sql语句不带参数的问题 * * @param sql * @param handle * @return */public static <T> T query(String sql, ResultSetHandle<T> handle) {try {// 获取连接Connectionconn = getConnection();// 获取PreparedStatementpstate = conn.prepareStatement(sql);// 获取rsrs = pstate.executeQuery();// 通过ResultSetHandle处理ResultSet,并返回结果return handle.handle(rs);} catch (Exception e) {throw new RuntimeException(e);} finally {release(conn, pstate, rs);}}/** * 根据传进来的sql语句,来跟新数据库的表记录 * * @param sql * @param args */public static void update(String sql, Object[] args) {try {if (args.length < 0) {throw new RuntimeException("Object[] args的数组长度,不应该为空");}conn = getConnection();pstate = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {pstate.setObject(i + 1, args[i]);}// 注意要调用这个方法pstate.executeUpdate();} catch (Exception e) {throw new RuntimeException("更新数据库中的记录失败" + e);} finally {// 释放资源,关闭与数据库的连接release(conn, pstate, null);}}/** * 根据sql语句来更新数据库表中的记录 * * @param sql */public static void update(String sql) {try {conn = getConnection();pstate = conn.prepareStatement(sql);// 注意要调用这个方法pstate.executeUpdate();} catch (Exception e) {throw new RuntimeException("更新数据库中的记录失败" + e);} finally {// 释放资源,关闭与数据库的连接release(conn, pstate, null);}}}
1 0
- 10、将数据库连接池集成到GenericityJDBCUtils中,以提高效率
- 将7z解压功能以lib的方式集成到工程中
- Android 开发中配置Eclipse以提高效率
- 将Resin集成到IIS中
- 将Resin集成到IIS中
- 将g++编译器集成到VC2005中
- 将Quartz.NET集成到 Castle中
- 将Quartz.NET集成到 Castle中
- 将red5集成到Tomcat服务器中
- 将标签集成到后台编辑器中
- 将Quartz.NET集成到 Castle中
- 将LCDS31集成到Coldfusion901中
- 将Quartz.NET集成到 Castle中
- 将g++编译器集成到VC2005中
- 将GPIUmage集成到项目中
- 使用 spring 集成 dbcp 数据库连接池到 Wowza 插件
- 配置log4j配置数据库连接池(以dbcp连接池为例),并将log信息存储在数据库中(以mysql为例)
- 将图片以二进制的格式存储到数据库中
- 共享内存
- MFC-贪吃蛇
- hdu2825Wireless Password【ac自动机+dp状态压缩】
- leetcode 226. Invert Binary Tree(二叉树的镜像)
- 用实力助跑2016
- 10、将数据库连接池集成到GenericityJDBCUtils中,以提高效率
- 指针+1的问题
- android studio ndk工程开发及调试指南
- PHP截取中英混合字符串(UTF-8)
- Android SDK下各目录的用途,以及在不同系统下哪些是通用的
- EasyUI DataGrid动态加载数据
- NY理工题 水池数目
- iOS UIView 一些属性方法总结
- http://www.tuicool.com/articles/mYfy6n