JDBC中like查询问题(cobar)

一 8th, 2013

今天小朋友在写接口测试的时候,碰到一个sql查询的问题,代码块类似于下面

String sql = select * from s_user t where t.userName like '%c%'" ; 
PreparedStatement state = conn.prepareStatement(sql);  
ResultSet resultSet = state.executeQuery(); // 执行查询,返回结果接集合 

经过google发现,这是JDBC存在的一个问题,需要参数化传入like后面的值,网上找的一个解决方案,试用后发现OK:

//调用
Object[] para = new Object[]{"%c%"};  
 List<Object[]> list = excuteQuery("select * from s_user t where t.userName like ?",para);  

//抽象的一个方法 
public static List<Object[]> excuteQuery(String sql, Object[] objs) {  
    Connection conn = null;  
    PreparedStatement psta = null;  
    ResultSet rs = null;  
    List<Object[]> iResult = null;  
    Object[] objArr = null;  
    try {  
        conn = getConn(); // 得到链接  
        PreparedStatement state = conn.prepareStatement(sql);  
        if(null != objs){  
            for (int i = 0; i < objs.length; i++) {  
                state.setObject(i + 1, objs[i]);  
            }  
        }  
        ResultSet resultSet = state.executeQuery(); // 执行查询,返回结果接集合  
        iResult = new ArrayList<Object[]>();  
        int count = resultSet.getMetaData().getColumnCount(); // 一共有多少列数据  
        while (resultSet.next()) {  
            objArr = new Object[count];  
            for (int i = 1; i <= count; i++) {  
                objArr[i - 1] = resultSet.getObject(i); // 增加到返回的集合中  
            }  
            iResult.add(objArr);  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
        iResult = null;  
    } finally {  
        try {  
            if (rs != null) {  
                rs.close();  
            }  
            if (psta != null) {  
                psta.close();  
            }  
            if (conn != null) {  
                conn.close();  
            }  
        } catch (Exception e2) {  
  
        }  
    }  
    return iResult;  
}  
    

 

问题

      上述可以解决一般的问题,但是在我们的接口环境中,后台数据库并不是一个简单的MYSQL,而是使用阿里开发的一个开源的关系型数据的分布式处理系统,cobar (相关介绍可以连接到产品首页去看)。cobar的一个特点是采用分布键进行hash,它会根据分布键从不同的库中找到满足条件的值返回。在也就是说where a  like ‘%c%’,当a是分布键,其like查询存在一个bug,无法找到相应的值,这个问题可能在一些新的版本中已经修复,或者说该问题是需要访问者使用指定版本的JDBC进行访问,总之,在这里,我们出现了当like用到的属性分布键的话,会存在无法得到返回值的情况。

总结一下,需要找cobar的开发人员确认的几个问题:

  • 1. cobar存在这个问题,也没有修复,原因是什么?
  • 2. cobar新版本已修复,修复的方案是什么?
  • 3. 这不是cobar的问题,是JDBC没有更新到指定版本的问题,cobar需要认JDBC的版本么?
  • 4. 看看cobar是否还有其他的雷区?应该有些规范或者注意事项吧?

附上like的常见错误写法(可以收集一些错误案例):

    错误写法1:
    String  sql = select * from s_user t where t.userName like '%c%'" ; 
    List<Object[]> list = excuteQuery("select * from s_user t where t.userName like '%?%'");
    错误写法2:
    Object[] para = new Object[]{"c"};  
    List<Object[]> list = excuteQuery("select * from s_user t where t.userName like '%?%'",para);




除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/51677

订阅本站:http://www.wangyuxiong.com/feed

分类: 工作笔记 海量数据         标签: , ,
目前还没有任何评论.

无觅相关文章插件,快速提升流量