自己写一个DBUtils

前言:

平时在开发学习中,总是习惯用各种jar来开发,效率快,简单开发。可是,当代码写来写去感觉就是这样,编程水平一直停滞不前。有些前辈们说:“这些东西早就有人开发出来了,没必要去造轮子!“。这句话本是没错,确实没必要造轮子,但是如果我们想要提高自己,那还必须要学会造轮子。

废话少说,开始学习!

首先,我们需要准备一些工具类和一些架包!

架包就不多说了,必备一个连接数据库的架包吧~


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

/**
 * @ClassName: MyDbUtils
 */
public class MyDbUtils {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;

	/**
	 * 放一个数据库连接
	 */
	public MyDbUtils(Connection conn) {
		this.conn = conn;
	}

	/**
	 * 放一个数据源,底层还是获取数据库连接
	 */
	public MyDbUtils(DataSource ds) {
		try {
			this.conn = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 用于更新,插入等操作
	 */
	public int update(String sql, Object... params) {
		try {
                       //在下面有出现
			publicMethod(sql, params);
			return ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DataUtil.Release(conn, ps, rs);
		}
		return 0;
	}

	/**
	 * 将数据封装到bean中,可以用get的方法获取
	 */
	public <T> T query(String sql, BeanHandler<T> rsh, Object... params) {
		try {
	
			publicMethod(sql, params);
			rs = ps.executeQuery();
			return rsh.handler(rs);

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataUtil.Release(conn, ps, rs);
		}
		return null;
	}

	/**
	 * 单值查询!只能查某列某个数据
	 */
	@SuppressWarnings("unchecked")
	public <T> T query(String sql, Object... params) {
		T obj = null;
		try {

			publicMethod(sql, params);
			rs = ps.executeQuery();
			while (rs.next()) {
				obj = (T) rs.getObject(1);
			}
			return obj;
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataUtil.Release(conn, ps, rs);
		}
		return null;

	}

	/**
	 * 将查询到的数据封装到对象,然后在封装到list集合中
	 */

	public <T> List<T> queryList(String sql, BeanListHandler<T> rsh,
			Object... params) {
		try {

			publicMethod(sql, params);
			rs = ps.executeQuery();
			return rsh.handler(rs);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataUtil.Release(conn, ps, rs);
		}
		return null;
	}

	/**
	 * 公共方法,便于数据库操作
	 */
	private void publicMethod(String sql, Object... params) throws SQLException {
		ps = conn.prepareStatement(sql);
		for (int i = 0; i < params.length; i++) {
			ps.setObject(i + 1, params[i]);
		}
	}

}
下面就是释放数据库连接之类的工具类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 
 * @ClassName: DataUtil
 * @Description: 这是一个数据库连接的工具类
 * @author 文
 */
public class DataUtil {

	public static void Release(Connection conn, PreparedStatement ps,
			ResultSet rs) {
		// 判断连接是否为空,不为空时关闭
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// 判断连接是否为空,不为空时关闭
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// 判断连接是否为空,不为空时关闭
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
Ok~东西都准备好了,接下来我们看查询实现的方法

这个为将数据库查询的信息封装进java对象中~(注:只是单个对象

package com.wen.dbutils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 
 * @ClassName: BeanHandler
 * @Description: 封装
 * @author 文
 */

public class BeanHandler<T> {
	private Class<T> clazz;
	public BeanHandler(Class<T> clz) {
		this.clazz = clz;
	}
	/**
	 * 从结果集rs对象获取信息,并进行封装: 封装一个JavaBean对象
	 */
	public T handler(ResultSet rs) throws Exception {
		if (rs.next()) {// 存在记录
			//游标回到第一个
			rs.isBeforeFirst();
			// 创建JavaBean对象
			T obj = clazz.newInstance();
			// 将Class对象clz转化成BeanInfo对象,可以属性信息逐一进行封装
			BeanInfo bi = Introspector.getBeanInfo(clazz);
			// 遍历
			PropertyDescriptor[] pds = bi.getPropertyDescriptors();
			// 遍历
			for (PropertyDescriptor pd : pds) {
				// 获取属性的名称
				String name = pd.getName();
				// 获取setXxx方法
				Method method = pd.getWriteMethod();
				// t.setXxx(rs.getObject(name)
				try {
					method.invoke(obj, rs.getObject(name));
				} catch (SQLException e) {
					continue;
				}
			}
			return obj;
		}
		return null;
	}	
}
接下来是多个对象封装进集合中:

package com.wen.dbutils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BeanListHandler<T> {
	private Class<T> clazz;

	public BeanListHandler(Class<T> clz) {
		this.clazz = clz;
	}

	public List<T> handler(ResultSet rs) throws Exception {
		List<T> list = new ArrayList<T>();
		if (rs.next()) {// 存在记录
			rs.beforeFirst();
			while (rs.next()) {
				T obj = clazz.newInstance();
				BeanInfo bi = Introspector.getBeanInfo(clazz);
				PropertyDescriptor[] pds = bi.getPropertyDescriptors();
				for (PropertyDescriptor pd : pds) {
					// 获取属性的名称
					String name = pd.getName();
					// 获取setXxx方法
					Method method = pd.getWriteMethod();
					// t.setXxx(rs.getObject(name)
					try {
						method.invoke(obj, rs.getObject(name));
					} catch (SQLException e) {
						continue;
					}
				}
				list.add(obj);
			}
		}
		return  list;
	}
}

代码结果测试就不做了。基本可以覆盖增删改查,有些方法还没有去实现,后期有时间继续补充!

总结:

这里主要讲了查询的操作,这只是简单实现,真正的DBUtils比这复杂很多。如果有兴趣欢迎去阅读源代码。

欢迎各位大佬批评指教,希望大家一起进步~谢谢


程序猿名言:

对待女孩要像对待BUG一样坚定不移的去解决,永不言弃~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值