论坛首页 Java企业应用论坛

对于部分字段不确定的系统,该如何选择持久层

浏览 5768 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-19  
最近在考虑将一个遗留系统改为BS版本。这个系统99%的字段是确定的,但是根据具体的用户,可能在原来表的基础上添加一些字段(字段名具有相同的前缀可以与系统字段相区别)。对于这种情况,该如何选择持久层?我不希望针对每个客户都改动代码。

1)hibernate。有段时间没接触Hibernate了,Hibernate能在运行时改变映射吗?在我的映像中好像没这个功能。并且对于新增的字段应该是要映射到po的一个Map中(因为字段数目不确定、类型不确定)(使用iBatis也应该是这种思路)。

2)iBatis:
  • 如果采用resultMap,难以满足需求(原因同hibernate)。
  • 剩余的选择就是resultClass="java.util.HashMap<字段名,Object>",但感觉这样太过别扭了,也没能充分利用iBatis的优势。
  • 也同样采用resultClass="java.util.HashMap<字段名,Object>",但手动将Map转换为PO、同时提取自定义字段。好像与直接使用JDBC没什么差别
3)Spring:用StringBuffer组装sql语句实在难看~~
4)JDBC @_@

请问大家有没有更好的选择?谢谢
   发表时间:2007-05-19  
jdbc非常的方便,为什么不用jdbc呢?

以前的公司已完成此功能
0 请登录后投票
   发表时间:2007-05-19  
check out hibernate dynamic models and tuplizers
0 请登录后投票
   发表时间:2007-05-20  
谢谢各位~~
因为是旧系统,用Hibernate风险太大了。
花了点时间读了iBatis源码,用TypeHandlerCallback解决了这个问题。
局限性:就如前面所说,字段名应该有一定的规律

java 代码
 
  1. package model;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. /** 
  7.  * @author walkingcat 
  8.  * 
  9.  */  
  10. public class Document {  
  11.     private Map<String, Object> userFields = new HashMap<String, Object>();  
  12. ……  
xml 代码
 
  1.     <resultMap id="DocumentResult" class="Document">  
  2.         <result property="userFields" column="U_" typeHandler="ibatis.UserFieldsTypeHandlerCallback"/>  
  3. ……  
  4.     </resultMap>  
xml 代码
 
  1. <select id="loadByDocNum" parameterClass="java.util.Map" resultMap="DocumentResult">   
  2.     <![CDATA[ 
  3.     SELECT M.* 
  4.       FROM $masterTable$ M 
  5.      WHERE M.DocNum=#docNum#  
  6.     ]]>  
  7. </select>  

java 代码
 
  1. /** 
  2.  *  
  3.  */  
  4. package ibatis;  
  5.   
  6. import java.sql.ResultSet;  
  7. import java.sql.ResultSetMetaData;  
  8. import java.sql.SQLException;  
  9. import java.util.HashMap;  
  10. import java.util.Map;  
  11.   
  12. import com.ibatis.sqlmap.client.extensions.ParameterSetter;  
  13. import com.ibatis.sqlmap.client.extensions.ResultGetter;  
  14. import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;  
  15.   
  16. /** 
  17.  * @author walkingcat 
  18.  * 
  19.  */  
  20. public class UserFieldsTypeHandlerCallback implements TypeHandlerCallback {  
  21.   
  22.     /* (non-Javadoc) 
  23.      * @see com.ibatis.sqlmap.client.extensions.TypeHandlerCallback#getResult(com.ibatis.sqlmap.client.extensions.ResultGetter) 
  24.      */  
  25.     public Object getResult(ResultGetter getter) throws SQLException {  
  26.         Map<String, Object> result = new HashMap<String, Object>();  
  27.   
  28.         ResultSet rs = getter.getResultSet();  
  29.         ResultSetMetaData rsmd = rs.getMetaData();  
  30.         for (int i = 1; i <= rsmd.getColumnCount(); i++) {  
  31.             String name = rsmd.getColumnName(i);                  
  32.             if (name.startsWith("U_")) {  
  33.                 result.put(name, rs.getObject(i));  
  34.             }  
  35.         }  
  36.         return result;  
  37.     }  
  38. ……  
0 请登录后投票
   发表时间:2007-05-20  
要想灵活,肯定会需要一些限制。不过这种方式比用jdbc实现要好一点,想不到ibatis还有此功能。受益了!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics