spring-jdbc直接获得POJO对象
来源:互联网 发布:ubuntu无法联网 编辑:程序博客网 时间:2024/06/03 20:45
标准spring-jdbc JdbcTemplate提供了 queryForObject(sql, requiredType)方法,
也许你会认为,他会把 select name,id from usr 转换成包含name和id的 Usr 类,
但是只要你看一下他的源代码,就知道这只能是一种幻想
@Override
public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {
return queryForObject(sql, getSingleColumnRowMapper(requiredType));
}
spring只能处理返回一个字段的SQL,那么只能针对String这类简单对象。
这个方法我个人觉得,很欠妥,对比一下.net中针对返回一条记录一个字段的情形
Object SqlCommand.ExecuteScalar()
这个方法多么清晰明确,返回的是一个标量,不是集合更不是列表,这种地方真心没必要用泛型。
而对于返回一个个性对象,mybatis中可以很简单实现,其实我们大可自己实现一个,没什么难的。
对于类
class Usr{
void setName(String s){}
void setId(int id){}
}
就可以简单使用下面方式
Usr u=myJdbcTemplate.getPOJO("select id,name from usr where id=?",Usr.class,1);
if(u==null){
//用户没找到
}
spring-jdbc还有一个问题,就是返回单记录的查询,如果不存在,会直接抛出异常,但是实际使用中,这种情况一般都是正常情况,
程序本来就要处理,这样就逼迫程序必须捕获异常,变得很难看。更糟糕的是,其内部实际都是先生成一个List,
然后检查是否只有一条记录,0或者>1全部要抛出异常。白白多生成一个List对象。这点对比.net的设计就知道差距了。
因此额外增加了一个getSingleMap方法
其他代码基本都是自解释的,无非根据jdbc返回记录的字段名,去对应class利用反射查询相应方法
可能需要改进的就是一些特殊的SQL字段类型需要单独处理一下。目前,字符串,整数,日期类型都没问题
public class myJdbcTemplate extends JdbcTemplate {/**获得单一map对象,不存在时返回null*/public Map<String, Object> getSingleMap(String sql, Object... args) throws DataAccessException{ return this.query(sql, new ResultSetExtractor<Map<String ,Object>>(){public Map<String ,Object> extractData(ResultSet rs) throws SQLException,DataAccessException {if(!rs.next()) return null;return new ColumnMapRowMapper().mapRow(rs, 1);} }, args);}/**获得单一POJO对象,对应字段名存在1个参数的setXXX方法且字段值不为null时调用,不存在时返回null*/public <T> T getPOJO(String sql,final Class<T> t,Object... args){ return this.query(sql, new ResultSetExtractor<T>(){public T extractData(ResultSet rs) throws SQLException,DataAccessException {if(!rs.next()) return null;ResultSetMetaData dd= rs.getMetaData();int count=dd.getColumnCount();return toPOJO(t,rs,dd,count);} }, args);}/**获得POJO对象List,对应字段名存在1个参数的setXXX方法且字段值不为null时调用*/public <T> List<T> getPOJOList(String sql,final Class<T> t,Object... args){ return this.query(sql, new ResultSetExtractor<List<T>>(){public List<T> extractData(ResultSet rs) throws SQLException,DataAccessException {List<T> l=new ArrayList<T>();ResultSetMetaData dd= rs.getMetaData();int count=dd.getColumnCount();while(rs.next()) {T o=toPOJO(t,rs,dd,count);if(o==null) return null;l.add(o);}return l;} }, args);}//转换成 pojoprivate <T> T toPOJO(Class<T>t,ResultSet rs,ResultSetMetaData dd,int count) throws SQLException{T o;try {o =t.newInstance();} catch (InstantiationException e) {logger.error("getPOJO InstantiationException when new "+t.getName());return null;} catch (IllegalAccessException e) {logger.error("getPOJO IllegalAccessException when new "+t.getName());return null;}for (Method m : t.getMethods()){String ms=m.getName();if (!ms.startsWith("set") || m.getParameterTypes().length!=1 ) continue;ms=ms.substring(3).toLowerCase();for(int i=1;i<=count;i++){if (!dd.getColumnLabel(i).toLowerCase().equals(ms)) continue;Object a=rs.getObject(i);if (a==null) break;try {m.invoke(o, a);} catch (IllegalAccessException e) {logger.error("getPOJO IllegalAccessException when "+m.getName());return null;} catch (IllegalArgumentException e) {logger.error("getPOJO IllegalArgumentException when "+m.getName());return null;} catch (InvocationTargetException e) {logger.error("getPOJO InvocationTargetException when "+m.getName());return null;}break;}}return o;}}
有了这个方法,使用mybatis的理由就又少了一个。
- spring-jdbc直接获得POJO对象
- spring中怎么把jdbc获得的数据直接转换为对象
- spring jdbc直接返回为对象
- spring boot pojo 对象日期属性问题
- Spring MVC POJO对象的支持
- POJO对象
- 用Spring的JDBC直接操作数据库
- Spring 中获得session对象
- spring+jdbc操控LOB对象
- Spring JDBC 面向对象操作
- Spring对象JDBC的支持
- 使用spring jdbc查询对象
- Spring MVC 使用POJO对象绑定请求参数值
- 直接在Servlet中获得spring bean context
- 如何通过代码直接获得Spring容器中的Bean?
- Spring中获得dataSurce对象的方法
- Spring - 自动获得对象的属性
- Spring JDBC 如何获得和生成主键+Spring JDBC对行集的支持
- 【absolute下元素居中问题】
- linux下openssl-1.0.0c编写openssl服务器和客户端
- iOS截屏代码
- xapges repeat显示富域内容
- UVALive7045 多少个不同的数
- spring-jdbc直接获得POJO对象
- Effective Java学习笔记
- 大美黑龙江
- 使用jdb和gdb同时调试java native code
- 简单工厂模式、工厂方法模式、抽象工厂模式
- Android内存泄露相关资料整理
- C++ Primer Plus(第6版) 第2章编程练习
- HDU5375 格雷码
- HDU5373 整除11