? ? ? ? 项目中使用SpringJdbcTemplate来操作数据库,简单方便实用(根据项目需求选择技术),目前用到Oracle10g数据库,由于其操作大文本使用Clob类型,故而研究了下jdbctemplate对clob和Blob的操作。 ?
? ? ? ?jdbctemplate对clob和blob的操作使用起来也很简单,网友提供很多实例和代码。例如:
http://hi.baidu.com/sileader/item/0b3335f512378fb731c19999
主要是利用jdbctemplate提供的两个类来操作:LobCreator和LobHandler,具体使用方法可参考该链接。
但是如果某个Bean属性字段太多的话,代码写起来将会很麻烦。是否可以提供一种通用的方法,让每个业务方法操作数据库Clob和Blob时候也可以像操作其他基本数据类型一样,一句代码就完成。例如插入和修改Bean:
public <T> void saveOrUpdate(String sql, T bean) { namedParameterJdbcTemplate.update(sql, new BeanPropertySqlParameterSource(bean)); }
?经过一些尝试和摸索,我使用反射和注解,写了一个通用类,可以操作查询、修改、添加,满足了项目中的需求。
1、定义了一个注解类,用于bean中属性上,主要是提供属性的数据库字段名以及其数据库类型。
/** * @description * @author aokunsang * @date 2013-7-4 */ @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface PmcColumn { /** * 数据库中字段类型 * @return */ int type(); /** * 数据库中字段名 * @return */ String columnName(); /** * 查询时候是否忽略 * @return */ boolean ignore() default false; }
?2、定义一个反射的工具类,反射操作属性字段的setter和getter方法注入和获取属性值、
/** * @description 对bean的反射操作 * @author aokunsang * @date 2013-7-3 */ public class BeanUtils { /** * @param obj 操作的对象 * @param att 操作的属性 * */ public static Object getter(Object obj, String att) { try { Method method = obj.getClass().getMethod("get" + StringUtils.capitalize(att)); return method.invoke(obj); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 注入数据 * @param obj 类的实例 * @param att 属性名 * @param value 注入数据内容 * @param type 返回的数据类型 * */ public static void setter(Object obj, String att, Object value, Class<?> type) { try { Method method = obj.getClass().getMethod("set" + StringUtils.capitalize(att), type); method.invoke(obj, value); } catch (Exception e) { e.printStackTrace(); } } /** * 获取某个属性字段的ignore信息 * @param field * @return */ public static boolean getPmcColumnIgnore(Field field){ Annotation annotation = field.getAnnotation(PmcColumn.class); boolean ignore = false; if(annotation!=null){ ignore = ((PmcColumn)annotation).ignore(); } return ignore; } /** * 获取某个属性的Type信息 * @param field * @return */ public static int getPmcColumnType(Field field){ Annotation annotation = field.getAnnotation(PmcColumn.class); int type = Types.VARCHAR; if(annotation!=null){ type = ((PmcColumn)annotation).type(); } return type; } /** * 获取某个属性的数据库中字段名 * @param field * @return */ public static String getPmcColumnName(Field field){ Annotation annotation = field.getAnnotation(PmcColumn.class); String columnName = ""; if(annotation!=null){ columnName = ((PmcColumn)annotation).columnName(); } return columnName; } }
?3、定义一个对sql语句的转换类,sql语句进行转变,变成需要的字符串。
如:insert into t1 values(:a,:b,:c) ?----> ? insert into t1(A,B,C) values(?,?,?);
或者update t1 set A=:a,B=:b where C=:c ? ----> update t1 set A=?,B=? where C=?
/** * @description 工具类 * @author aokunsang * @date 2013-1-9 */ public class Util { /** * 分割插入、修改的sql语句 * @param sql * @param columnMaps <属性名,数据库中字段名> * @return */ public static Map<String,List<String>> spQuerysql(String sql,Map<String,String> columnMaps){ if(StringUtils.isEmpty(sql)) return null; String _sql = sql + " "; String key = _sql.replaceAll(":(.+?),\\s*", "?,").replaceAll(":(.+?)[)]\\s*", "?)").replaceAll(":(.+?)\\s+", "? "); Map<String,List<String>> result = new HashMap<String,