java多條件不定條件查詢
創(chuàng)新互聯建站專注于企業(yè)網絡營銷推廣、網站重做改版、紹興網站定制設計、自適應品牌網站建設、H5場景定制、商城網站建設、集團公司官網建設、成都外貿網站建設公司、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為紹興等各大城市提供網站開發(fā)制作服務。
網站或各類管理系統都會用到搜索,會用到一個或多個不確定條件搜索,單條件搜索比較簡單,有時候會有多個條件共同查詢,如果系統中已經提供了相關的方法供你使用最好,像我做這老系統改版,需要添加搜索,就要自己寫了。開始也沒管那么多,就是拼sql,但是后來發(fā)現要加搜索地方不少,總是這樣寫既增加了工作量,還要做很多重復工作,說不定以后還會做這樣的工作,所以還是寫一個比較通用的查詢方法。
package com.test;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.poi.hssf.record.formula.functions.T;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import com.ams.bo.webapi.dto.Agent;
public class MultiTaskSearch {
@Resource(name="jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Resource(name = "storeFrontDAO")
private Map search() {
String name="公司";
String email="@163";
String invoiceTitle="公司";
int sign=1;
String at="2012-04-26";
MapString, Object map=new LinkedHashMapString, Object();//保持添加順序
// MapString, Object map=new HashMapString, Object();//無固定順序
map.put("name like", name);
map.put("email like", email);
map.put("invoiceTitle like", invoiceTitle);
map.put("sign =", sign);
map.put("addtime=", at);
return map;
}
public T ListT dbSearch(Class typeClass,MapString, Object map,String orderby) {
String paths[] = { "ams-servlet.xml" };
ApplicationContext ctx = new ClassPathXmlApplicationContext(paths);
jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");
ListT TList=null;
String tablename = typeClass.getName().substring(
typeClass.getName().lastIndexOf(".") + 1);
StringBuffer sql=new StringBuffer("select * from ");
sql.append(tablename);
if (map.size()!=0) {
sql.append(" t where 1=1");//后面只需拼接and條件
}
SetEntryString, Object set=map.entrySet();
Iterator iterator=set.iterator();
for (int i = 0; i set.size(); i++) {
Map.Entry mapEntry=(Entry) iterator.next();
if (!"".equals(mapEntry.getValue().toString())) {
//模糊匹配
if (mapEntry.getKey().toString().contains("like")) {
// sql.append(" and t."+mapEntry.getKey()+" "+mapEntry.getValue()+" ");
sql.append(" and t."+mapEntry.getKey()+" '%"+mapEntry.getValue()+"%'");
//精確匹配
}else {
// sql.append(" and t."+mapEntry.getKey()+" '%"+mapEntry.getValue()+"%'");
sql.append(" and t."+mapEntry.getKey()+" "+mapEntry.getValue()+" ");
}
}
}
if (null!=orderby!"".equals(orderby)) {
sql.append(orderby);
}
System.out.println("SQL:"+sql.toString());
TList=jdbcTemplate.query(sql.toString(),new Object[] {}, new BeanPropertyRowMapperT (typeClass));
return TList;
}
public static void main(String[] args) {
MultiTaskSearch mt=new MultiTaskSearch();
Map map=mt.search();
String orderby=" order by addTime desc";
ListAgent agents=mt.dbSearch(Agent.class, map,orderby);
for (Agent agent : agents) {
System.out.println(agent.getName());
}
System.out.println("****************"+agents.size());
}
}
或者可以用拼sql的方法實現
使用union關鍵字可以在一個文本框內搜索出多個條件的數據
select t1.* from
(
select * from agent where name like '"2%'
union
select * from agent where email like '"2%'
union
select * from agent where ContactPerson like '"2%'
) t1
這種查詢結果是所有的集合,也可以把union換成or
可以這樣:根據判斷傳入參數是否為空格或null來判斷是否有這個查詢條件,來拼湊出不同的sql語句,例如
StringBuffer sb = new StringBuffer();
sb.append("select * from a where 1=1");
if(!"".equals("a") || null != a){
sb.append(" and a = " + a);
}
就像這樣來根據不同條件查詢
一般多個條件的時候,處理方式是 select * from table where 1 = 1先寫上這樣一個條件,這樣你以后的條件就可以直接用 if判斷了,比如現在有A ,B 兩個條件 就可以直接這樣
String sql = "select * from table where 1 = 1";
if( 條件A != null ){
sql += " and A =" + 條件A;
}
if( 條件B != null ){
sql += " and B =" + 條件B;
}
這樣就可以避免多種情況存在的問題
你這樣做輸出SS語句調試看看,你會發(fā)現你輸出的SQL語句有問題!
String ss="SELETE * FROM MESSAGE WHERE";
int i=1;char c='"';
if(na!=null)
{ss=ss+"AND 姓名='"+na+"'";i=0;
System.out.println(ss);
}
if(se!="")
{
if(i==0){ss=ss+"AND 性別='"+se+"'";i=0;}
else {ss=ss+"AND 性別='"+se+"'";i=1;}
}
if(xi!="")
{
if(i==0){ss=ss+"AND 系別='"+xi+"'";i=0;}
else {ss=ss+"AND 系別='"+xi+"'";i=1;}
}
if(zh!="")
{
if(i==0){ss=ss+"AND 專業(yè)='"+zh+"'";i=0;}
else {ss=ss+"AND 專業(yè)='"+zh+"'";i=1;}
}
if(ni!="")
{
if(i==0){ss=ss+"AND 年級='"+ni+"'";}
else {ss=ss+"AND 年級='"+ni+"'";}
}
ss=c+ss+c;
rs=sql.executeQuery(ss);
就拿第一個SQL語句來做示范,加入你的na值為abc,輸出的SS是 SELETE * FROM MESSAGE WHEREAND 姓名= 'abc'
仔細一看就知道SQL語句上很嚴重的錯誤 WHERE 后面接了AND關鍵詞
可以這樣改:ss=ss+" " + "姓名='"+na+"'" +" " +"AND";
最后使用replaceAll('AND$', ")") 替換最后一個AND字符穿?;蛘呤褂米址麆?chuàng)截取 去掉最后三個字符(AND)