statementType 使用


要實現動態傳入表名、列名,需要做如下修改

添加屬性statementType=”STATEMENT”
同時sql里的屬有變量取值都改成${xxxx},而不是#{xxx}
<delete id="deleteTableData" parameterType="java.util.Map" statementType="STATEMENT">
<![CDATA[
delete from ${table} where
${col} < ${date}]]>
</delete>
statementType:STATEMENT(非預編譯),PREPARED(預編譯)或CALLABLE中的任意一個,這就告訴 MyBatis 分別使用Statement,PreparedStatement或者CallableStatement。默認:PREPARED。這里顯然不能使用預編譯,要改成非預編譯。
將傳入的數據直接顯示生成在sql中,對於字符串數據,需要手動加上引號。
String dateStr = DateFormatUtils.format(date.getTime(), "yyyy-MM-dd HH:mm:ss");
dateStr = "'" + dateStr + "'";

 

 

在mapper文件中可以使用statementType標記使用什么的對象操作SQL語句。

statementType:標記操作SQL的對象

要實現動態傳入表名、列名,需要做如下修改 ,添加屬性statementType=”STATEMENT” ,同時sql里的屬有變量取值都改成${xxxx},而不是#{xxx}

<delete id="deleteTableData" parameterType="java.util.Map" statementType="STATEMENT">
<![CDATA[
delete from ${table} where
${col} < ${date}]]>
</delete>
取值說明:
1、STATEMENT:直接操作sql,不進行預編譯,獲取數據:$—Statement
2、PREPARED:預處理,參數,進行預編譯,獲取數據:#—–PreparedStatement:默認
3、CALLABLE:執行存儲過程————CallableStatement
另外說明下:如果只為STATEMENT,那么sql就是直接進行的字符串拼接,這樣為字符串需要加上引號,如果為PREPARED,是使用的參數替換,也就是索引占位符,我們的#會轉換為?再設置對應的參數的值

 

 

statementType:STATEMENT,PREPARED 或 CALLABLE(存儲過程) 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED。

<?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.fujitsu.tti.biz.f64.dao.itpdb.F64GoodsInfoSelectDao">

<select id="goodsInfoSelect" parameterType="Integer" statementType="CALLABLE" resultType="com.fujitsu.tti.biz.f64.model.GoodsInfo">
{call F64_GoodsInfo_Select(#{eigyousyoId, jdbcType = INTEGER, mode = IN})}
</select>

</mapper>
1.Statement、PreparedStatement和CallableStatement都是接口(interface)。

2.Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。

3.Statement接口提供了執行語句和獲取結果的基本方法;
PreparedStatement接口添加了處理 IN 參數的方法;
CallableStatement接口添加了處理 OUT 參數的方法。

4.Statement:

普通的不帶參的查詢SQL;支持批量更新,批量刪除;
Statement每次執行sql語句,數據庫都要執行sql語句的編譯 ,
最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。
PreparedStatement:

可變參數的SQL,編譯一次,執行多次,效率高;
安全性好,有效防止Sql注入等問題;
支持批量更新,批量刪除;
PreparedStatement是預編譯的,使用PreparedStatement有幾個好處:
1. 在執行可變參數的一條SQL時,PreparedStatement比Statement的效率高,因為DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率要高。
2. 安全性好,有效防止Sql注入等問題。
3. 對於多次重復執行的語句,使用PreparedStament效率會更高一點,並且在這種情況下也比較適合使用batch;
4. 代碼的可讀性和可維護性。
CallableStatement:
繼承自PreparedStatement,支持帶參數的SQL操作;
支持調用存儲過程,提供了對輸出和輸入/輸出參數(INOUT)的支持;

 

要實現動態傳入表名、列名,需要做如下修改
添加屬性statementType=”STATEMENT”
同時sql里的屬有變量取值都改成${xxxx},而不是#{xxx}

<delete id="deleteTableData" parameterType="java.util.Map" statementType="STATEMENT">
<![CDATA[
     delete from ${table} where ${col} < ${date}
   ]]>
</delete>
statementType:STATEMENT(非預編譯),PREPARED(預編譯)或CALLABLE中的任意一個,這就告訴 MyBatis 分別使用Statement,PreparedStatement或者CallableStatement。默認:PREPARED。這里顯然不能使用預編譯,要改成非預編譯。
xxxx:xxxx:將傳入的數據直接顯示生成在sql中,對於字符串數據,需要手動加上引號。
    

String dateStr = DateFormatUtils.format(date.getTime(), "yyyy-MM-dd HH:mm:ss");
dateStr = "'" + dateStr + "'";

 


免責聲明!

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



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