1. 程式人生 > 實用技巧 >Mybatis 自定義SQL語句(執行任意語句)

Mybatis 自定義SQL語句(執行任意語句)

Mybatis 直接執行SQL
好久不更新部落格了,今天開發遇到一個問題就是如何在mybatis中直接執行sql,直接上程式碼:
 
<select id="selectBysql" parameterType="java.lang.String"   resultType="java.lang.Integer">
    ${sql}//#{sql}
</select>
 
上網查了下,網上的解釋是:
 
使用${}代替#{}
解釋是:預設情況下, #{}語法會促使MyBatis生成PreparedStatement屬性並且使用PreparedStatement的引數(=?)來設定值。如果你想直接將未更改的字串代入到sql中,可以使用${}也就是說,MyBatis看到 “#{}”會認為你在給sql中的變數賦值,就像JDBC程式設計中給問號賦值一樣(比如MyBatis會判斷它的型別,並自動在前後加單引號。而當MyBatis看到”${}”的時候會直接將之替換成變數的值而不做任何處理。所以在使用${}的時候,不需要像#{}一樣寫”jdbcType=VARCHAR”之類的屬性。
 
但是這樣做會報錯說:sql沒有getter方法
 
解決辦法就是,把sql放到一個vo裡面去,用getter取出來在MyBatis中賦值就可以了,如下:
 
<select id="selectBysql" parameterType="com.tuniu.car.data.center.monitor.vo.SqlVo" resultType="java.lang.Integer">
    ${sql}
</select>


其中 com.tuniu.car.data.center.monitor.vo.SqlVo 是:
 
public class SqlVo {
    private String sql;
 
    public String getSql() {
        return sql;
    }
 
    public void setSql(String sql) {
        this.sql = sql;
    }
 
}
 
使用的時候,只要
 
SqlVo sql = new SqlVo();
sql.setSql(sqlString);
 
然後在 Mapper中傳入這個 sql 就可以了,如:
 
List<Integer> selectBysql(SqlVo sql);

  原文連結:https://blog.csdn.net/qq827245563/article/details/87871827