1. 程式人生 > 其它 >mybatis的mapper檔案基礎標籤的使用

mybatis的mapper檔案基礎標籤的使用

一、DQL

1.select

<select id="selectStudents" resultType="com.bjpowernode.domain.student">
    <!--要執行的 sql 語句-->
    select id,name,email,age from student order by id
</select>

select 語句屬性配置細節:

屬性描述取值預設
id 在這個模式下唯一的識別符號,可被其它語句引用
parameterType 傳給此語句的引數的完整類名或別名
resultType 語句返回值型別的整類名或別名。注意,如果是集合,那麼這裡填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能並用)
resultMap 引用的外部resultMap 名。結果集對映是MyBatis 中最強大的特性。許多複雜的對映都可以輕鬆解決。(resultType 與resultMap 不能並用)
flushCache 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false true/false false
useCache 如果設為true,則語句的結果集將被快取。select 語句預設設為false true/false false
timeout 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 正整數 未設定
fetchSize 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 正整數 驅動器決定
statementType statement,preparedstatement,callablestatement。預準備語句、可呼叫語句 STATEMENT、PREPARED、CALLABLE PREPARED
resultSetType forward_only、scroll_sensitive、scroll_insensitive 只轉發,滾動敏感,不區分大小寫的滾動 FORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE 驅動器決定
<!--對於${}和#{}

${}是字串替換,#{}是預編譯處理,一般使用#{}防止sql注入
使用#{}之後, mybatis執行sql是使用的jdbc中的PreparedStatement物件
-->

mybatis會自動執行下列程式碼

