很厉害的一个数据库连接工具类

来源:互联网 发布:李氏筋骨散淘宝 编辑:程序博客网 时间:2024/04/30 10:16

package Homework.utils;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.List;import java.util.Properties;import org.apache.commons.dbcp2.BasicDataSource;/** * DBCP数据库连接工具类 * 依赖 * 1.mysql驱动 * 2.dbcp相关插件 * @author mrchai * */public class DBUtils {//连接数据库基本属性private static String driverClass;private static String url;private static String username;private static String password;//连接池属性private static int initSize;private static int maxSize;private static int maxIdle;private static long maxWait;//数据源private static BasicDataSource bds;//初始化数据源配置static{init();}public static void init(){try {//创建数据源对象bds = new BasicDataSource();//加载属性文件,获取属性信息Properties props = new Properties();props.load(DBUtils.class.getResourceAsStream("jdbc.properties"));driverClass = props.getProperty("driver");url = props.getProperty("url");username = props.getProperty("user");password = props.getProperty("password");initSize = Integer.parseInt(props.getProperty("initSize"));maxSize = Integer.parseInt(props.getProperty("maxSize"));maxIdle = Integer.parseInt(props.getProperty("maxIdle"));maxWait = Long.parseLong(props.getProperty("maxWait"));//设置驱动类路径bds.setDriverClassName(driverClass);//设置urlbds.setUrl(url);//设置用户名bds.setUsername(username);//设置密码bds.setPassword(password);//设置初始连接数bds.setInitialSize(initSize);//设置最大连接bds.setMaxTotal(maxSize);//设置最大闲置连接数bds.setMaxIdle(maxIdle);//等待获取连接的最大时间(MS)bds.setMaxWaitMillis(maxWait);} catch (IOException e) {e.printStackTrace();}}//获取连接public static Connection getConn(){try {if(bds == null || bds.isClosed()){init();}return bds.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}//封装资源回收的方法public static void close(ResultSet rs,Statement stat,Connection conn){try {if(rs != null) rs.close();if(stat != null) stat.close();if(conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}/** * 通用增删改 * @param conn * @param sql * @param objs * @return */public static boolean execUpdate(Connection conn,String sql,Object ...objs){try {PreparedStatement ps = conn.prepareStatement(sql);for (int i = 0; i < objs.length; i++) {ps.setObject(i+1, objs[i]);}int i = ps.executeUpdate();return i>0 ? true:false;} catch (SQLException e) {e.printStackTrace();}return false;}/** * C++钩子函数    回调函数 * 集合查询 * @param sql * @param call * @param params * @return */public static <T> List<T> queryList(String sql,CallBack<T> call,Object...params){Connection conn = DBUtils.getConn();PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for(int i = 0;i<params.length;i++){ps.setObject(i+1, params[i]);}ResultSet rs = ps.executeQuery();return call.getDatas(rs);} catch (SQLException e) {e.printStackTrace();}return null;}/** * 查询一条记录 * @param sql * @param call * @param params * @return */public static <T> T queryOne(String sql,CallBack<T> call,Object...params){Connection conn = DBUtils.getConn();PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for(int i = 0;i<params.length;i++){ps.setObject(i+1, params[i]);}ResultSet rs = ps.executeQuery();return call.getData(rs);} catch (SQLException e) {e.printStackTrace();}return null;}//查询返回接口 jdk1.8支持//public interface CallBack<T>{//default List<T> getDatas(ResultSet rs){//return null;//}//default T getData(ResultSet rs){//return null;//}//}//jdk1.8以下使用抽象类public static abstract class CallBack<T>{public List<T> getDatas(ResultSet rs){return null;}public T getData(ResultSet rs){return null;}}}

这个类是一个工具类,用于连接数据库以及一些对数据库表的增删改查的方法。


DBCP数据库连接:前半部分是对数据库的连接,由于连接的数据库类型、哪个数据库、用户名、密码这些都是不确定的,所以将这些不确定的元素写入属性文件。如果需要更改、直接改属性文件中的内容即可修改。

增删改:对表的增删改的方法是类似的,所以可以将其封装为一个方法。该方法的重点在于object ...objs,定义这个参数后传入方法中的参数的个数可以自己决定(参数不写也可以),这样就能够解决传入参数个数不同的问题。

查:由于对表的查询时,返回的值得个数不同,可能是个对象,可能是对象的集合,所以返回值不同。那么就必须写两个方法,一个返回对象,一个返回集合。但由于对象是不确定的,返回的东西该怎么存进对象。这时候就用到了钩子函数(回调函数),调用者调用钩子函数自己实现后再传给方法,方法再返还给调用者,从而实现对重复代码的封装,这就是低耦合高内聚。