天天看點

Mybatis映射器學習筆記

擷取自增屬性的主鍵值:

        useGeneratedKeys="true" keyProperty="id"

            mysql支援自增主鍵,自增主鍵值的擷取,mybatis也是利用statement.getGenreatedKeys();

        useGeneratedKeys="true";使用自增主鍵擷取主鍵值政策

        keyProperty;指定對應的主鍵屬性,也就是mybatis擷取到主鍵值以後,将這個值封裝給javaBean的哪個屬性

擷取非自增屬性的主鍵值:

        Oracle不支援自增;Oracle使用序列來模拟自增;

        <insert id="addEmp" databaseId="oracle">

        <!--

        keyProperty:查出的主鍵值封裝給javaBean的哪個屬性

        order="BEFORE":目前sql在插入sql之前運作

               AFTER:目前sql在插入sql之後運作

        resultType:查出的資料的傳回值類型

        BEFORE運作順序:

            先運作selectKey查詢id的sql;查出id值封裝給javaBean的id屬性

            在運作插入的sql;就可以取出id屬性對應的值

        AFTER運作順序:

            先運作插入的sql(從序列中取出新值作為id);

            再運作selectKey查詢id的sql;

         -->

        <selectKey keyProperty="id" order="BEFORE" resultType="Integer">

            <!-- 編寫查詢主鍵的sql語句 -->

            <!-- BEFORE-->

            select EMPLOYEES_SEQ.nextval from dual

            <!-- AFTER:

             select EMPLOYEES_SEQ.currval from dual -->

        </selectKey>

        <!-- 插入時的主鍵是從序列中拿到的 -->

        <!-- BEFORE:-->

        insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)

        values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->})

        <!-- AFTER:

        insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL)

        values(employees_seq.nextval,#{lastName},#{email}) -->

    </insert>

傳入多個參數進行查詢:

        接口中方法:

        public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("lastName")String lastName);

        傳入的語句:

        <select id="getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">

         select * from tbl_employee where id = #{id} and last_name=#{lastName}

             </select>

        POJO:

        如果多個參數正好是我們業務邏輯的資料模型,我們就可以直接傳入pojo;

        #{屬性名}:取出傳入的pojo的屬性值    

        Map:

        如果多個參數不是業務模型中的資料,沒有對應的pojo,不經常使用,為了友善,我們也可以傳入map

        #{key}:取出map中對應的值

總結:

        public Employee getEmp(@Param("id")Integer id,String lastName);

        取值:id==>#{id/param1}   lastName==>#{param2}

        public Employee getEmp(Integer id,@Param("e")Employee emp);

        取值:id==>#{param1}    lastName===>#{param2.lastName/e.lastName}

        ##特别注意:如果是Collection(List、Set)類型或者是數組,

        也會特殊處理。也是把傳入的list或者數組封裝在map中。

            key:Collection(collection),如果是List還可以使用這個key(list)

                數組(array)

        public Employee getEmpById(List<Integer> ids);

        取值:取出第一個id的值:   #{list[0]}

    參數的擷取:

        #{}:可以擷取map中的值或者pojo對象屬性的值;

        ${}:可以擷取map中的值或者pojo對象屬性的值;

        select * from tbl_employee where id=${id} and last_name=#{lastName}

        Preparing: select * from tbl_employee where id=2 and last_name=?

    差別:

        #{}:是以預編譯的形式,将參數設定到sql語句中;PreparedStatement;防止sql注入

        ${}:取出的值直接拼裝在sql語句中;會有安全問題;

        大多情況下,我們去參數的值都應該去使用#{};

        原生jdbc不支援占位符的地方我們就可以使用${}進行取值

        比如分表、排序。。。;按照年份分表拆分

            select * from ${year}_salary where xxx;

            select * from tbl_employee order by ${f_name} ${order}

    #{}:更豐富的用法:

        規定參數的一些規則:

        javaType、 jdbcType、 mode(存儲過程)、 numericScale、

        resultMap、 typeHandler、 jdbcTypeName、 expression(未來準備支援的功能);

        jdbcType通常需要在某種特定的條件下被設定:

        在我們資料為null的時候,有些資料庫可能不能識别mybatis對null的預設處理。比如Oracle(報錯);

        JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正确處理;

        由于全局配置中:jdbcTypeForNull=OTHER;oracle不支援;兩種辦法

        1、#{email,jdbcType=OTHER};

        2、jdbcTypeForNull=NULL

            <setting name="jdbcTypeForNull" value="NULL"/>

繼續閱讀