前言:
平时在开发学习中,总是习惯用各种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一样坚定不移的去解决,永不言弃~