对于属性比较多的bean,如果不使用hibernate 或者ibatis等持久化解决方案,写查询函数时,单单将ResultSet 转换成Object就是一件很痛苦的事情,因此可以采用java反射机制做一个BaseDao,把ResultSet 映射到Object 的操作封装起来,简化了DAO的开发,
本文参照了[url]http://blog.csdn.net/cping1982/archive/2007/10/01/1808647.aspx
[/url]并且做了一点改进
public static String[][] proterty2Column =
{{"member_id","memberId"},
{"name", "name"}};
/**
* change the first char to upper case
* @param s
* @return
*/
private static String upperFirstChar(String s){
char [] chars = s.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
/**
* ResultSet 映射成 Object
* @param clzz
* @param rs
* @param obj
* @param fieldName
* @param varibleName
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws SQLException
* @throws NoSuchFieldException
* @throws SecurityException
*/
private void mapResultSet2Object(ResultSet rs, Object obj, String propertyName,
String columName)
throws NoSuchMethodException, IllegalAccessException,
InvocationTargetException, SQLException,
SecurityException, NoSuchFieldException {
Class < ? extends Object >clazz = obj.getClass();
Class < ? extends Object >propertyType = clazz.getDeclaredField(propertyName).
getType();
Method method = clazz.getDeclaredMethod("set"+
upperFirstChar( propertyName ), new Class[] { propertyType });
if (propertyType == String.class)
method.invoke(obj, (Object [])new String[]
{rs.getString( columName ) });
else if (propertyType == int.class)
method.invoke(obj, (Object [])new Integer[]
{new Integer( rs.getInt( columName )) });
else if (propertyType == float.class)
method.invoke(obj, (Object [])new Float[]
{new Float( rs.getFloat( columName )) });
else if (propertyType == long.class)
method.invoke(obj, (Object [])new Long[]
{new Long( rs.getLong( columName )) });
else if (propertyType == double.class)
method.invoke(obj, (Object [])new Double[]
{new Double( rs.getDouble( columName )) });
else if(propertyType == Date.class){
method.invoke(obj, (Object [])new Date[]
{rs.getDate(columName)});
}
}
/**
* 单行查询
* @param
* @param conn
* @param sql
* @param clazz
* @param params
* @return
* @throws Exception
*/
public <T> T getItem(Connection conn, String sql, Class<T> clazz,
String params[])throws Exception{
PreparedStatement pstmt = null;
ResultSet rset = null;
T t = null;
try {
pstmt = conn.prepareStatement(sql);
//set parameter
for(int i=0; i<params.length; i++){
pstmt.setString(i+1, (String)params[i]);
}
rset = pstmt.executeQuery();
if (rset.next()) {
t = clazz.newInstance();
for(int i=0; i< proterty2Column.length; i++) {
String propertyName = proterty2Column[i][1].trim();
String ColumnName = proterty2Column[i][0].trim();
mapResultSet2Object(rset, t, propertyName, ColumnName);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rset);
}
return t;
}
/**
* 多行查询
* @param
* @param conn
* @param sql
* @param proterty2Column
* @param clazz
* @return
* @throws Exception
*/
public <T> List <T> getItems(Connection conn, String sql, Class<T> clazz,
String[] params) throws Exception{
if (proterty2Column.length == 0)
return null;
PreparedStatement pstmt = null;
ResultSet rset = null;
List<T> list = new ArrayList<T>();
try {
pstmt = conn.prepareStatement(sql);
for(int i=0; i<params.length; i++){
pstmt.setString(i+1, (String)params[i]);
}
rset = pstmt.executeQuery();
while (rset.next()) {
for(int i=0; i< proterty2Column.length; i++) {
String propertyName = proterty2Column[i][1].trim();
String ColumnName = proterty2Column[i][0].trim();
fetchResult2Object(rset, obj, propertyName, ColumnName);
}
if( null == obj ) continue;
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rset);
}
return list;
}
分享到:
相关推荐
java泛型BaseDao与BaseService
利用泛型编写的hibernate basedao,涵盖几乎所有数据库操作方法,需导入spring相关jar包
尊重原创——SpringBoot_BaseDao.zip,内部含有反射,获取泛型类类型,如何使用等,自己下载查看
//获得当前类型的带有泛型类型的父类 ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass(); //获得运行期的泛型类型 clazz = (Class) ptClass.getActualTypeArguments()[0]...
#basic-common2h3 实现一个基于hibernate3的基本的dao,实现CRUD;...3、定义UserDao并实现IUserDao接口,且要实现BaseDao类还需要传入泛型。 BaseDao完成了具体的CRUD的方法。 示例: @Repository(valu
对hibernate里面的方法进行合理的封装,使用到java的泛型及java的反射技术;有利于减少代码,加快开发速度!
# 电影后台管理系统 ...- [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ### 修改数据库密码 修改hibernate.cfg.xml文件 ```xml ...
该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单-->...
该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单-->...
否则只能查看 11) Dao 操作优化 BaseDao.java 所有dao的通用方法,dao都必须继承此类 (反射泛型)实现步骤代码:1) 设计数据库:
用spring4 mvc、spring security3、hibernate4、kapctha实现的用户登录系统。baseDao被放在了另外的项目中。因为对泛型不熟悉,多数方法放在Dao里面。简单说,很粗糙啦。
整合了spring 4.1.6+mybatis3.2.8的组合算是最新的稳定版本了,而且附带了一个basedao操作接口,泛型的通用写法,下载即可运行,我用的是idea项目最好用idea来开发。不会的有问题随时拍砖:308444582,我的扣扣,准您...
博客文章 【SSH学习笔记】整合spring3-hibernate的小项目(二) ...2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的查询所有和按字符串查询的方法 4、使用JUNIT测试