DBUtils与C3P0结合--支持自定义字段映射和线程池

1.首先是MyBeanProcessor:

重写BeanProcessor的实现,使用策略模式

[java]  view plain copy
  1. package c3p0.util2;  
  2.   
  3. import java.beans.PropertyDescriptor;  
  4. import java.sql.ResultSetMetaData;  
  5. import java.sql.SQLException;  
  6. import java.util.Arrays;  
  7.   
  8. import org.apache.commons.dbutils.BeanProcessor;  
  9. /** 
  10.  * 策略模式的BeanProcessor 
  11.  */  
  12. public class MyBeanProcessor extends BeanProcessor {  
  13.     private Matcher matcher;  
  14.   
  15.     public MyBeanProcessor() {  
  16.     }  
  17.   
  18.     public MyBeanProcessor(Matcher matcher) {  
  19.         this.matcher = matcher;  
  20.     }  
  21.   
  22.     public Matcher getMatcher() {  
  23.         return matcher;  
  24.     }  
  25.   
  26.     public void setMatcher(Matcher matcher) {  
  27.         this.matcher = matcher;  
  28.     }  
  29.   
  30.     /** 
  31.      * 重写BeanProcessor的实现,使用策略模式 
  32.      */  
  33.     protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,  
  34.             PropertyDescriptor[] props) throws SQLException {  
  35.         if (matcher == null)  
  36.             throw new IllegalStateException("Matcher must be setted!");  
  37.         int cols = rsmd.getColumnCount();  
  38.         int columnToProperty[] = new int[cols + 1];  
  39.         Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);  
  40.         for (int col = 1; col <= cols; col++) {  
  41.             String columnName = rsmd.getColumnLabel(col);  
  42.             if (null == columnName || 0 == columnName.length()) {  
  43.                 columnName = rsmd.getColumnName(col);  
  44.             }  
  45.             for (int i = 0; i < props.length; i++) {  
  46.                 if (matcher.match(columnName, props[i].getName())) {// 与BeanProcessor不同的地方  
  47.                     columnToProperty[col] = i;  
  48.                     break;  
  49.                 }  
  50.             }  
  51.         }  
  52.   
  53.         return columnToProperty;  
  54.     }  
  55. }  

MyBeanProcessor重写了BeanProcessor的mapColumnsToProperties方法,把原先写死的字段名与属性名的匹配逻辑交由Matcher来实现

2.Matcher是一个接口,它是”字段名与属性名是否匹配”的抽象.

下面是接口Matcher:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.recommend.utils.db;  
  2.   
  3. public interface Matcher {  
  4.     /** 
  5.      * 判断字段名与属性名是否匹配 
  6.      *  
  7.      * @param columnName 
  8.      *            字段名 
  9.      * @param propertyName 
  10.      *            属性名 
  11.      * @return 匹配结果 
  12.      */  
  13.     boolean match(String columnName, String propertyName);  
  14. }  

3.match.三个个常用实现,分别是MappingMatcher(二维数组匹配)与HumpMatcher(驼峰命名匹配)以及XmlMatcher:

XmlMatcher:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.recommend.utils.db;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.HashMap;  
  9.   
  10. import com.recommend.utils.StringUtil;  
  11. import com.recommend.utils.parser.Field;  
  12. import com.recommend.utils.parser.FieldFactory;  
  13.   
  14. public class XmlMatcher implements Matcher {  
  15.     private static Map<String,String> xmlMap = new HashMap<String,String>();   
  16.     public XmlMatcher(){  
  17.         loadXml();  
  18.     }  
  19.     @Override  
  20.     public boolean match(String columnName, String propertyName) {  
  21.         if(columnName!=null&&xmlMap.containsKey(columnName)){  
  22.             if(!StringUtil.isEmpty(propertyName)&&xmlMap.get(columnName).equals(propertyName)){  
  23.                 return true;  
  24.             }  
  25.         }  
  26.         return false;  
  27.     }  
  28.     public static void loadXml(){  
  29.         Field dbFieldList = null;  
  30.         try {  
  31. //          String path = XmlMatcher.class.getProtectionDomain().getCodeSource().getLocation().getPath().split("classes")[0]+"classes/ArticleMonitorMemory.hbm.xml";  
  32.             String path="E:\\BaiduYunDownload\\workspace\\label\\src\\bean\\PositionData.hbm.xml";  
  33.             dbFieldList = FieldFactory.getFieldByXML(new FileInputStream(new File(path)));  
  34.         } catch (FileNotFoundException e1) {  
  35.             e1.printStackTrace();  
  36.         }  
  37.         for (Field dbFirld : dbFieldList.getFieldList()) {  
  38.             List<Field> classFieldList = dbFirld.getFieldList();  
  39.   
  40.             for (Field classField : classFieldList) {  
  41.                 String name="";  
  42.                 String column="";  
  43.                 name = classField.getAttributebuteByName("name").getFieldContent();  
  44.                 List<Field>  idFieldList = classField.getFieldList();  
  45.                 for (Field idField : idFieldList) {  
  46.                     if("column".equals(idField.getFieldName())){  
  47.                         column=idField.getAttributebuteByName("name").getFieldContent();  
  48.                     }  
  49.                 }  
  50.                   
  51.                 xmlMap.put(column,name);  
  52.             }  
  53.                   
  54.         }  
  55.   
  56.     }  
  57.     public static void main(String[] args) {  
  58.         loadXml();  
  59.     }  
  60. }  

