将resultset中得到的一行或多行结果集封装成对象的实例-kb88凯时官网登录

时间:2020-05-04
阅读:
免费资源网,https://freexyz.cn/

首先说一下这个使用场景,我们在使用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 list list(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();
        list list=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());
 }
}
}

将resultset中得到的一行或多行结果集封装成对象的实例

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图