用StringBuffer写数据查重代码

来源:互联网 发布:知乎 平面设计提高 编辑:程序博客网 时间:2024/05/20 14:43

在做项目期间,需要在Java后台代码中写一个当添加新数据时与数据库已存在数据进行查重的语句,特此记录。

// 进行-物料编码(产品编码)的查重 StringBuffer hql = new StringBuffer();hql.append("select a from Material as a where a.number = '"+ userForm.getNumber()+"'");List mtlLt = publicService.executeObjectSql(hql.toString());if(mtlLt.size()==0){    // 当数据不存在时需要执行的语句}       

补充:String与StringBuffer进行字符拼接的不同
String类用来表示那些创建后就不会再改变的字符串,它是immutable的。
StringBuffer类用来表示内容可变的字符串,并提供了修改底层字符串的方法。
当我们进行字符拼接时,应使用StringBuffer类而非String类,因为前者将比后者快上百倍。的确,在程序的太多场合我们都会进行字符串拼接工作,简单的代码示例如下:

 String hql="select a from Material as a "; hql+=" where a.number = '"+ userForm.getNumber()+"'";

如果用StringBuffer类的话,代码如下:

StringBuffer hql= new StringBuffer(" ");hql.append(" select a from Material as a where a.number = '"+ userForm.getNumber()+"' ");

从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:
经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为 String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将”select a from Material as a”和” where a.number = ‘”+ userForm.getNumber()+”’”创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String它当然不是最初的hql了,这个引用的名称没变,但它指向了新的String对象。
而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String(”where a.number = ‘”+ userForm.getNumber()+”’”),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换。