多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php框架 > 框架設計 > 關于Spring JDBC RowMapper的一點改進思路

關于Spring JDBC RowMapper的一點改進思路

來源:程序員人生   發(fā)布時間:2015-04-21 08:33:43 閱讀次數(shù):3294次

【注】通常我們使用RowMapper(比如ParameterizedRowMapper),都需要定義好查詢字段,如果使用別名就沒辦法了。還要比如加入group,或聯(lián)合查詢,也不能夠使用,除非不想要非主體Bean以外的字段,那末只能用Map接收返回結果了,或直接實現(xiàn)RowMapper?;谶@1點,提出1個略微通用的解決思路:所有的Bean都繼承1個基類Bean,里面放1個Map(就是寄存那些Bean沒有指定的字段了,比如sum、count、avg … 各種查詢字段或別名),參考BeanPropertyRowMapper,在mapRow方法里面做些小調劑,找不到的column就放到map里面,這模樣的話,Bean有的字段就采取getxxx(),沒有就從map里面取,好像會有點用。

#具體方法以下#

public abstract class BaseEntity { private Map<String, Object> aliasFields = new HashMap<String, Object>(); public void setAliasField(String field, Object value) { aliasFields.put(field, value); } public Object getAliasFields(String field) { return aliasFields.get(field); } }

該類中只放1個map,存儲Bean里面沒有的字段,剩下的就是改造RowMapper實現(xiàn)類,可以拷貝BeanPropertyRowMapper,換個類名,直接修改mapRow方法,具體以下(改動量非常小,看注釋):

public T mapRow(ResultSet rs, int rowNumber) throws SQLException { Assert.state(this.mappedClass != null, "Mapped class was not specified"); T mappedObject = BeanUtils.instantiate(this.mappedClass); BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(mappedObject); initBeanWrapper(bw); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); Set<String> populatedProperties = (isCheckFullyPopulated() ? new HashSet<String>() : null); for (int index = 1; index <= columnCount; index++) { String column = JdbcUtils.lookupColumnName(rsmd, index); PropertyDescriptor pd = this.mappedFields.get(column.replaceAll(" ", "").toLowerCase()); if (pd != null) { try { Object value = getColumnValue(rs, index, pd); if (logger.isDebugEnabled() && rowNumber == 0) { logger.debug("Mapping column '" + column + "' to property '" + pd.getName() + "' of type " + pd.getPropertyType()); } try { bw.setPropertyValue(pd.getName(), value); } catch (TypeMismatchException e) { if (value == null && primitivesDefaultedForNullValue) { logger.debug("Intercepted TypeMismatchException for row " + rowNumber + " and column '" + column + "' with value " + value + " when setting property '" + pd.getName() + "' of type " + pd.getPropertyType() + " on object: " + mappedObject); } else { throw e; } } if (populatedProperties != null) { populatedProperties.add(pd.getName()); } } catch (NotWritablePropertyException ex) { throw new DataRetrievalFailureException( "Unable to map column " + column + " to property " + pd.getName(), ex); } } else {/// *****就是修改這個地方了!?。。?/span> Object value = JdbcUtils.getResultSetValue(rs, index); ((BaseEntity)mappedObject).setAliasField(column, value); } } if (populatedProperties != null && !populatedProperties.equals(this.mappedProperties)) { throw new InvalidDataAccessApiUsageException("Given ResultSet does not contain all fields " + "necessary to populate object of class [" + this.mappedClass + "]: " + this.mappedProperties); } return mappedObject; }

剩下的就是具體的Bean,繼承BaseEntity,比如:

public class Demo extends BaseEntity implements Serializable { public static final long serialVersionUID = 2233912281609962999L; private Integer id; private String name; private String password; private Date createTime; private Integer type; public Demo() { super.queryBuilder = new QueryBuilder(this); } public void setId (Integer id) { this.id = id; } public Integer getId () { return this.id; } public void setName (String name) { this.name = name; } public String getName () { return this.name; } public void setPassword (String password) { this.password = password; } public String getPassword () { return this.password; } public void setCreateTime (Date createTime) { this.createTime = createTime; } public Date getCreateTime () { return this.createTime; } public void setType (Integer type) { this.type = type; } public Integer getType () { return this.type; } }

查詢的時候,就能夠通過Demo Bean取出非表字段的數(shù)據,通過getAliasFields(String field)方法。個人感覺能夠提高1定的便捷性,后續(xù)會加入sbrom中,關于sbrom可以查看http://blog.csdn.net/yefeng_918/article/details/44747033,歡迎吐槽!

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美区国产区 | 国产不卡免费视频 | 97午夜理伦影院在线观看 | 国产72av国片精品jk制服 | 久久精品视频7 | 国产精品久久久久久久久夜色 | 亚洲精品成人久久 | 色播亚洲 | 亚洲国产高清视频在线观看 | 四虎永久免费网站入口2020 | 亚洲色图欧美色 | 国内精品一区视频在线播放 | 国产三级自拍视频 | 一本大道卡一卡二卡三视频 | 国产乱码精品一区二区三 | 午夜三级成人三级 | 琪琪在线观看 | 免费黄色网址大全 | 亚洲成在人线av | 精品视频一区二区三区免费 | 成人男女啪啪免费观看网站 | www在线观看免费 | 91精品人成在线观看 | 伊人99在线观看 | 久久久青草青青国产亚洲免观 | 另类小说校园春色 | 永久免费看片 | 国产精品国产欧美综合一区 | 久久国产精品一区 | 男女上下爽无遮挡午夜免费视频 | jizz日本老师| 国内精品久久久久久久999下 | 国产综合成人久久大片91 | 免费成年人在线观看视频 | 一级做a爰片性色毛片黄书 一级做a爰片性色毛片男 | 亚洲天堂久久 | 久久视频精品a线视频在线观看 | 最新亚洲| 日韩国产欧美视频 | 性福天堂网站 | 欧美一级人与动毛片免费播放 |