欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis直接執(zhí)行SQL的工具SqlMapper

 更新時間:2018年12月25日 14:05:29   作者:isea533  
今天小編就為大家分享一篇關(guān)于MyBatis直接執(zhí)行SQL的工具SqlMapper,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

可能有些人也有過類似需求,一般都會選擇使用其他的方式如Spring-JDBC等方式解決。

能否通過MyBatis實現(xiàn)這樣的功能呢?

為了讓通用Mapper更徹底的支持多表操作以及更靈活的操作,在2.2.0版本增加了一個可以直接執(zhí)行SQL的新類SqlMapper。

我們來了解一下SqlMapper。

SqlMapper提供的方法

SqlMapper提供了以下這些公共方法:

  • Map<String,Object> selectOne(String sql)
  • Map<String,Object> selectOne(String sql, Object value)
  • <T> T selectOne(String sql, Class<T> resultType)
  • <T> T selectOne(String sql, Object value, Class<T> resultType)
  • List<Map<String,Object>> selectList(String sql)
  • List<Map<String,Object>> selectList(String sql, Object value)
  • <T> List<T> selectList(String sql, Class<T> resultType)
  • <T> List<T> selectList(String sql, Object value, Class<T> resultType)
  • int insert(String sql)
  • int insert(String sql, Object value)
  • int update(String sql)
  • int update(String sql, Object value)
  • int delete(String sql)
  • int delete(String sql, Object value)

一共14個方法,這些方法的命名和參數(shù)和SqlSession接口的很像,只是基本上第一個參數(shù)都成了sql。

其中Object value為入?yún)?,入?yún)⑿问胶蚐qlSession中的入?yún)⒁粯樱瑤в腥雲(yún)⒌姆椒?,在使用時sql可以包含#{param}或${param}形式的參數(shù),這些參數(shù)需要通過入?yún)韨髦?。需要的參?shù)過多的時候,參數(shù)可以使用Map類型。另外這種情況下的sql還支持下面這種復雜形式:

String sql = "<script>select * from sys_user where 1=1" + 
    "<if test=\"usertype != null\">usertype = #{usertype}</if></script>";

這種情況用的比較少,不多說。

不帶有Object value的所有方法,sql中如果有參數(shù)需要手動拼接成一個可以直接執(zhí)行的sql語句。

在selectXXX方法中,使用Class<T> resultType可以指定返回類型,否則就是Map<String,Object>類型。

實例化SqlMapper

SqlMapper構(gòu)造參數(shù)public SqlMapper(SqlSession sqlSession),需要一個入?yún)qlSession sqlSession,在一般系統(tǒng)中,可以按照下面的方式獲?。?/p>

SqlSession sqlSession = (...);//通過某些方法獲取sqlSession
//創(chuàng)建sqlMapper
SqlMapper sqlMapper = new SqlMapper(sqlSession);

如果使用的Spring,那么可以按照下面的方式配置<bean>:

<bean id="sqlMapper" class="com.github.abel533.sql.SqlMapper" scope="prototype">
 <constructor-arg ref="sqlSession"/>
</bean>

在Service中使用的時候可以直接使用@Autowired注入。

簡單例子

在src/test/java目錄的com.github.abel533.sql包中包含這些方法的測試。

下面挑幾個看看如何使用。

selectList

//查詢,返回List<Map>
List<Map<String, Object>> list = sqlMapper.selectList("select * from country where id < 11");
//查詢,返回指定的實體類
List<Country> countryList = sqlMapper.selectList("select * from country where id < 11", Country.class);
//查詢,帶參數(shù)
countryList = sqlMapper.selectList("select * from country where id < #{id}", 11, Country.class);
//復雜點的查詢,這里參數(shù)和上面不同的地方,在于傳入了一個對象
Country country = new Country();
country.setId(11);
countryList = sqlMapper.selectList("<script>" +
    "select * from country " +
    "  <where>" +
    "    <if test=\"id != null\">" +
    "      id &lt; #{id}" +
    "    </if>" +
    "  </where>" +
    "</script>", country, Country.class);

selectOne

Map<String, Object> map = sqlMapper.selectOne("select * from country where id = 35");
map = sqlMapper.selectOne("select * from country where id = #{id}", 35);
Country country = sqlMapper.selectOne("select * from country where id = 35", Country.class);
country = sqlMapper.selectOne("select * from country where id = #{id}", 35, Country.class);

insert,update,delete

//insert
int result = sqlMapper.insert("insert into country values(1921,'天朝','TC')");
Country tc = new Country();
tc.setId(1921);
tc.setCountryname("天朝");
tc.setCountrycode("TC");
//注意這里的countrycode和countryname故意寫反的
result = sqlMapper.insert("insert into country values(#{id},#{countrycode},#{countryname})"
             , tc);
//update
result = sqlMapper.update("update country set countryname = '天朝' where id = 35");
tc = new Country();
tc.setId(35);
tc.setCountryname("天朝");
int result = sqlMapper.update("update country set countryname = #{countryname}" + 
      " where id in(select id from country where countryname like 'A%')", tc);
//delete
result = sqlMapper.delete("delete from country where id = 35");
result = sqlMapper.delete("delete from country where id = #{id}", 35);

注意

