1. 程式人生 > >根據查詢條件搜尋商品sql語句的寫法

根據查詢條件搜尋商品sql語句的寫法

問題:

在使用者使用查詢功能的時候,從前端傳送給我們後端的資訊(如下圖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()); } }