HumpMatcher:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.recommend.utils.db;  
  2.   
  3. /** 
  4.  * 驼峰转换的匹配器 
  5.  *  
  6.  */  
  7. public class HumpMatcher implements Matcher {  
  8.     @Override  
  9.     public boolean match(String columnName, String propertyName) {  
  10.         if (columnName == null)  
  11.             return false;  
  12.         columnName = columnName.toLowerCase();  
  13.         String[] _ary = columnName.split("_");  
  14.         StringBuilder strBuilder = new StringBuilder();  
  15.         for (int i = 0; i < _ary.length; i++) {  
  16.             String str = _ary[i];  
  17.             if (!"".equals(str) && i > 0) {  
  18.                 StringBuilder _builder = new StringBuilder();  
  19.                 str = _builder.append(str.substring(01).toUpperCase())  
  20.                         .append(str.substring(1)).toString();  
  21.             }  
  22.             strBuilder.append(str);  
  23.         }  
  24.         return strBuilder.toString().equals(propertyName);  
  25.     }  
  26. }  

MappingMatcher:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.recommend.utils.db;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. /** 
  7.  * 二维数组映射的匹配器 
  8.  *  
  9.  */  
  10. public class MappingMatcher implements Matcher {  
  11.     private Map<String, String> _map = null;  
  12.   
  13.     public MappingMatcher(String[][] mapping) {  
  14.         if (mapping == null)  
  15.             throw new IllegalArgumentException();  
  16.         _map = new HashMap<String, String>();  
  17.         for (int i = 0; i < mapping.length; i++) {  
  18.             String columnName = mapping[i][0];  
  19.             if (columnName != null)  
  20.                 _map.put(columnName.toUpperCase(), mapping[i][1]);  
  21.         }  
  22.     }  
  23.   
  24.     public boolean match(String columnName, String propertyName) {  
  25.         if (columnName == null)  
  26.             return false;  
  27.         String pname = _map.get(columnName.toUpperCase());  
  28.         if (pname == null)  
  29.             return false;  
  30.         else {  
  31.             return pname.equals(propertyName);  
  32.         }  
  33.     }  
  34. }  