<!--
         1. mybatis建立Connection , PreparedStatement物件
            String sql="select id,name, email,age from student where id=?";(每一個#{}都被認定為一個?,即佔位符)
            PreparedStatement pst = conn.preparedStatement(sql);
            pst.setInt(1,1001);

         2. 執行sql封裝為resultType="com.bjpowernode.domain.Student"這個物件
            ResultSet rs = ps.executeQuery();
            Student student = null;
            while(rs.next()){
               //從資料庫取表的一行資料, 存到一個java物件屬性中
               student = new Student();
               student.setId(rs.getInt("id));
               student.setName(rs.getString("name"));
               student.setEmail(rs.getString("email"));
               student.setAge(rs.getInt("age"));
            }

           return student;  //給了dao方法呼叫的返回值
-->

注意:

select中的id要與介面中的方法名一致(DML也一樣)

二、DML

1.insert

<!-- 插入學生 -->  
<insert id="insertStudent" parameterType="StudentEntity">  
        INSERT INTO STUDENT_TBL (STUDENT_ID,  
                                          STUDENT_NAME,  
                                          STUDENT_SEX,  
                                          STUDENT_BIRTHDAY,  
                                          CLASS_ID)  
              VALUES   (#{studentID},  
                          #{studentName},  
                          #{studentSex},  
                          #{studentBirthday},  
                          #{classEntity.classID})  
</insert>

insert可以使用資料庫支援的自動生成主鍵策略,設定useGeneratedKeys=”true”,然後把keyProperty 設成對應的列,就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.

<insert id="insertStudent" parameterType="StudentEntity" useGeneratedKeys="true" keyProperty="studentID">

推薦使用這種用法。

另外,還可以使用selectKey元素。下面例子,使用MySQL資料庫nextval(‘student’)為自定義函式,用來生成一個key。

<!-- 插入學生 自動主鍵-->  
<insert id="insertStudentAutoKey" parameterType="StudentEntity">  
    <selectKey keyProperty="studentID" resultType="String" order="BEFORE">  
            select nextval('student')  
    </selectKey>  
        INSERT INTO STUDENT_TBL (STUDENT_ID,  
                                 STUDENT_NAME,  
                                 STUDENT_SEX,  
                                 STUDENT_BIRTHDAY,  
                                 CLASS_ID)  
              VALUES   (#{studentID},  
                        #{studentName},  
                        #{studentSex},  
                        #{studentBirthday},  
                        #{classEntity.classID})      
</insert>

insert語句屬性配置細節:

屬性描述取值預設
id 在這個模式下唯一的識別符號,可被其它語句引用
parameterType 傳給此語句的引數的完整類名或別名
flushCache 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false true/false false
useCache 如果設為true,則語句的結果集將被快取。select 語句預設設為false true/false false
timeout 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 正整數 未設定
fetchSize 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 正整數 驅動器決定
statementType statement、preparedstatement、callablestatement。預準備語句、可呼叫語句 STATEMENT、PREPARED、CALLABLE PREPARED
useGeneratedKeys 告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來獲取資料庫自己生成的主鍵(MySQL、SQLSERVER 等關係型資料庫會有自動生成的欄位)。預設:false true/false false
keyProperty 標識一個將要被MyBatis設定進getGeneratedKeys的key 所返回的值,或者為insert 語句使用一個selectKey子元素。

selectKey語句屬性配置細節:

屬性描述取值
keyProperty selectKey 語句生成結果需要設定的屬性。
resultType 生成結果型別,MyBatis 允許使用基本的資料型別,包括String 、int型別。
order 可以設成BEFORE 或者AFTER,如果設為BEFORE,那它會先選擇主鍵,然後設定keyProperty,再執行insert語句;如果設為AFTER,它就先執行insert 語句再執行selectKey 語句,通常是insert 語句中內部呼叫資料庫(像Oracle)內嵌的序列機制。 BEFORE/AFTER
statementType 像上面的那樣, MyBatis 支援STATEMENT,PREPARED和CALLABLE 的語句形式, 對應Statement ,PreparedStatement 和CallableStatement 響應 STATEMENT、PREPARED、CALLABLE

2.update

update語句屬性配置細節:

屬性描述取值預設
id 在這個模式下唯一的識別符號,可被其它語句引用
parameterType 傳給此語句的引數的完整類名或別名
flushCache 如果設為true,則會在每次語句呼叫的時候就會清空快取。select 語句預設設為false true/false false
useCache 如果設為true,則語句的結果集將被快取。select 語句預設設為false true/false false
timeout 設定驅動器在丟擲異常前等待迴應的最長時間,預設為不設值,由驅動器自己決定 正整數 未設定
fetchSize 設定一個值後,驅動器會在結果集數目達到此數值後,激發返回,預設為不設值,由驅動器自己決定 正整數 驅動器決定
statementType statement、preparedstatement、callablestatement。預準備語句、可呼叫語句 STATEMENT、PREPARED、CALLABLE PREPARED

3.delete

<delete id="deleteStudent" parameterType="StudentEntity">  
        DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID}  
</delete> 

三、parameterType

<!--
      parameterType : dao介面中方法引數的資料型別。
        parameterType它的值是java的資料型別全限定名稱或者是mybatis定義的別名
        例如:parameterType="java.lang.Integer"
             parameterType="int"

        注意:parameterType不是強制的,mybatis通過反射機制能夠發現介面引數的數型別。
        所以可以沒有。 一般我們也不寫。
-->

四、傳參

1.一個簡單型別的引數

mybatis把java的基本資料型別和String都叫簡單型別。

Student selectStudentById(@Param("studentId") Integer id);
<select id="selectStudentById" parameterType="java.lang.Integer" resultType="com.bjpowernode.domain.Student">
        select id,name, email,age from student where id=${studentId}<!--此處名稱要與介面中方法中定義的名稱相同-->
    </select>

2.多個引數

(1)第一種

多個引數: 命名引數,在形參定義的前面加入 @Param("自定義引數名稱")

List<Student> selectMultiParam(@Param("myname") String name,
                                   @Param("myage") Integer age);
<!--多個引數,使用@Param命名(掌握)-->
    <select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
         select id,name, email,age from student where name=#{myname} or age=#{myage}
    </select>

(2)第二種

多個引數,使用java物件作為介面中方法的引數

List<Student> selectMultiStudent(Student student);
<!--多個引數, 使用java物件的屬性值,作為引數實際值
        使用物件語法: #{屬性名,javaType=型別名稱,jdbcType=資料型別} 很少用。
                    javaType:指java中的屬性資料型別。
                    jdbcType:在資料庫中的資料型別。
                    例如: #{paramName,javaType=java.lang.String,jdbcType=VARCHAR}

        我們使用的簡化方式: #{屬性名}  ,javaType, jdbcType的值mybatis反射能獲取。不用提供

    -->
<select id="selectMultiStudent" resultType="com.bjpowernode.domain.Student">
         select id,name, email,age from student where name=#{name} or age=#{age}<!--放入介面中引數物件所對應的屬性名-->
    </select>

(3)第三種

多個引數-簡單型別的,按位置傳值

mybatis.3.4之前,使用 #{0} ,#{1}
mybatis.3.4之後 ,使用 #{arg0} ,#{arg1}

 List<Student> selectMultiPosition( String name,Integer age);
<!--多個引數使用位置(不推薦使用)-->
    <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
          select id,name, email,age from student where
          name = #{arg0} or age=#{arg1}
    </select>

(4)第四種

多個引數,使用Map存放多個值

List<Student> selectMultiByMap(Map<String,Object> map);
<!--多個引數,使用Map , 使用語法 #{map的key}(不推薦使用)-->
    <select id="selectMultiByMap" resultType="com.bjpowernode.domain.Student">
          select id,name, email,age from student where
          name = #{myname} or age=#{age1}
    </select>

五、動態SQL

1.單獨if標籤

<!-- if
         <if:test="使用引數java物件的屬性值作為判斷條件,語法 屬性=XXX值">
-->
<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
        select id,name, age, email  from student
        where 
        <if test="name !=null and name !='' ">
           and name = #{name}
        </if>
        <if test="age > 0">
            or age > #{age}
        </if>
    </select>

注意:當地一個if條件不成立時 sql語句會變成為

select id,name, age, email from student whereor age > #{age}

會出現語法錯誤,所以將其改進為

<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
        select id,name, age, email  from student
        where id>0
        <if test="name !=null and name !='' ">
           and name = #{name}
        </if>
        <if test="age > 0">
            or age > #{age}
        </if>
    </select>

2.使用where標籤

<!--
     where: <where> <if> <if>...</where>
     用來包含 多個<if>的, 當多個if有一個成立的,
     <where>會自動增加一個where關鍵字,
     並去掉 if中多餘的 and ,or等
    -->
<select id="selectStudentWhere" resultType="com.bjpowernode.domain.Student">
        select id,name, age, email from student
        <where>
            <if test="name !=null and name !='' ">
                name = #{name}
            </if>
            <if test="age > 0">
                or age > #{age}
            </if>
        </where>
    </select>

3.foreach標籤

<!--foreach使用1 , List<Integer>,集合中放資料型別
    collection:表示介面中的方法引數的型別, 如果是陣列使用array , 如果是list集合使用list
     item:自定義的,表示陣列和集合成員的變數,或者是屬性名
     open:迴圈開始時的字元
     close:迴圈結束時的字元
    separator:集合成員之間的分隔符
-->
<select id="selectForeachOne" resultType="com.bjpowernode.domain.Student">
        select * from student where id in
        <foreach collection="list" item="myid" open="(" close=")" separator=",">
                  #{myid}
        </foreach>
</select>
<!--foreach使用2 , List<物件>,集合中放入物件-->
    <!--<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
        select * from student where id in
        <foreach collection="list" item="stu" open="("  close=")" separator=",">
                 #{stu.id}
        </foreach>

    </select>-->
    <!--foreach使用2 , List<物件>,集合中放入物件
    比上方的語法更靈活,自己寫語法格式
    -->
<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
            <include refid="studentSql" />  where id in (
            <foreach collection="list" item="stu" >
                #{stu.id},
            </foreach>
            -1 )<!--此處減一是因為要去掉一個內容為逗號的欄位-->
</select>

參考:https://www.cnblogs.com/yufeng218/p/6622644.html