91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis動態sql

發布時間:2020-07-20 06:20:02 來源:網絡 閱讀:572 作者:Adam的blog 欄目:開發技術

什么是動態sql

  MyBatis的強大特性之一便是動態sql,之前我們在用JDBC的時候,根據不同條件拼接SQL語句是很痛苦的事情,利用MyBatis的動態sql特性便可以解決這個問題。

動態sql的組成元素

  在學習動態sql之前,先來了解下ONGL,什么是ONGL呢?它和EL表達式差不多,是一種功能強大的表達式語言,用來獲取和設置Java對象的屬性。動態sql的實際使用元素并不多,無非就那幾種,但是它們帶來了靈活性的同時,很大程度上提高了程序的可讀性和可維護性。下面看下組成元素:
1)if元素:簡單的條件判斷
2)choose(when、otherwise)元素:相當于java中的switch
3)trim、where、set元素:重點,見代碼詳解


  1. sql映射文件

<!--
        查詢時如果某些條件沒有加上可能會出現sql拼裝錯誤的問題
        解決方法:
            1. 給where后面加上1=1,以后的條件都and xxx.
            2. mybatis使用where標簽來將所有的查詢條件包括在內,mybatis就會將where標簽中多余的and或or去除掉
                ps:where只會去除掉第一個多出來的or或and 
            3. 后面多出的and或者or,where標簽不能解決,用trim標簽解決(自定義字符串截取的規則)
                <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and"></trim> 
                    prefix="": 前綴,
                    prefixOverrides="":去掉前面的某些字符串,
                    suffix="":后綴,
                    suffixOverrides="":去掉后面的某些字符串
     -->
    <select id="getEmpsByConditionIf" resultType="com.zgz.MyBatis.bean.Employee">
        select id, last_name lastName, email, gender from tbl_employee
        <where>
            <!-- 
                OGNL表達式:
                    1. test里面寫判斷的條件
                    2. 特殊符號要轉義
                    3. ognl表達式會進行字符串和數字的轉換判斷,如:"1"==1 
            -->
            <if test="id!=null">
                id = #{id}
            </if>
            <if test="lastName!=null and lastName!=''">
                and last_name like #{lastName}
            </if>
            <if test="email!=null and email.trim()!=&quot;&quot;">
                and email = #{email}
            </if>
            <if test="gender==0 or gender==1">
                and gender = #{gender}
            </if>
        </where>
    </select>

    <!--
        where標簽用在查詢的時候,寫在sql語句外面
        set標簽用在更新的時候,寫在sql語句外面  
    -->
    <update id="updateEmp">
        update tbl_employee
        <set>
            <if test="lastName!=null">
                last_name=#{lastName},
            </if>
            <if test="email!=null">
                email=#{email},
            </if>
            <if test="gender!=null">
                gender=#{gender}
            </if>
        </set>
        <where>
            <if test="id!=null">
                id=#{id}
            </if>
        </where>
    </update>

  2.測試的接口方法

//攜帶了那個字段查詢條件就帶上這個字段的值
    public List<Employee> getEmpsByConditionIf(Employee employee);

    //更新操作
    public void updateEmp(Employee employee);

  3. 測試類

@Test
    public void testDynamicSQL() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperDynamicSQL mapperDynamicSQL = openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(3, "xiaoli", null, null);

            //測試where標簽
//          List<Employee> emps = mapperDynamicSQL.getEmpsByConditionIf(employee);
//          for(Employee emp: emps) {
//              System.out.println(emp);
//          }

            //測試set標簽
//          mapperDynamicSQL.updateEmp(employee);
//          openSession.commit();   //手動提交數據
        } finally {
            openSession.close();
        }
    }

4)foreach元素:重點,見代碼詳解


  1. sql映射文件

<select id="getEmpsByConditionForeach" resultType="com.zgz.MyBatis.bean.Employee">
        select * from tbl_employee where id in
        <!--
            foreach標簽:
                collection:指定要遍歷的集合,可以是List,數組,Set等集合
                item:示集合中每一個元素進行迭代時的別名
                separator:各個元素的分隔符 
                open和close:配置以什么符號將這些集合中的元素包裝起來
                index:當前元素在集合中的位置下標
         -->
        <foreach collection="ids" item="item" separator=","
            open="(" close=")">
            #{item}
        </foreach>
    </select>

  2.測試的接口方法

//測試foreach
    public List<Employee> getEmpsByConditionForeach(@Param("ids")List<Integer> ids);

  3. 測試類

@Test
    public void testDynamicSQL() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperDynamicSQL mapperDynamicSQL = openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(3, "xiaoli", null, null);

            //測試foreach標簽
            List<Integer> ids = new ArrayList<>();
            ids.add(1);
            ids.add(2);
            ids.add(3);
            ids.add(4);
            List<Employee> emps = mapperDynamicSQL.getEmpsByConditionForeach(ids);
            for(Employee emp :  emps) {
                System.out.println(emp);
            }

        } finally {
            openSession.close();
        }
    }

 以上代碼均未給出mybatis的主配置文件,自行添加

5)test元素:判斷真假

總結

  要抓住重點:常用的無非就是if,where,set,foreach一定要掌握。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

于都县| 洛浦县| 开阳县| 镇安县| 盐津县| 淄博市| 临城县| 石屏县| 安徽省| 鄯善县| 浦城县| 新和县| 玉环县| 理塘县| 吉木萨尔县| 开平市| 元氏县| 呼伦贝尔市| 黄梅县| 铜川市| 策勒县| 南投市| 军事| 读书| 阿坝县| 贡觉县| 大新县| 崇州市| 惠东县| 磐安县| 孙吴县| 印江| 江孜县| 禹州市| 乐亭县| 张家界市| 徐汇区| 商洛市| 赤峰市| 南岸区| 鹿泉市|