首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。
public class basedao{ private class cls; public basedao() { //得到父类的泛型 type stype=getclass().getgenericsuperclass(); //得到实际的类型参数数组 type[] generics=((parameterizedtype) stype).getactualtypearguments(); //得到第一个泛型的class cls=(class) (generics[0]); }
/** * 单表多条查询,将查询到的多条记录传入一个对象,然后再将这些存入一个集合中,返回这个集合 * @param sql 传入对应的sql查询语句 * @param parameters 传入对应的占位符的值 * @return 返回查询到的记录转化成的对象的集合 */ //object...parameters是sql语句中对应的占位符的值,是一个不定长可变参数,我们需要写一个函数来获取他 public listlist(string sql,object...parameters) { connection conn = null; preparedstatement st = null; resultset rs = null; list list = new arraylist<>(); try { conn = jdbcutil.getconnection(); st = conn.preparestatement(sql); setparameters(st, parameters); rs = st.executequery(); while(rs.next()) { //将获取到的结果集存入一个对象中,这个我们也单独写一个函数来实现 e obj = onerowtoobject(rs); //然后将对象存入一个集合中返回 list.add(obj); } } catch (exception e) { e.printstacktrace(); } finally { jdbcutil.closeall(rs, st, conn); } return list; }
首先来写一下获取不定长可变参数的方法
/** * 设置占位符 * @param st 预处理 * @param parameters 占位符数组 * @return 返回存储占位符对应的对象的数组 */ private void setparameters(preparedstatement st, object[] parameters) { //判断是否有结果集,结果集中是否有记录 if(parameters!=null&¶meters.length>0) { for(int i=0;i然后再把一个结果集转化成一个对象的方法写一下
* 把得到的一列数据存入到一个对象中 * @param rs * @return * @throws instantiationexception * @throws illegalaccessexception * @throws sqlexception * @throws nosuchmethodexception * @throws securityexception * @throws illegalargumentexception * @throws invocationtargetexception */ @suppresswarnings("unchecked") private e onerowtoobject(resultset rs) throws instantiationexception, illegalaccessexception, sqlexception, nosuchmethodexception, securityexception, illegalargumentexception, invocationtargetexception { e obj; obj=(e) cls.newinstance(); //获取结果集元数据(获取此 resultset 对象的列的编号、类型和属性。) resultsetmetadata rd=rs.getmetadata(); for (int i = 0; i < rd.getcolumncount(); i ) { //获取列名 string columnname=rd.getcolumnlabel(i 1); //组合方法名 string methodname="set" columnname.substring(0, 1).touppercase() columnname.substring(1); //获取列类型 int columntype=rd.getcolumntype(i 1); method method=null; switch(columntype) { case java.sql.types.varchar: case java.sql.types.char: method=cls.getmethod(methodname, string.class); if(method!=null) { method.invoke(obj, rs.getstring(columnname)); } break; case java.sql.types.integer: case java.sql.types.smallint: method=cls.getmethod(methodname, int.class); if(method!=null) { method.invoke(obj, rs.getint(columnname)); } break; case java.sql.types.bigint: method=cls.getmethod(methodname, long.class); if(method!=null) { method.invoke(obj, rs.getlong(columnname)); } break; case java.sql.types.date: case java.sql.types.timestamp: try { method=cls.getmethod(methodname, date.class); if(method!=null) { method.invoke(obj, rs.gettimestamp(columnname)); } } catch(exception e) { method=cls.getmethod(methodname, string.class); if(method!=null) { method.invoke(obj, rs.getstring(columnname)); } } break; case java.sql.types.decimal: method=cls.getmethod(methodname, bigdecimal.class); if(method!=null) { method.invoke(obj, rs.getbigdecimal(columnname)); } break; case java.sql.types.double: case java.sql.types.numeric: method=cls.getmethod(methodname, double.class); if(method!=null) { method.invoke(obj, rs.getdouble(columnname)); } break; case java.sql.types.bit: method=cls.getmethod(methodname, boolean.class); if(method!=null) { method.invoke(obj, rs.getboolean(columnname)); } break; default: break; } } return obj; }使用的话就是写一个实体类dao继承basedao
public class userdao extends basedao
{
}测试一下:
public class test { public static void main(string[] args) throws instantiationexception, illegalaccessexception, nosuchmethodexception, securityexception, illegalargumentexception, invocationtargetexception, sqlexception, introspectionexception { userdao userdao = new userdao(); listlist=userdao.list("select * from user"); system.out.println("uidt" "unamet" "statet" "flag"); for (user user : list) { system.out.println(user.getuid() "t" user.getuname() "t" user.getstate() "t" user.getflag()); } } }