通過上面這些例子應(yīng)該能對此有個基本的了解,但是如果你使用參數(shù)方式,建議閱讀下面的文章:

深入了解MyBatis參數(shù)

實現(xiàn)原理

最初想要設(shè)計這個功能的時候,感覺會很復雜,想的也復雜,需要很多個類,因此當時沒有實現(xiàn)。

突發(fā)奇想,設(shè)計了現(xiàn)在的這種方式。并且有種強烈的感覺就是幸好昨天沒有嘗試去實現(xiàn),因為昨天晚上思考這個問題的時候是晚上10點多,而今天晚上7點開始思考。我很慶幸在一個更清醒的狀態(tài)下去寫這段代碼。

下面簡單說思路和實現(xiàn)方式。

在寫MyBatis分頁插件的時候熟悉了MappedStatement類。

在寫通用Mapper的時候熟悉了xml轉(zhuǎn)SqlNode結(jié)構(gòu)。

如果我根據(jù)SQL動態(tài)的創(chuàng)建一個MappedStatement,然后使用MappedStatement的id在sqlSession中執(zhí)行不就可以了嗎?

想到這一點,一切就簡單了。

看看下面select查詢創(chuàng)建MappedStatement的代碼:

/**
 * 創(chuàng)建一個查詢的MS
 * @param msId
 * @param sqlSource 執(zhí)行的sqlSource
 * @param resultType 返回的結(jié)果類型
 */
private void newSelectMappedStatement(String msId, SqlSource sqlSource, final Class<?> resultType) {
  MappedStatement ms = new MappedStatement.Builder(
      configuration, msId, sqlSource, SqlCommandType.SELECT)
    .resultMaps(new ArrayList<ResultMap>() {
      {
        add(new ResultMap.Builder(configuration,
            "defaultResultMap",
            resultType,
            new ArrayList<ResultMapping>(0)).build());
      }
    })
    .build();
  //緩存
  configuration.addMappedStatement(ms);
}

代碼是不是很簡單,這段代碼的關(guān)鍵是參數(shù)sqlSource,下面是創(chuàng)建SqlSource的方法,分為兩種。

一種是一個完整的sql,不需要參數(shù)的,可以直接執(zhí)行的:

StaticSqlSource sqlSource = new StaticSqlSource(configuration, sql);

其中configuration從sqlSession中獲取,sql就是用戶傳入到sql語句,是不是也很簡單?

另一種是支持動態(tài)sql的,支持參數(shù)的SqlSource:

SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, parameterType);

是不是也很簡單?這個方法其實可以兼容上面的StaticSqlSource,這里比上面多了一個parameterType,因為這兒是可以傳遞參數(shù)的,另外languageDriver是從configuration中獲取的。

是不是很簡單?

我一開始也沒想到MyBatis直接執(zhí)行sql實現(xiàn)起來會這么的容易。

insert,delete,update方法的創(chuàng)建更容易,因為他們的返回值都是int,所以處理起來更簡單,有興趣的可以查看SqlMapper的源碼。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • spring 注解如何開啟聲明式事務(wù)

    spring 注解如何開啟聲明式事務(wù)

    這篇文章主要介紹了spring 注解開啟聲明式事務(wù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java String源碼和String常量池的全面解析

    java String源碼和String常量池的全面解析

    下面小編就為大家分享一篇java String源碼和String常量池的全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java文件大小轉(zhuǎn)換的兩種方式小結(jié)

    Java文件大小轉(zhuǎn)換的兩種方式小結(jié)

    在程序開發(fā)的過程中,文件的大小在視圖呈現(xiàn)和數(shù)據(jù)庫存儲的過程不一致怎么轉(zhuǎn)換呢,本文主要介紹了Java文件大小轉(zhuǎn)換的兩種方式小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Springboot集成規(guī)則引擎Drools方式

    Springboot集成規(guī)則引擎Drools方式

    這篇文章主要介紹了Springboot集成規(guī)則引擎Drools方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring ApplicationContext上下文核心容器深入探究

    Spring ApplicationContext上下文核心容器深入探究

    ApplicationContext是Spring應(yīng)用程序中的中央接口,由于繼承了多個組件,使得ApplicationContext擁有了許多Spring的核心功能,如獲取bean組件,注冊監(jiān)聽事件,加載資源文件等
    2023-01-01
  • Java AtomicInteger類的重要方法和特性

    Java AtomicInteger類的重要方法和特性

    AtomicInteger是Java中的一個類,用于實現(xiàn)原子操作的整數(shù),AtomicInteger類主要用于處理整數(shù)類型的原子操作,本文給大家介紹Java AtomicInteger類的重要方法和特性,感興趣的朋友一起看看吧
    2023-10-10
  • Java聊天室之實現(xiàn)使用Socket傳遞音頻

    Java聊天室之實現(xiàn)使用Socket傳遞音頻

    這篇文章主要為大家詳細介紹了Java簡易聊天室之使用Socket實現(xiàn)傳遞音頻功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • Java Process詳解及實例

    Java Process詳解及實例

    這篇文章主要介紹了Java Process詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java多個版本切換的幾種方法

    Java多個版本切換的幾種方法

    本文主要介紹了Java多個版本切換的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例,需要的朋友可以參考一下
    2013-02-02

最新評論