MyBatis注解及動態Sql


一、注解實現MyBatis配置

  java注解是在jdk1.5版本之后開始加入的,不得不說注解對於我們開發人員來說是個很方便的東西,實現起來也非常的簡單,下邊我們說一下在MyBatis中使用注解來替換Mapper配置文件。

package com.lhf.dao;

import com.lhf.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserDao {
    @Select("select * from user")
    List<User> getAll();
    @Delete("delete from user where id=#{id}")
    int del(int id);
    @Insert("insert into user values(default,#{name},#{pwd})")
    int add(User user);
    @Update("update user set name=#{name},pwd=#{pwd} where id=#{id}")
    int modify(User user);
}

刪除UserDaoMaper的xml文件,在dao層使用注解(select、delete、insert、update)來實現數據庫的簡單操作,這個效果與Xml文件的效果是一致的。上一篇中有介紹xml文件的配置

一定會有人問,這里方法內的參數一般都是一個,那如果是兩個以及以上怎么辦呢?那就需要我們的@Parm注解了,該注解的作用可以看成是給參數起別名:

MyBatis基本常用的注解大概就說這么多后續再補充

二、動態SQL

何為動態SQL,就是服務器根據用戶請求從而選擇性的發送SQL語句,最典型的就是修改了,一個表中有多個字段,如果用戶只需修改其中一個即可,那我們的SQL語句就沒辦法確定要修改哪一個,以前的做法是再修改前先獲取所有的字段信息,然后按照用戶所做的修改一 一進行比對,最后統一進行修改。這樣的話我們就需要再dao將所有的字段都修改一次了,這和刪除以后再新增一個區別不大,而且浪費資源,所有才有了動態SQL的誕生,動態sql只能是在xml文件中進行配置

if : If標簽通常用於WHERE語句中,通過判斷參數值來決定是否使用某個查詢條件,它也經常用於UPDATE語句中判斷是否更新某一個字段,還可以在INSERT語句用來判斷是否插入某個字段的值。

<?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">
<mapper namespace="com.lhf.dao.UserDao">
    <update id="modify">
        update user set
        <if test="pwd!=null">
            pwd=#{pwd}
        </if>
        where
        <if test="id>0">
            id=#{id}
        </if>
    </update>
</mapper>

 類似於java中的if判斷語句,test中為判斷條件。

choose:上一部分的if標簽提供了基本的條件判斷,但是它無法實現if....else、if....else..... 的邏輯,要想實現這樣的邏輯,就需要使用到choose when otherwise標簽。choose元素中包含when和otherwise兩個標簽,一個choose中至少包含一個when,有0個或1個otherwise。

 <select id="select" resultType="User">
     select * from user where 1=1
     <choose>
         <when test="name!=null and name!=''">
             and name=#{name}
         </when>
         <when test="id!=-1">
             and id=#{id}
         </when>
         <otherwise>
             and name="程序員"
        </otherwise>
     </choose>
</select>

whereWhere標簽的作用:如果該標簽包含的元素有返回值,就插入一個where;如果where 后面的字符串是以and和or開頭,就將它剔除。

<select id="select" resultType="User">
     select * from user<!--使用了where標簽,無需手動編寫where條件-->
    <where>
         <choose>
             <when test="name!=null and name!=''">
                 and name=#{name}
             </when>
             <when test="id!=-1">
                 and id=#{id}
             </when>
             <otherwise>
                 and name="程序員"
            </otherwise>
         </choose>
    </where>
</select>

set:Set標簽的作用:如果該標簽包含的元素中有返回值,就插入一個set;如果set后面的字符串是以逗號結尾的,就把這個逗號剔除

<update id="modify" parameterType="User">
 <!--如果參數類型是一個對象,那么sql語句中#{對象的屬性名}-->
    update user
<!--使用<set>標簽替代set語句--> <set> <if test="name!=null and name !=''"> name=#{name}, </if> </set> where id=#{id} </update>

trimWhere和set標簽的功能都可以使用trim標簽來實現。

<trim prefix="WHERE" prefixOverrides="AND|OR">
    
</trim>
<trim prefix="SET" suffixOverrides=",">

</trim>

 trim標簽有如下屬性:

  prefix:當trim元素中包含內容時,會給內容增加prefix指定的前綴

  prefixOverrides:當trim元素中包含內容時,會把內容中匹配的前綴去掉

 suffix:當trim元素中包含內容時,會給內容增加suffix指定的后綴

 suffixOverrides:當trim元素中包含內容時,會把內容中匹配的后綴去掉

foreach:可以生成一系列的值,這個標簽主要用於SQL的in語句后面 foreach元素的屬性主要有 item,index,collection,open,separator,close。

  •    item:示集合中每一個元素進行迭代時的別名,

       index:指定一個名字,用於表示在迭代過程中,每次迭代到的位置,

       open:表示該語句以什么開始,

       separator:表示在每次進行迭代之間以什么符號作為分隔 符,

   close:表示該語句以什么結束 

1)foreach實現in集合

    使用foreach元素可以in 集合|數組

               1.foreach元素in array數組

      接口方法如下:

      

//根據插入的id數組獲取用戶
List<User> findUserByIds(int[] ids);

UserMapper.xml中新增select節點

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此處必須使用array 不能使用參數名-->
    <if test="array.length>0">
        where id IN
        <foreach collection="array" open="(" close=")" separator="," item="item">
            #{item}<!--item此時表示數組中的元素-->
        </foreach>
    </if>
</select>

 新增測試代碼

 

@Test
public void test04(){
    //檢索id為3,5的用戶
    List<User> userByIds = mapper.findUserByIds(new int[]{3, 5});
    System.out.println(userByIds);
}

2.foreach元素in 普通list集合

//根據插入的id集合獲取用戶
List<User> findUserByIds(List<Integer> lists);

修改select節點如下

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此處必須使用list 不能使用參數名-->
    <if test="list.size>0">
        where id IN
        <foreach collection="list" open="(" close=")" separator="," item="item">
            #{item}<!--item此時表示集合中的元素-->
        </foreach>
    </if>
</select>

測試代碼如下

@Test
public void test04(){
    //檢索id為3,5的用戶
    List<Integer> lists=new ArrayList<>();
    lists.add(3);
    lists.add(5);
    List<User> userByIds = mapper.findUserByIds(lists);
    System.out.println(userByIds);
}

3.foreach元素in 自定義list集合

修改上述代碼,將findUserByIds方法修改如下:

//根據插入的id集合獲取用戶
List<User> findUserByIds(List<User> lists);

修改select節點如下:

<select id="findUserByIds" resultType="User">
    select * from account
    <!--此處必須使用list 不能使用參數名-->
    <if test="list.size>0">
        where id IN
        <foreach collection="list" open="(" close=")" separator="," item="item">
            #{item.id}<!--item此時表示集合中的元素User對象-->
        </foreach>
    </if>
</select>

 修改測試代碼如下:

@Test
public void test04(){
    //檢索id為3,5的用戶
    List<User> lists=new ArrayList<>();
    User user=new User();
    User user1=new User();
    user.setId(3);
    user1.setId(5);
    lists.add(user);
    lists.add(user1);
    List<User> userByIds = mapper.findUserByIds(lists);
    System.out.println(userByIds);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM