1. 程式人生 > >mybatis框架的動態sql語句

mybatis框架的動態sql語句

  今天突然聽到動態sql語句這個名字,我想了一下,好像腦袋裡面沒有這個概念;上網查了查,動態和靜態都分別是什麼?

  • 拼接sql語句來實現增刪改查,可以讓程式碼複用性增強;
  • 靜態sql就是平常寫死的sql語句;

非mybatis框架的持久層

  • 從前我的動態sql是這樣拼接,通過一個str空字串,判斷傳來的引數是否為空,如果為空不在where 1=1 後面拼接,如果傳過來了,那麼就拼接;
/**
	 * 獲取分頁資料
	 */
	@Override
	public List<Map<String, Object>> getPage(int start, int rows,
Map map) { // TODO Auto-generated method stub //排序引數 String str = ""; if(map.get("sort")!=null){ str = " order by "+map.get("sort")+" "+map.get("order"); } System.out.println("select id,number,driver,store,type,color,volume,capacity,state from tb_car "+setParams(map)+str+" limit "+start+
","+rows); return BaseDao.selectMap("select id,number,driver,store,type,color,volume,capacity,state from tb_car "+setParams(map)+str+" limit "+start+","+rows, null); } /** * 封裝引數 * @param map * @return */ private String setParams(Map map){ //查詢引數 String str1 = " where 1=1 "; Object id =
map.get("id"); //拼接id if(id!=null&&!"".equals(id)){ str1 += " and id ="+id; } //拼接numbmer Object number = map.get("number"); //拼接numbmer if(number!=null&&!"".equals(number)){ str1 += " and number ="+number; } return str1; }

使用Mybatis框架

  • 現在學了Mybatis框架,動態sql就可以更改成使用 <where></where>標籤巢狀<if></if>標籤來拼接字串,這裡<where>有一個潛規則(mybatis底層框架封裝的一個小功能),如果第一個條件是 and 或者or 那麼就直接替換成where,這樣的好處是我們不用在sql語句後面拼接where 1=1 這個條件,使用<where>標籤就可以替換and和or;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--dao層介面的全路徑-->
<mapper namespace="com.aaa.mb.dao.EmpDao">
    <!--動態sql-->
    <select id="getList" parameterType="Map" resultType="Map">
      select * from emp
      <where>
          <if test="empno != null and empno != ''">
              and empno = #{empno}
          </if>
          <if test="ename != null and ename != ''">
              and ename like '%'||#{ename}||'%'
          </if>
          <if test="job != null and job != ''">
              and job = #{job}
          </if>
          <if test="beginTime != null and beginTime != ''">
              and hiredate &gt; to_date(#{beginTmie}, 'yyyy-mm-dd')
          </if>
            <if test="endTime != null and endTime != ''">
                and hiredate &lt; to_date(#{endTmie}, 'yyyy-mm-dd')
            </if>
      </where>
    </select>

補充:Map傳值的大小寫問題

  • 我的mybatis版本 在這裡插入圖片描述
  • mybatis的sql語句的編寫的欄位名,可以為小寫,例如第一個and之後的empno的資料庫內為大寫,這裡寫EMPNO,EMPno,EmpNo都不影響查詢結果,意思就是.xml檔案裡面的欄位名都不區分大小寫。
     <select id="getList" parameterType="Map" >
     。。。。。。此處為省略的程式碼。。。
	  <if test="empno1 != null and empno1 != ''">
              and empno = #{empno1}
          </if>
    。。。。。。此處為省略的程式碼。。。
  • 但是後面那個empno1就有講究了,其他三個empno1,都是Map的put方法的傳入的key值,key值必須得與這三個值相同。例如:
	Map paramMap = new HashMap();
        paramMap.put("empno1",9876);