Java设计模式透析:策略(Strategy)

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会。要帮什么 忙呢?你很好奇。

他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用 户的数据,现在需要完成一个选择性查询用户信息的功能。他说会传递给你一个包含许多用户名的数 组,你需要根据这些用户名把他们相应的数据都给查出来。

这个功能很简单的嘛,你爽快地 答应了。由于你们项目使用的是MySQL数据库,你很快地写出了如下代码:

public class QueryUtil {  

    public void findUserInfo(String[] usernames) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection

("jdbc:mysql://localhost:3306/test", "root",
                "123456");
        Statement stat = conn.createStatement();
        StringBuilder sql = new StringBuilder("select * from user_info where ");
        for (String user : usernames) {
            sql.append("username = '");
            sql.append(user);
            sql.append("' or ");
        }
        System.out.println(sql);
        ResultSet resultSet = stat.executeQuery(sql.toString());
        while (resultSet.next()) {
            // 处理从数据库读出来的数据
        }
        // 后面应将读到的数据组装成对象返回,这里略去。
    }
}

这里根据传入的用户名数组拼装了SQL语句,然后去数据库中查找相应的行。为了方面调 试,你还将拼装好的SQL语句打印了出来。

然后,你写了如下代码来测试这个方法:

public class Test {  

    public static void main(String[] args) throws Exception {
        QueryUtil query = new QueryUtil();
        query.findUserInfo(new String[] { "Tom", "Jim", "Anna" });
    }  

}

现在运行一下测试代码,你发现程序出错了。于是你立刻去检查了一下打印的SQL语句, 果然发现了问题。

   select * from user_info where username = 'Tom' or username = 'Jim' or username = 'Anna' or  

拼装出来的SQL语句在最后多加了一个 or 关键字!因为for循环执行到最后一条数据时不应该再加上 or,可是代码很笨地给最后一条数据也加了or关键字,导致SQL语句语法出错了。

这可怎么办 呢?

有了!你灵光一闪,想出了一个解决办法。等SQL语句拼装完成后,把最后一个or删除掉 不就好了么。于是你将代码改成如下所示:

public class QueryUtil {  

    public void findUserInfo(String[] usernames) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection

("jdbc:mysql://localhost:3306/test", "root",
                "123456");
        Statement stat = conn.createStatement();
        StringBuilder sql = new StringBuilder("select * from user_info where ");
        for (String user : usernames) {
            sql.append("username = '");
            sql.append(user);
            sql.append("' or ");
        }
        sql.delete(sql.length() - " or ".length(), sql.length());
        System.out.println(sql);
        ResultSet resultSet = stat.executeQuery(sql.toString());
        while (resultSet.next()) {
            // 处理从数据库读出来的数据
        }
        // 后面应将读到的数据组装成对象返回,这里略去。
    }
}

使用StringBuilder的delete方法,把最后多余的一个or删除掉了,这样再运行测试代码 ,一切就正常了,打印的SQL语句如下所示:

select * from user_info where username = 'Tom' or username = 'Jim' or username = 'Anna'  

好了,完工!你自信满满。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, 数据
, stringbuilder
, 语句
, username
, 急 ames2 3 2运行出错
, 一个
, 拼装
拼装字符串
,以便于您获取更多的相关知识。

时间: 2024-10-31 15:03:50

Java设计模式透析:策略(Strategy)的相关文章

Java设计模式透析:组合(Composite)

听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户 可以在其中随意选购自己喜欢的书籍.你们公司也是对此项目高度重视,加大了投入力度,决定给此 应用再增加点功能. 好吧,你也知道你是逃不过此劫了,没过多久你的leader就找到了你. 他告诉你目前的应用对每本书的浏览量和销售量做了统计,但现在想增加对每个书籍分类的浏览量和 销售量以及所有书籍总的浏览量和销售量做统计的功能,希望你可以来完成这项功能. 领导 安排的工作当然是推脱不掉的,你只能硬着头皮上了,不过好在这个

Java设计模式透析:模板方法(Template Method)

今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告诉你,今天 想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以 XML格式进行包装,这样以后可以方便与客户端进行交互.并且在包装开始前和结束后要打印日志, 这样方便调试和问题定位. 没问题!你觉得这个功能简直是小菜一碟,非常自信地开始写起 代码. Book对象代码如下: public class Book { private String bookName; private int

Java设计模式透析:单例(Singleton)

写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助 你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至 像findbugs等代码检查工具还会认为使用System.out.println()是一个bug. 为什么作为Java 新手神器的System.out.println(),到了真正项目开发当中会被唾弃呢?其实只要细细分析,你就会 发现它的很多弊端.比如不可控制,所有的日志都会在项目上线后照常打印,从

Java设计模式透析:适配器(Adapter)

今天一大早,你的leader就匆匆忙忙跑过来找到你:"快,快,紧急任务!最近ChinaJoy马上就 要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数." 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢 ? "没关系的."你的leader安慰你道:"功能其实很简单的,接口都已经提供好了,你只 需要调用一下就行了." 好吧,你勉为其难地接受了,对于这种突如其来的新需求,你早已 习惯.

Ruby设计模式透析:策略(Strategy)

今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会.要帮什么忙 呢?你很好奇. 他对你说,当前你们项目的数据库中有一张用户信息表,里面存放了很用户的 数据,现在需要完成一个选择性查询用户信息的功能.他说会传递给你一个包含许多用户名的数组,你 需要根据这些用户名把他们相应的数据都给查出来. 这个功能很简单的嘛,你爽快地答应了. 由于你们项目使用的是MySQL数据库,你很快地写出了如下代码: require 'mysql' class QueryUtil def fin

Ruby设计模式透析:模板方法(Template Method)

今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告诉你,今天想 在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML 格式进行包装,这样以后可以方便与客户端进行交互.并且在包装开始前和结束后要打印日志,这样方 便调试和问题定位. 没问题!你觉得这个功能简直是小菜一碟,非常自信地开始写起代码. Book对象代码如下: class Book attr_accessor :book_name, :pages, :price, :aut

Ruby设计模式透析:单例(Singleton)

写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你 分析数据,但是Ruby原生带有的puts方法却很少在真正的项目开发中使用. 为什么作为Ruby新 手神器的puts,到了真正项目开发当中会被唾弃呢?其实只要细细分析,你就会发现它的很多弊端.比 如不可控制,所有的日志都会在项目上线后照常打印,从而降低运行效率:又或者不能将日志记录到本 地文件,一旦打印被清除,日志将再也找不回来:再或者打印的内容没有Tag区分,你将很难辨别这一 行日志是在哪个类里打印的. 你的

Ruby设计模式透析:组合(Composite)

听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户可 以在其中随意选购自己喜欢的书籍.你们公司也是对此项目高度重视,加大了投入力度,决定给此应用 再增加点功能. 好吧,你也知道你是逃不过此劫了,没过多久你的leader就找到了你.他告诉 你目前的应用对每本书的浏览量和销售量做了统计,但现在想增加对每个书籍分类的浏览量和销售量以 及所有书籍总的浏览量和销售量做统计的功能,希望你可以来完成这项功能. 领导安排的工作 当然是推脱不掉的,你只能硬着头皮上了,不过好在这个

Ruby设计模式透析:适配器(Adapter)

今天一大早,你的leader就匆匆忙忙跑过来找到你:"快,快,紧急任务!最近ChinaJoy马上就要 开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数." 你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢? "没关系的."你的leader安慰你道:"功能其实很简单的,接口都已经提供好了,你只需要 调用一下就行了." 好吧,你勉为其难地接受了,对于这种突如其来的新需求,你早已习惯. 你