jdbc,基本数据库命令封装

该项目基于jdbc、连接池,结合对象类、泛型、反射、IO和Lambda表达式,创建了一个简单框架,提供了数据库的基本操作,旨在减少代码重复。这是一个集成了多种技术的复杂工具类。
摘要由CSDN通过智能技术生成

这个项目是根据jdbc,连接池,封装,object类,泛型,反射,io,lamode表达式写的一个简单的框架,里面有数据库基本的使用,通过调用该类方法,可以减少代码冗余

/*
 * 今日解签,宜下江南
 * 从此江湖少了个天道,武道一肩挑的吕祖转世,
 * 多了个愿为徐胭脂再修三百年的洪洗象.
 *  ヽ\  //
 *     ∧∧ 。
 *   ゚ (゚∀゚)っ ゚
 *    (っノ
 *     `J
 */


package zy.db;

import com.alibaba.druid.pool.DruidDataSource;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;

/**
 * 数据库工具类v2.0 将访问数据库得公共代码抽取: 1.加载驱动 2.获取连接 6.关闭资源
 *
 * @author liqiuyang
 *
 */
public class DBUtils {
	/** 驱动类路径 */
	private static String DRIVER_CLASS;
	/** url地址 */
	private static String URL;
	/** 数据库服务器用户名 */
	private static String USER;
	/** 数据库服务器密码 */
	private static String PASSWORD;

	/**最大活动链接数*/
	private static int MAX_ACTIVE;
	/**最长等待连接获取的时间*/
	private static int MAX_WAIT;
	/**初始连接数*/
	private static int INIT_SIZE;
	/**声明连接池引用*/
	private static DruidDataSource ds;

	static {
		try {
			// 读取属性文件获取连接数据库相关的字符串
			InputStream is = DBUtils.class.getResourceAsStream("/jdbc2.properties");
			// 创建属性对象
			Properties p = new Properties();
			// 加载包含属性信息的输入流
			p.load(is);

			// 根据属性名获取属性
			DRIVER_CLASS = p.getProperty("driver");
			URL = p.getProperty("url");
			USER = p.getProperty("user");
			PASSWORD = p.getProperty("password");

			//获取连接池相关配置
			MAX_ACTIVE = Integer.parseInt(p.getProperty("pool.maxActive"));
			INIT_SIZE = Integer.parseInt(p.getProperty("pool.initSize"));
			MAX_WAIT = Integer.parseInt(p.getProperty("pool.maxWait"));


			//初始化连接池
			init();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void init() {
		if(ds == null || ds.isClosed()) {
			ds = new DruidDataSource();
		}
		ds.setDriverClassName(DRIVER_CLASS);
		ds.setUrl(URL);
		ds.setUsername(USER);
		ds.setPassword(PASSWORD);
		ds.setMaxActive(MAX_ACTIVE);
		ds.setInitialSize(INIT_SIZE);
		ds.setMaxWait(MAX_WAIT);
	}

	/**
	 * 获取数据库连接对象
	 *
	 * @return
	 */
	public static synchronized Connection getConn() {
		try {
			//当连接池被关闭或者为null重新初始化
			if(ds == null || ds.isClosed()) {
				init();
			}
			//从连接池获取一个连接并返回
			return ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 关闭资源
	 *
	 * @param rs
	 * @param stat
	 * @param conn
	 */
	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();
		}
	}

	/**
	 * 封装通用的更行操作:insert update delete
	 *
	 * @param sql
	 * @param params
	 * @return
	 */
	public static boolean exeUpdate(Connection conn,String sql,Object... params) {

		PreparedStatement ps = null;

		try {
			ps = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i + 1, params[i]);

				}
			}
			return ps.executeUpdate() > 0;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(null, ps, null);
		}

		return false;

	}

	/**
	 * 封装通用查询单条数据的方法
	 *
	 * @param <T>
	 * @param t
	 * @param sql
	 * @param params
	 * @return
	 */
	public static <T> T queryOne(Class<T> t, String sql, Object... params) {

		// 获取查询到的数组集合
		List<Map<String, Object>> list = queryMaps(sql, params);
		if (list.size() > 0) {
			// 获取一个map集合
			Map<String, Object> map = list.get(0);
			// 将map集合转换为javaBean
			return mapToBean(map, t);

		}
		return null;
	}

	/**
	 * 封装查询多条数据
	 *
	 * @param <T>
	 * @param t
	 * @param sql
	 * @param params
	 * @return
	 */
	public static <T> List<T> queryList(Class<T> t, String sql, Object... params) {
		List<T> list = new ArrayList<T>();
		// 获取所有查询到的数据
		List<Map<String, Object>> maps = queryMaps(sql, params);
		maps.forEach(m -> {
			// 将map转换为javaBean
			T obj = mapToBean(m, t);
			// 将javabean装入list
			list.add(obj);
		});
		return list;
	}

	/**
	 * 将map集合转换为一个确定的类型
	 *
	 * @param <T>
	 * @param map
	 * @param t
	 * @return
	 */
	public static <T> T mapToBean(Map<String, Object> map, Class<T> t) {
		T obj = null;
		try {
			// 根据提供的类型创建对应类型的object
			obj = t.newInstance();
			// 获取class中所有field
			Field[] fislds = t.getDeclaredFields();
			// 遍历获取每一个属性对象
			for (Field field : fislds) {
				// 获取属性名
				String fname = field.getName();
				// 获取属性
				Object values = map.get(fname);
				if (values != null) {
					// 设置属性对象的可访问性
					field.setAccessible(true);
					// 将从map中获取的值设置给属性obj.name=xx
					field.set(obj, values);
				}
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return obj;

	}

	/**
	 * 执行相关查询之后并将结果返回List<Map<String,Object>> 集合
	 *
	 * @param sql
	 * @param params
	 * @return
	 */
	public static List<Map<String, Object>> queryMaps(String sql, Object... params) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Connection conn = getConn();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// 获取预处理sql命令的对象
			ps = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					// 对指定位置的占位符填充值(预处理)
					ps.setObject(i + 1, params[i]);
				}
				// 执行查询获取结果
				rs = ps.executeQuery();
				// 获取结果集的元数据对象ResultSetMetaDate
				ResultSetMetaData rsmd = rs.getMetaData();
				// 获取总查询数
				int columnCount = rsmd.getColumnCount();
				// 遍历结果集
				while (rs.next()) {
					// 声明map集合存储
					Map<String, Object> map = new HashMap<String, Object>();
					// 遍历获取每一列信息
					for (int i = 1; i <= columnCount; i++) {
						// 获取列名称
						String key = rsmd.getColumnName(i);
						// 获取列标签
						String lable = rsmd.getColumnLabel(i);
						// 获取列值
						Object values = rs.getObject(lable);
						// 将取到的每一列的列名与列值存储到map
						map.put(key, values);
					}
					// 将map集合装入list集合
					list.add(map);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rs, ps, conn);
		}
		return list;
	}

	/**
	 * 根据提供的查询语句以及查询参数,返回符合条件的数目
	 *
	 * @param sql
	 * @param params
	 * @return
	 */
	public static int queryCount(String sql, Object... params) {

		Connection conn = getConn();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i + 1, params[i]);

				}
			}
			rs = ps.executeQuery();
			if (rs.next()) {
				return rs.getInt(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return 0;

	}

	public static void main(String[] args) {

	}
}

这算是到目前为止写的最复杂的工具类,综合了很多前面的知识,很值得研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值