学生联盟网为您提供优质参考范文! 体会工作报告法律咨询精彩演讲各类材料
当前位置: 学生联盟网 > 课件合集 > 生物课件 > SpringJdbcTemplate操作Clob和Blob的通用类封装

SpringJdbcTemplate操作Clob和Blob的通用类封装

时间:2021-11-14 00:12:15 来源:学生联盟网

SpringJdbcTemplate 操作 Clob 和 Blob 的通用类封装项目中使用 SpringJdbcTemplate 来操作数据库,简单方 便实用根据项目需求选择技术 ,目前用到 Oracle10g 数据 库,由于其操作大文本使用 Clob 类型,故而研究了下 jdbctemplate 对 clob 和 Blob 的操作。jdbctemplate 对 clob 和 blob 的操作使用起来也很简 单,网友提供很多实例和代码。例如 主要是利用 jdbctemplate 提供的两个类来操作 LobCreator 和 LobHandler ,具体使用方法可参考该链接。但是如果某个 Bean 属性字段太多的话,代码写起来将会很 麻烦。是否可以提供一种通用的方法,让每个业务方法操作 数据库 Clob 和 Blob 时候也可以像操作其他基本数据类型一 样,一句代码就完成。例如插入和修改BeanJava 代码public T void saveOrUpdateString sql,Tbean namedParameterJdbcTemplate.updatesql,newBeanPropertySqlParameterSourcebean; 经过一些尝试和摸索,我使用反射和注解,写了一个通用 类,可以操作查询、修改、添加,满足了项目中的需求。1、定义了一个注解类,用于bean 中属性上,主要是提供属性的数据库字段名以及其数据库类型。Java 代码 /*** description * author aokunsang *date 2013-7-4 */ TargetElementType.FIELD,ElementType.RetentionRetentionPolicy.RUNTIME Documented Inherited public interface PmcColumn /*** 数据库中字段类型* return*/inttype;/*** 数据库中字段名* return*/String columnName;/*** 查询时候是否忽略* return*/boolean ignoredefault false; 2、定义一个反射的工具类,反射操作属性字段的setter 和getter 方法注入和获取属性值、Java 代码 /*** description 对 bean 的反射操作*author aokunsang * date 2013-7-3*/ public classBeanUtils /*** param obj 操作的对象* param att 操作的属性* */public staticObject getterObject obj,String att try obj.getClass.getget StringUtils.capitalizeatt; return .invokeobj; catch Exception ee.printStackTrace;return null;/*** 注入数据*param obj 类的实例* param att 属性名* param value 注入数据内容 * param type 返回 的数据类型 * */ public static void setterObject obj,String att,Object value,Class type try obj.getClass.getset StringUtils.capitalizeatt,type; .invokeobj,value; catch Exception ee.printStackTrace; /** * 获取某个属性字段的 ignore 信息 * param field* return */ public staticboolean getPmcColumnIgnoreField fieldAnnotation annotation field.getAnnotationPmcColumn.class; boolean ignore false;int type ifannotationnull ignore PmcColumnannotation.ignore; return ignore; /** * 获取某个属 性的 Type 信息 * param field * return*/public static int getPmcColumnTypeFieldfieldAnnotation annotation field.getAnnotationPmcColumn.class;Types.VARCHAR;ifannotationnull type PmcColumnannotation.type; return type; /** * 获取某个属性 的数据库中字段名 * param field * return */ public static String getPmcColumnNameField field Annotation annotation field.getAnnotationPmcColumn.class; String columnName ;ifannotationnull columnName PmcColumnannotation.columnName; return columnName; 3、定义一个对 sql 语句的转换类,sql 语句进行转变,变成 需要的字符串。如 insert into t1 valuesa,b,c insert intot1A,B,C values,,;或者 update t1 set Aa,Bb where Cc update t1set A,B where CJava 代码 /*** description 工具类 * authoraokunsang * date 2013-1-9*/ public class Util/*** 分割插入、修改的 sql 语句*param sqlparam columnMaps 属性名 ,数据库中字段名 return*/public staticMapString,ListString spQuerysqlString sql,MapString,StringcolumnMapsifStringUtils.isEmptysql returnnull;String _sql sql String key _sql.replaceAll.,s*,,.replaceAll.s*,.replaceAll.s,;MapString,ListString result new HashMapString,ListString;ListString fieldList new LinkedListString; Pattern pattern Ppile.|,|s*;Matcher matcher pattern.matcher_sql; StringBuffer insertString new StringBuffer; whilematcher.find String value matcher.group1; fieldList.addvalue; insertString.appendcolumnMaps.getvalue ,; iffieldList.isEmpty || key.equals_sql return null; StringBuffer key_sb new StringBufferkey; ifkey.trim.matchesinserts*intos*w|_.*s*val ues.* key.trim.containsupdate// 判断insert 语句是否有数据库字段,比如 insert into t1ID,NAME key_sb.insertkey_sb.indexOfvalues-1,insertString.substring0,insertString.length-1;result.putkey_sb.toString,fieldList;return result; 4、定义一个对 clob 和 blob 的通用类 关键类 ,也可以说 是已经存在的 Dao 类的扩展类。Java代码 /*** description增强版数据库操作类添力口对 clob 和 blob 的部分操作 * author aokunsang * date2013-7-4 */public class StGenericDao extends GenericDao/*** 查询单条记录* paramT* param sql* param clazzparam args* return*/public TT _findString sql,final ClassT clazz,Object...argsprintSqlInfosql,argsnull Arrays.toStringargs ;tryreturn jdbcTemplate.queryForObjectsql,newRowMapperTOverridepublic T mapRowResultSet rs,int rownum throwsSQLException T bean null;try bean clazz.newInstance;Field fields clazz.getDeclaredFields;//获取所有属性forField field fieldsiffield.getAnnotationPmcColumn.classnull continue; ifBeanUtils.getPmcColumnIgnorefield continue; switchBeanUtils.getPmcColumnTypefield //如果 Bean 中增加了类型,需要在这里以及下面方法中添加 case caseTypes.CLOB B eanUtils.setterbean,field.getName,lobHandler.getClobAsStringrs,BeanUtils.getPmcColumnNamefield,field.getType;break; caseTypes.BLOB B eanUtils.setterbean,field.getName,lobHandler.getBlobAsBytesrs,BeanUtils.getPmcColumnNamefield,field.getType; break; caseTypes.TIMESTAMPBeanUtils.setterbean,field.getName,rs.getTimestampBeanUtils.getPmcColumnNa mefield,field.getType;break; caseTypes.DATE B eanUtils.setterbean,field.getName,rs.getDateBeanUtils.getPmcColumnNamefiel d,field.getType;break; caseTypes.INTEGERBeanUtils.setterbean,field.getName,rs.getIntBeanUtils.getPmcColumnNamefield,field.getType;break; caseTypes.VARCHARBeanUtils.setterbean,field.getName,rs.getStringBeanUtils.getPmcColumnNamefie ld,field.getType;break; caseTypes.NUMERICBeanUtils.setterbean,field.getName,rs.getLongBeanUtils.getPmcColumnNamefiel d,field.getType; break;caseTypes.FLOATBeanUtils.setterbean,field.getName,rs.getFloatBeanUtils.getPmcColumnNamefiel d,field.getType;break; catch Exception e e.printStackTrace; return bean; ,args; catch EmptyResultDataAccessException e return null; catchDataAccessException e throw newDaoRuntimeException 数据库错误saveOrUpdate,e; /*** 添加或修改某条记录 * param Tparam sql* param bean*/ publicT void _saveOrUpdateString sql,final T bean final MapString,IntegercolumnTypes new HashMapString,Integer; MapString,String columnMaps new HashMapString,String;Field fields bean.getClass.getDeclaredFields; // 获取所有属性 forField field fields columnTypes.putfield.getName,BeanUtils.getPmcColumnTypefield; columnMaps.putfield.getName,BeanUtils.getPmcColumnNamefield; final MapString,ListString resultMap Util.spQuerysqlsql,columnMaps; ifresultMapnull throw new PmcRuntimeExceptionString.at 你提供的 SQL 语句有问 题,请详细检查再次尝试运行。

  SQL s,sql;Object validSql resultMap.keySet.toArray;// 改变后的 Sql 语句printSqlInfosqlvalidSql0.toString,; // 打印改变前后的 sql 语句 final ListString fieldList resultMap.getvalidSql0;//对应插入的 bean 字段jdbcTemplate.cutevalidSql0.toString,newAbstractLobCreatingPreparedStatementCallbackthis.lobHandler Overrideprotected voidsetValuesPreparedStatement ps,LobCreator lobCreater throws SQLException,DataAccessException forint i0,lengthfieldList.size;ilength;iString filedValue fieldList.geti;switch columnTypes.getfiledValue caseTypes.CLOB lobCreater.s etClobAsStringps,i1,BeanUtils.getterbean,filedValuenull null BeanUtils.getterbean,filedValue.toString;break; caseTypes.BLOB lobCreater.s etBlobAsBytesps,i1,BeanUtils.getterbean,filedValuenull null byteBeanUtils.getterbean,filedValue;break; caseTypes.TIMESTAMP ps.s etTimestampi1,BeanUtils.getterbean,filedValuenull null TimestampBeanUtils.getterbean,filedValue; break; caseTypes.DATE ps.setDatei 1,BeanUtils.getterbean,filedValuenull null DateBeanUtils.getterbean,filedValue;break; caseTypes.INTEGER ps.setIn ti1,BeanUtils.getterbean,filedValuenull null IntegerBeanUtils.getterbean,filedValue;break; caseTypes.VARCHAR ps.setS tringi1,BeanUtils.getterbean,filedValuenull null BeanUtils.getterbean,filedValue.toString;break; caseTypes.NUMERIC ps.setL ongi1,BeanUtils.getterbean,filedValuenull null LongBeanUtils.getterbean,filedValue;break; caseps.setFloatTypes.FLOAT i1,BeanUtils.getterbean,filedValuenull null FloatBeanUtils.getterbean,filedValue;break;; 5、对 JDBC 的配置文件修改,添加 lobHandler 类,并且注 入到 StGenericDao 中。Xml 代码 -- JDBC 上传附件时候使用 -- bean idlobHandler classorg.springframework.jdbc.support.lob.DefaultLobHandle r /-- 默认数据源 showsql- 是否显示 sql语句 如果需要操作 clob 和 blob ,则声明 StGenericDao-- bean idgenericDao classmon.dao.StGenericDao property namesimpleJdbcTemplate refdataSource/property property nameshowsql valuetrue/propertyproperty namelobHandler reflobHandler/property /bean如何使用以上方法,需要注意以下 2 个方面其一如果某个 Bean 类中包括 Clob 和 Blob 字段,那么该Bean 的字段类型需要加入 PmcColumn 注解。如Java 代码 /*** description * author aokunsang *date 2013-7-4 */ public class TDemo implements SerializablePmcColumncolumnNameID,typeTypes.NUMERICprivate Long id;PmcColumncolumnNameNAME,typeTypes.V ARCHAR private String name;PmcColumncolumnNameDEMO_PIC,typeTypes.BLOB private byte pic;//BLOB 类型,属性字段类型为 bytePmcColumncolumnNameCONTENT,typeTypes.CLOB private String content; //CLOB 类型,属性字段类型为 String setter and getter...其二 Service 业务方法中注入 StGenericdao 类,使用其方 法即可;当然如果你操作的 Bean 类没有 Clob 和 Blob 类型字 段就无需写 PmcColumn 注解,注入 IGenericDao 接口也可以。

  Java 代码 /*** description * author aokunsang *date 2013-7-4 */ Service public classDemoServiceImpl implementsIDemoServiceResourcenamegenericDaoprivate StGenericDao genericDao;public voidsaveDemoTDemodemo genericDao._saveOrUpdateinsert into tdemo valuesid,name,pic,content,demo;