4.创建连接池的数据源对象

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.recommend.utils.db;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.    
  8. import java.util.List;  
  9.   
  10. import org.apache.commons.dbutils.BasicRowProcessor;  
  11. import org.apache.commons.dbutils.QueryRunner;  
  12. import org.apache.commons.dbutils.handlers.BeanHandler;  
  13. import org.apache.commons.dbutils.handlers.BeanListHandler;  
  14. import org.apache.commons.dbutils.handlers.ScalarHandler;  
  15.   
  16. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  17.    
  18. public class JdbcUtilC3P0 {  
  19.     // 创建连接池的数据源对象  
  20.     // 指定的是从c3p0-config.xml配置文件中选择那个链配置进行连接  
  21.     //读取c3p0-config.xml name为mysql  
  22.     private static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql");  
  23.       
  24.     private static QueryRunner run;  
  25.       
  26.     public JdbcUtilC3P0(){  
  27.         cpds = new ComboPooledDataSource();  
  28.         run = new QueryRunner(cpds);  
  29.     }  
  30.       
  31.     public JdbcUtilC3P0(String sqlName){  
  32.         cpds = new ComboPooledDataSource(sqlName);  
  33.         run = new QueryRunner(cpds);  
  34.     }  
  35.    
  36.     // 书写返回连接对象的方法  
  37.     public static Connection getConn() {  
  38.         try {  
  39.             return cpds.getConnection();  
  40.         } catch (SQLException e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.         return null;  
  44.     }  
  45.    
  46.     /** 
  47.      * 查询返回单个对象 
  48.      *  
  49.      * @param sql 
  50.      * @param clazz 
  51.      * @return 
  52.      */  
  53.     public <T> T queryForObject(String sql, Object params[], Class<T> clazz) {  
  54.         T obj = null;  
  55.         try {  
  56.             showSql(sql);  
  57.             obj = (T) run.query(sql, new BeanHandler(clazz,new BasicRowProcessor(new MyBeanProcessor(new HumpMatcher()))), params);  
  58.         } catch (SQLException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.         return obj;  
  62.     }  
  63.   
  64.     /** 
  65.      * 查询返回list对象 
  66.      *  
  67.      * @param sql 
  68.      * @param clazz 
  69.      * @return 
  70.      */  
  71.     public <T> List<T> queryForList(String sql, Object[] params, Class<T> clazz) {  
  72.         List<T> obj = null;  
  73.         try {  
  74.             showSql(sql);  
  75.             obj = (List<T>) run.query(sql, new BeanListHandler(clazz), params);  
  76.         } catch (SQLException e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.         return obj;  
  80.     }  
  81.       
  82.     /** 
  83.      * 保存返回主键 
  84.      *  
  85.      * @param sql 
  86.      * @param param 
  87.      * @return 
  88.      */  
  89.     public int storeInfoAndGetGeneratedKey(String sql, Object[] params) {  
  90.         int pk = 0;  
  91.         try {  
  92.             showSql(sql);  
  93.             run.update(sql, params);  
  94.             pk = ((Long) run.query("SELECT LAST_INSERT_ID()"new ScalarHandler(1))).intValue();  
  95.         } catch (SQLException e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.         return pk;  
  99.     }  
  100.   
  101.     /** 
  102.      * 更新 
  103.      *  
  104.      * @param sql 
  105.      * @return 
  106.      */  
  107.   
  108.     public int update(String sql, Object[] params) {  
  109.         int i = 0;  
  110.         try {  
  111.             showSql(sql);  
  112.             i = run.update(sql, params);  
  113.         } catch (SQLException e) {  
  114.             e.printStackTrace();  
  115.         }  
  116.         return i;  
  117.   
  118.     }  
  119.       
  120.     /** 
  121.      * 插入 
  122.      *  
  123.      * @param sql 
  124.      * @param clazz 
  125.      * @param param 
  126.      * @return 
  127.      */  
  128.     public <T> int insert(String sql,Class<T> clazz, Object[] params){  
  129.         int i = 0;  
  130.         try {  
  131.             showSql(sql);  
  132.             i = run.insert(sql, new BeanListHandler(clazz), params);  
  133.         } catch (SQLException e) {  
  134.             e.printStackTrace();  
  135.         }  
  136.         return i;  
  137.     }  
  138.       
  139.     private void showSql(String sql) {  
  140.         System.out.println(sql);  
  141.     }  
  142.     // 释放资源的操作  
  143.     public static void release(ResultSet rs, PreparedStatement pstmt,  
  144.             Connection conn) {  
  145.         if (rs != null) {  
  146.             try {  
  147.                 rs.close();  
  148.             } catch (SQLException e) {  
  149.                 // TODO Auto-generated catch block  
  150.                 e.printStackTrace();  
  151.             }  
  152.         }  
  153.         if (pstmt != null) {  
  154.             try {  
  155.                 pstmt.close();  
  156.             } catch (SQLException e) {  
  157.                 // TODO Auto-generated catch block  
  158.                 e.printStackTrace();  
  159.             }  
  160.         }  
  161.         if (conn != null) {  
  162.             try {  
  163.                 conn.close();  
  164.             } catch (SQLException e) {  
  165.                 // TODO Auto-generated catch block  
  166.                 e.printStackTrace();  
  167.             }  
  168.         }  
  169.    
  170.     }  
  171. }  

重点调用:

QueryRunner run = new QueryRunner(dataSource);

ResultSetHandler<List<Person>> h = new BeanListHandler(Person.class, new BasicRowProcessor(new MyBeanProcessor(new HumpMatcher())));

List<Person> persons = run.query("SELECT * FROM Person", h);


5.XML文件:

c3p0-config.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!--?xml version="1.0" encoding="UTF-8"?-->  
  2. <c3p0-config>  
  3.   <named-config name="pgsql">  
  4.     <property name="jdbcUrl">jdbc:postgresql://10.15.187.70/plproxy</property>          
  5.     <property name="driverClass">org.postgresql.Driver</property>         
  6.     <property name="user">postgres</property>         
  7.     <property name="password"></property>  
  8.     <property name="initialPoolSize">10</property>        
  9.     <property name="maxPoolSize">30</property>  
  10.     <property name="minPoolSize">10</property>  
  11.     <property name="acquireIncrement">5</property>  
  12.   </named-config>  
  13.      
  14.   <named-config name="mysql">  
  15.         <property name="driverClass">com.mysql.jdbc.Driver</property>  
  16.         <property name="jdbcUrl">jdbc:mysql://10.15.172.108/userdata</property>  
  17.         <property name="user">userdata</property>  
  18.         <property name="password">43f59a7e5d</property>  
  19.            
  20.         <property name="acquireIncrement">5</property>  
  21.         <property name="initialPoolSize">10</property>  
  22.         <property name="minPoolSize">5</property>  
  23.         <property name="maxPoolSize">30</property>  
  24.     </named-config>  
  25.       
  26.     <named-config name="article_npro">  
  27.         <property name="driverClass">com.mysql.jdbc.Driver</property>  
  28.         <property name="jdbcUrl">jdbc:mysql://dbserver_article_npro/article_npro</property>  
  29.         <property name="user">pro_admin</property>  
  30.         <property name="password">3c2d4c41</property>  
  31.            
  32.         <property name="acquireIncrement">5</property>  
  33.         <property name="initialPoolSize">10</property>  
  34.         <property name="minPoolSize">5</property>  
  35.         <property name="maxPoolSize">30</property>  
  36.     </named-config>  
  37. </c3p0-config>  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值