- 浏览: 212510 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
jongde1:
Axure太难学了,分享mockplus工具,有兴趣可以去了解 ...
Axure RP 原型设计工具 -
di1984HIT:
这里面提到了好几种解决办法。
Spring AOP对日志记录、Exception日志记录 -
di1984HIT:
学习一下。
spring struts2 零配置 -
di1984HIT:
不错,不错啊
Struts2防止表单重复提交 -
di1984HIT:
kettle怎么样啊。
Kettle初探
一般情况下在进行jdbc编程的时候避免不了的要写n多的bean类,用来封装数据库获取的查询结果集,同时又要写n多的rowMapper或者handler来操作装配结果集中的数据进入bean中,最近研究了下自己写了一个对java bean自动进行rowMapper or handler的类 AutoBoxingRowMapper(其实现了spring jdbc的rowMapper),这是一个通用的rowMapper,大多数情况下可以帮助我们省去写n多的rowMapper类。
(注:在应用该类之前应该约定你的java bean中的属性名字的与sql查询中列名不区分大小写匹配,该类保证结果集与bean之间满足toLowerCase(columnName) = toLowerCase(propertyName)时才自动装配)
代码如下:
应用时,DAO中类似代码示例:
(注:在应用该类之前应该约定你的java bean中的属性名字的与sql查询中列名不区分大小写匹配,该类保证结果集与bean之间满足toLowerCase(columnName) = toLowerCase(propertyName)时才自动装配)
代码如下:
package com.loansystem.common.util; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.JdbcUtils; /** * * 对查询数据结果集进行bean自动装箱 * (注:结果集与bean之间满足toLowerCase(columnName) = toLowerCase(propertyName))时才自动装箱 */ public class AutoBoxingRowMapper implements RowMapper { // protected final Log logger = LogFactory.getLog(this.getClass()); private boolean stringNotEmpty = true;//结果集中由字段值全部以string类型返回其值,并且为空时以空串""返回 private Class<Object> beanClass;//即将要进行包装的bean的Class private Map<String,PropertyDescriptor> beanPropertyMap = new HashMap<String,PropertyDescriptor>();//即将要进行包装的bean的属性描述,以Map形式保存 public boolean isStringNotEmpty() { return stringNotEmpty; } public void setStringNotEmpty(boolean stringNotEmpty) { this.stringNotEmpty = stringNotEmpty; } public Class<Object> getBeanClass() { return beanClass; } public void setBeanClass(Class<Object> beanClass) { this.beanClass = beanClass; } public Map<String, PropertyDescriptor> getBeanPropertyMap() { return beanPropertyMap; } public void setBeanPropertyMap(Map<String, PropertyDescriptor> beanPropertyMap) { this.beanPropertyMap = beanPropertyMap; } /** * 自动装配sql查询结果集的各列值到beanClass所指定的bean中的对应属性上,满足toLowerCase(columnName) = toLowerCase(propertyName)时进行装配 * @param beanClass - 要装配的bean的java.lang.Class */ @SuppressWarnings({"rawtypes", "unchecked"}) public AutoBoxingRowMapper(Class beanClass){ super(); this.beanClass = beanClass; //初始化beanClass对应的bean的所有属性 PropertyDescriptor[] props = null; try { props = Introspector.getBeanInfo(this.getBeanClass(), Object.class) .getPropertyDescriptors(); if (props != null) { for (int i = 0; i < props.length; i++) { this.beanPropertyMap.put(props[i].getName().toLowerCase().trim(), props[i]); } } } catch (IntrospectionException e) { // logger.error(e, e); } } /** * 自动装配sql查询结果集的各列值到beanClass所指定的bean中的对应属性上,满足toLowerCase(columnName) = toLowerCase(propertyName)时进行装配 * @param beanClass - 要装配的bean的java.lang.Class * @param stringNotEmpty - 是否将结果集中由字段值全部以string类型返回其值,并且为空时以空串""返回,default true */ @SuppressWarnings({"rawtypes"}) public AutoBoxingRowMapper(Class beanClass,boolean stringNotEmpty){ this(beanClass); this.stringNotEmpty = stringNotEmpty; } public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Object defaultInstance = null; try { defaultInstance = this.getBeanClass().newInstance();//获取bean的实例 } catch (Exception e) { // logger.error(e, e); } if(defaultInstance == null){ // logger.error("attempt to new a instance of class named : " + this.getBeanClass().getName() + " but failed!!!"); return null; } //获取元数据 ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); PropertyDescriptor propertyDescriptor = null; try { for (int i = 1; i <= columnCount; i++) { String key = getColumnKey(JdbcUtils.lookupColumnName(rsmd, i));//获取resultset结果集中第i列对应的列名 Object obj = getColumnValue(rs, i, key);//获取resultset结果集中第i列对应的值 propertyDescriptor = this.beanPropertyMap.get(key); if(propertyDescriptor == null){//当前列名key对应的属性在bean中找不到,给予警告 // logger.warn("no corresponding property defined in class : " + this.getBeanClass().getName() + " for sql query resultset column '" + key + "' !!!"); continue; }else{////当前列名key对应的属性在bean中找到,则调用其setXxx方法设置其值 propertyDescriptor.getWriteMethod().invoke(defaultInstance, obj); } } } catch (Exception e) { // logger.error(e, e); } return defaultInstance; } protected String getColumnKey(String columnName) { return columnName == null ? null : columnName.toLowerCase().trim(); } @SuppressWarnings("rawtypes") protected Object getColumnValue(ResultSet rs, int index, String columnName) throws SQLException { Object val = null; if(stringNotEmpty){//所有列以string类型解析(前提做到要约定你的bean中的所有属性都定义成string类型) val = rs.getString(index) == null ? "" : rs.getString(index); }else{//所有类型以其bean类中对应的属性类型进行解析 PropertyDescriptor propertyDescriptor = this.beanPropertyMap.get(columnName); if(propertyDescriptor != null){ Class propertyTypeClass = propertyDescriptor.getPropertyType(); String className = propertyTypeClass.getName(); if(className.equals("int") || className.equals(Integer.class.getName())){ val = rs.getInt(index); return val; }else if(className.equals("short") || className.equals(Short.class.getName())){ val = rs.getShort(index); return val; }else if(className.equals("byte") || className.equals(Byte.class.getName())){ val = rs.getByte(index); return val; }else if(className.equals("long") || className.equals(Long.class.getName())){ val = rs.getLong(index); return val; }else if(className.equals("float") || className.equals(Float.class.getName())){ val = rs.getFloat(index); return val; }else if(className.equals("double") || className.equals(Double.class.getName())){ val = rs.getDouble(index); return val; }else if(className.equals("char") || className.equals(Character.class.getName())){ val = rs.getString(index); return val; }else if(className.equals(String.class.getName())){ val = rs.getString(index); return val; }else if(className.equals(java.util.Date.class.getName())){ val = rs.getDate(index); return val; }else if(className.equals(java.math.BigDecimal.class.getName())){ val = rs.getBigDecimal(index); return val; }else{//Object val = rs.getObject(index); return val; } }else{ val = JdbcUtils.getResultSetValue(rs, index); } } return val; } }
应用时,DAO中类似代码示例:
List<Object> list = this.getJdbcTemplate().query(sql, new AutoBoxingRowMapper(Department.class,false)); Map<String,Object> map = this.callProcedure(procName, new Object[]{deptNo,0,5}, new AutoBoxingRowMapper(Employee.class,false),true);
发表评论
-
Linux下部署多个Tomcat多个域名
2015-12-12 19:02 3697一、安装JDK 1、安装jdk-7u79-linux-x64. ... -
linux下安装swftools和openOffice
2015-07-03 17:09 749最近公司实现一个仿豆丁网百度文库阅读器的功能,需要用到两个软件 ... -
redis Java develop
2014-10-23 18:01 6611. http://javacrazyer.iteye.com ... -
验证码 原理 破解
2014-08-20 17:52 623验证码 原理 破解 reference: http://bl ... -
HttpClient 学习经验
2014-08-14 11:01 675HttpClient学习经验 HttpCl ... -
P2P resources
2013-12-09 18:24 9791.P2P导航收录 http://www.p2peye.com ... -
运用加密技术保护Java源代码
2013-06-08 08:38 1114运用加密技术保护Java源代码 http://www.ibm ... -
log4j.properties配置详解
2013-03-15 17:00 0log4j.properties配置详解 Log4J的配置文 ... -
Struts 2 studing
2012-12-28 17:28 7401. Struts 2的基石——拦截器(Interceptor ... -
J2EE项目异常处理
2012-12-26 11:08 1113J2EE项目异常处理 为什 ... -
如何将基于 Struts、Spring 和 Hibernate 的应用从 Tomcat 迁移到 WebSphere Application Server
2012-12-21 10:28 1193引言 现在很多的企业都 ... -
详解spring事务属性
2012-12-20 10:22 842Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
Java List Copy,Remove容易出现的问题
2012-11-15 03:08 1034懒程序员,在代码越写越多的情况下,总想着使用把代码精简一 ... -
MySQL---ORACLE序列解决方案
2012-11-13 00:55 1197MySQL自增长与Oracle序列的区别: 自增长只能用于表 ... -
使用反射循环查找所有父类属性
2012-11-02 01:28 2137使用反射循环查找所有父类属性 ... -
list,set,map,数组间的相互转换
2012-11-02 01:25 962list,set,map,数 ... -
URL encoding 乱码处理
2012-10-10 15:53 892搞了两三天的乱码处理,试了很多方法,过滤器啊,编码转换啊,试来 ... -
JAVA 按任意角度旋转图片,并生成新的旋转后图片
2012-07-11 11:03 3678JAVA 按任意角度旋转图片,并生成新的旋转 ... -
QR Code
2012-06-12 12:29 01. 在线生成QR Code 网站 http://www. ... -
convert BufferedImage to byte[]
2012-06-12 11:26 1239How to convert BufferedImage to ...
相关推荐
Java开发中,自动化的代码生成可以极大地提高开发效率,减少重复劳动。本主题涉及的核心技术是使用Freemarker模板引擎来生成DTO(Data Transfer Object)、DAO(Data Access Object)、RowMapper、BO(Business ...
这个工具类虽然简洁,但在实际应用中可能需要进行扩展,比如处理多行数据、处理自定义类型、异常处理等。此外,如果你使用的是Spring框架,可以考虑使用RowMapper或者JPA的EntityGraph来实现相同的功能,这些内置...
然后在Java中创建对应的实体类`User`,这个类的属性和表的字段相对应,通过getter和setter方法进行访问。 ```java public class User { private Long id; private String name; private String email; // ...
- 创建一个内部匿名类`RowMapper`,用于从结果集中映射数据到Java对象。 - 使用`ProcedureUtil`工具类调用存储过程,并处理结果集。 ##### 3. 其他关键组件 - **`ProcedureUtil`**:这是一个自定义工具类,用于...
通过`JsonBean.java`和`JdbcUtils.java`,我们可以看到如何在实际项目中定义数据模型类以及如何利用JdbcTemplate进行数据库操作。在使用时,注意事务管理和错误处理也是关键,以确保数据的一致性和应用程序的稳定性...
这个"java数据库操作封装.zip"压缩包中的文件,如JDBCcontrol.java、ConnectionManagement.java、PreparedStatementSetter.java和RowMapper.java,都是围绕这个目标设计的。下面我们将详细讲解这些类和接口的功能...
首先,要与mdb数据库进行交互,我们需要一个Java库,如JDBC-ODBC桥接器或者Apache的Jackcess库。JDBC-ODBC桥接器是Java标准版的一部分,允许通过ODBC数据源连接到各种数据库,包括Access。而Jackcess是一个开源库,...
`DefaultRowMapper.java`文件是Spring框架中的一个类,它实现了`RowMapper`接口。在Spring JDBC模块中,`RowMapper`接口是用于将数据库查询结果集(ResultSet)映射为Java对象的关键组件。`DefaultRowMapper`提供了...
- 查询操作:使用`query(String sql, RowMapper<T> rowMapper)`方法执行SQL查询,将结果映射到Java对象。 - 更新操作:使用`update(String sql, Object... args)`方法执行SQL更新,如插入、删除或修改记录。 6. *...
本知识点主要聚焦于Spring框架的一个重要组件——Spring JDBC,以及如何将它与MySQL8数据库进行整合,同时考虑了Java 8的新特性。下面我们将深入探讨这个主题。 Spring JDBC模块是Spring框架对Java数据库连接(JDBC...
- **分片读取数据**:自定义`ReadRowHolder`类实现`RowMapper`接口,用于根据当前分片的起始和结束位置读取Excel中的数据行。 ```java private static class ReadRowHolder implements RowMapper<List<String>> { ...
- **RowMapper**:将数据库查询结果映射到Java对象的接口,S2dao提供了一些默认实现,如`BeanHandler`和`MapHandler`。 - **SqlBuilder**:用于构建SQL语句的工具类,可以根据条件动态生成SQL。 ### 4. 使用S2dao的...
这里,我们使用`WebApplicationContextUtils`类来从Servlet上下文中获取Spring的WebApplicationContext,然后通过ApplicationContext获取Service层的bean。 下面是一个示例,展示了如何在Servlet中获取Service层的...
例如,JdbcTemplate的`queryForList(String sql, Object[] args, RowMapper<T> rowMapper)`方法可以用来执行SQL查询,并通过RowMapper将结果映射为Java对象。 3. 实体类(Entity Class): 在数据库操作中,实体类...
在Java编程中,分页是数据管理中一个非常重要的概念,特别是在处理大量数据时,为了提高用户体验和系统性能,我们通常需要将数据分块显示,而不是一次性加载所有数据。本篇将详细介绍如何在Java中实现面向对象的分页...
接下来,我们可以创建一个Java配置类,用来初始化Druid数据源: ```java @Configuration public class DruidConfig { @Bean public DataSource dataSource() { DruidDataSource dataSource = new Druid...
- 如果是查询操作,可以使用`RowMapper`或`ResultSetExtractor`来映射结果到Java对象。 8. **性能考虑** 尽管SpringJdbcTemplate提供了便利,但在高并发、大数据量的场景下,可能需要考虑其性能。例如,大量数据...
- `query(String sql, RowMapper<T> rowMapper)`:用于执行查询,`RowMapper`接口用于映射结果集中的每一行数据到Java对象。 - `update(String sql, Object... args)`:执行更新操作,参数可以是占位符的值。 - `...
- "基于jdbctemplate封装"可能包含一个或多个类文件,如BaseJdbcDao.java,它定义了通用的方法,以及针对特定业务的子DAO类,如UserDao.java,实现了用户相关的数据库操作。 7. **使用示例**: - 创建一个新的...
Java JDBC 模板是Spring框架中的一个核心组件,主要用于简化Java数据库连接(JDBC)的操作。在传统的JDBC编程中,我们需要手动管理连接、预编译SQL语句、设置参数和处理结果集,这些繁琐的过程容易引入错误且不易...