根據查詢條件搜尋商品sql語句的寫法
阿新 • • 發佈:2018-11-12
問題:
在使用者使用查詢功能的時候,從前端傳送給我們後端的資訊(如下圖4個資訊),有可能不是4個都填上的,所以導致我們Dao層的sql語句不能夠寫死,那麼我們該如何新增這個變化的變數進去sql語句呢?
解決程式碼:
首先,我們將從前端獲取的資料在web層的servlet封裝進map集合:
然後在Dao層寫上如下程式碼:
public class SearchProductDao {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource( ));
public List<Product> searchProduct(Map<String, Object> conditionMap) throws SQLException {
//因為不知道使用者輸入的是多小個資料,所以我們使用拼接字串的方式編寫sql語句
//使用where 1=1,是為了拼接以下條件成立的字串(and xxxxx),因為以下字串都包含and,所以需要一個where,如果不寫where = 1,那麼語句將變成"SELECT * FROM products AND XXXX "顯然是錯誤的,使用者一個也不寫where = 1也不會對語句有任何影響
StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM products WHERE 1=1 ");
//因為語句不確定長度,所以用先List來儲存需要新增的語句
List<Object> paramList = new ArrayList<Object>();
//從map集合獲取資料,判定是否有效字串,採用模糊搜尋
//如果成功"SELECT * FROM products WHERE 1=1 and pname like ? "
String pname = (String) conditionMap.get("pname");
//如果rname不為空或不為空字串就有效,就過濾
if (pname != null && !pname.trim().equals("")) {
//and前面需要新增一個空格,為防止語句變成“1and”,而使語句報錯
sqlBuilder.append(" and pname like ?");
//如果成立則新增進list集合
paramList.add("%" + pname + "%");
}
//如果成功"SELECT * FROM products WHERE 1=1 and Price >= ? "如此類推
String minPrice = (String) conditionMap.get("minPrice");
if (minPrice != null && !minPrice.trim().equals("")) {
sqlBuilder.append(" and Price >= ?");
paramList.add(minPrice);
}
String maxPrice = (String) conditionMap.get("maxPrice");
if (maxPrice != null && !maxPrice.trim().equals("")) {
sqlBuilder.append(" and Price <= ?");
paramList.add(maxPrice);
}
String category = (String) conditionMap.get("category");
if (category != null && !category.trim().equals("")) {
sqlBuilder.append(" and category like ?");
paramList.add(category);
}
//如果需要排序可在最後再拼接字串 sql += "order by desc``````寫具體條件"
//使sql語句變成1-3部分"SELECT * FROM products WHERE 1=1 " + "and xxxxx" + "order by xxxx"
//執行sql語句,根據上面條件判斷可知佔位符"?"的個數是0~4個,說明佔位符格式是否動態變化的
/*
* jdbcTemplate使用sql中佔位符"?"傳入值的方式有2種:
* 方式1.jdbcTemplate.query(sql, new BeanPropertyRowMapper<Product>(Product.class),佔位值1,佔位值2,...);
* 方式2.jdbcTemplate.query(sql, new BeanPropertyRowMapper<Product>(Product.class),固定長度的陣列);
* */
//將上面0~4個佔位符收集到固定長度數組裡面(動態長度佔位符使用List集合收集,List集合可以轉換為固定長度陣列)
//paramsList裡面儲存著0-4個佔位符值
//最後在這裡使用paramList.toArray()變成陣列
return jdbcTemplate.query(sqlBuilder.toString(), new BeanPropertyRowMapper<Product>(Product.class), paramList.toArray());
}
}