修改DbUtils支持表名下划线映射

Commons DbUtils很一个很好用JDBC工具类,地球人都知道,就不介绍了,不知道的看这里:http://commons.apache.org/dbutils/

在进行查询自动类映射的时候domain类的属性必须和数据库中名称一样,但是如果数据库的表名使用带下划线的设计,domain类中的属性也要使用下划线,看起来很不雅观,而且使用hibernate工具自动生成的domain类会自动去掉下划线,下划线后面的用大写字母,比如user_name转换后为userName,因此有必要让DbUtils支持这种设计。

好,目标已经明确,下来就是开工了!

1、下载DbUtils的源代码

2、找到commons-dbutils-1.2-src\src\java\org\apache\commons\dbutils下的BeanProcessor.java,增加一个函数,代码如下:

  1. private String getPropertyName(String columnName){
  2. StringBuilder sb = new StringBuilder();
  3. boolean match =false;
  4. for (int i=0; i<columnName.length(); i++){
  5. char ch = columnName.charAt(i);
  6. if (match && ch>=97 && ch<=122)
  7. ch -= 32;
  8. if (ch!='_'){
  9. match = false;
  10. sb.append(ch);
  11. }else{
  12. match = true;
  13. }
  14. }
  15. return sb.toString();
  16. }

修改mapColumnsToProperties函数,红色部分是修改的地方。

  1. protectedint[] mapColumnsToProperties(ResultSetMetaData rsmd,
  2. PropertyDescriptor[] props) throws SQLException {
  1. int cols = rsmd.getColumnCount();
  2. int columnToProperty[] =newint[cols +1];
  3. Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
  4. for (int col =1; col <= cols; col++) {
  5. String columnName = <SPAN style="COLOR: #ff0000"><STRONG>getPropertyName(rsmd.getColumnName(col));</STRONG></SPAN>
  6. for (int i =0; i < props.length; i++) {
  7. if (columnName.equalsIgnoreCase(props[i].getName())) {
  8. columnToProperty[col] = i;
  9. break;
  10. }
  11. }
  12. }
  13. return columnToProperty;
  14. }

DButils的 1.3版本似乎已经修正了这个bug了吧,sql中可以使用别名来避免。

  1. protectedint[] mapColumnsToProperties(ResultSetMetaData rsmd,
  2. PropertyDescriptor[] props) throws SQLException {
  1. int cols = rsmd.getColumnCount();
  2. int columnToProperty[] =newint[cols +1];
  3. Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
  4. for (int col =1; col <= cols; col++) {
  5. //已经改过来为getColumnLabel了
  6. String columnName = rsmd.getColumnLabel(col);
  7. if (null == columnName ||0 == columnName.length()) {
  8. columnName = rsmd.getColumnName(col);
  9. }
  10. for (int i =0; i < props.length; i++) {
  11. if (columnName.equalsIgnoreCase(props[i].getName())) {
  12. columnToProperty[col] = i;
  13. break;
  14. }
  15. }
  16. }
  17. return columnToProperty;
  18. }

/**
* 根据雇员编码获取一个雇员 若放回null,则为找到
*/
public Employee getEmployeeByCode(int empCode) throws ApplicationException,
SQLException {
Connection conn = OracleDBUtils.getConnection();

// 为了处理表里字段的下划线 与javabean属性对应,CustomBeanProcessor继承了BeanProcessor,
// 并且重写BeanProcessor里方法mapColumnsToProperties
CustomBeanProcessor convert = new CustomBeanProcessor();
RowProcessor rp = new BasicRowProcessor(convert);
Object[] params = { empCode };
ResultSetHandler<Employee> rsh = new BeanHandler<Employee>(
Employee.class, rp);
return qr.query(conn, SQL_GET_EMPLOYEE_BYCODE, rsh, params);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值