亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

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

2024-07-14 08:43:20
字體:
來源:轉載
供稿:網(wǎng)友

可能有些人也有過類似需求,一般都會選擇使用其他的方式如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構造參數(shù)public SqlMapper(SqlSession sqlSession),需要一個入?yún)qlSession sqlSession,在一般系統(tǒng)中,可以按照下面的方式獲取:

SqlSession sqlSession = (...);//通過某些方法獲取sqlSession//創(chuàng)建sqlMapperSqlMapper 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 < #{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

//insertint 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);//updateresult = 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);//deleteresult = sqlMapper.delete("delete from country where id = 35");result = sqlMapper.delete("delete from country where id = #{id}", 35);

注意

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

深入了解MyBatis參數(shù)

實現(xiàn)原理

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

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

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

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

在寫通用Mapper的時候熟悉了xml轉SqlNode結構。

如果我根據(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 返回的結果類型 */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);}

代碼是不是很簡單,這段代碼的關鍵是參數(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的源碼。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
美女网站视频在线| 亚洲欧美日韩中文字幕在线观看| 欧美麻豆久久久久久中文| 99亚洲视频| 一片黄亚洲嫩模| 国产67194| 日韩在线播放一区二区| 一区二区高清免费观看影视大全| 中文字幕无码乱码人妻日韩精品| 亚洲三级免费电影| 亚洲性生活大片| 成人午夜精品久久久久久久蜜臀| 三级中文字幕在线观看| 男人的天堂va免费视频| 国产亚洲精品久| 色av性av丰满av| 国产精品一区二区三区美女| 成人羞羞国产免费图片| 欧美午夜性色大片在线观看| 久久久久久有精品国产| 老汉色影院首页| 亚洲av无码一区二区二三区| 国产精品嫩模av在线| 欧美精品一区二区三区很污很色的| wwwww在线观看| 国产精品xxx在线观看| 久久国产一区| 欧美日免费三级在线| 婷婷六月国产精品久久不卡| 国产伦精品一区二区三区四区免费| 性欧美videohd高精| 久久99久国产精品黄毛片色诱| 欧美精品日韩一区| 在线黄色免费网站| 国产精品毛片aⅴ一区二区三区| 欧美黄在线观看| 国产女片a归国片aa| 成人午夜免费电影| a级毛片免费| 国产午夜精品福利| 国产a级黄色片| www.激情五月| 国产成人小视频在线观看| 九色porny自拍视频| 久久99热这里只有精品国产| www.久久久久久久| 亚洲国产精品热久久| 麻豆av在线免费看| 日韩av片网站| 国产91色在线|免| 51社区在线成人免费视频| 国产性色av一区二区| 亚洲国产毛片完整版| 精品国产青草久久久久福利| 激情亚洲网站| 成人av免费在线播放| 舔足天天操天天射| http;//www.99re视频| 国产一区欧美二区三区| 无码aⅴ精品一区二区三区| crdy在线观看欧美| 视频一区二区三区国产| 久久久久久免费视频| 欧美大片va欧美在线播放| 色噜噜亚洲精品中文字幕| 精品三级久久久| 成人精品动漫| 中文字幕在线观看免费| 日韩欧美中文一区二区| 精品视频在线视频| 99国产精品一区二区| 成人午夜激情片| 免费毛片大全| 久久婷婷五月综合色国产香蕉| 欧美一区二区中文字幕| 在线播放一级片| 精品成在人线av无码免费看| 亚洲天堂国产| 97视频在线播放| 成人知道污网站| 专区另类欧美日韩| 国产伦理吴梦梦伦理| 欧美激情欧美激情在线五月| 亚洲午夜精品久久| 国产精品v欧美精品∨日韩| 日本精品久久中文字幕佐佐木| 亚洲欧美网站在线观看| 日本网站在线免费观看视频| 菠萝蜜视频在线观看www入口| 欧美精品在欧美一区二区| 日本不卡高清| 五月天激情小说| 日本裸体美女视频| 国产区亚洲区欧美区| 国产精品一级黄| 一区二区三区在线观看www| 成人羞羞视频免费| 三级av在线播放| 中文字幕一区二区三区乱码在线| 亚洲视频一区二区三区| 久久超碰99| 波多野结衣在线电影| 亲子伦视频一区二区三区| 特黄aaaaaaaaa毛片免费视频| 福利一区二区三区四区| 久热中文字幕在线精品首页| 欧美黄色成人网| 亚洲青涩在线| 国产精品久久麻豆| 欧美亚洲成人xxx| 欧美日韩免费一区二区三区| 国产精品嫩草69影院| 一区二区视频欧美| 日本中文字幕精品—区二区| 调教驯服丰满美艳麻麻在线视频| 日韩视频在线观看免费视频| 成人无码av片在线观看| 精品一区二区免费| 三区四区电影在线观看| 国产精品夫妻激情| 国产污污视频在线观看| 成人综合在线观看| 国产精品不卡av| 亚洲欧美成aⅴ人在线观看| 手机看片福利在线观看| 国产激情自拍视频| 蜜桃在线一区二区三区精品| 成年人在线观看| 搞黄视频免费在线观看| 亚洲国产精品久久久久婷蜜芽| 国产亚洲在线| 久久久久女教师免费一区| 成人资源av| 成人综合婷婷国产精品久久蜜臀| 中文字幕5566| 欧美一级理论片| 另类小说综合欧美亚洲| 欧美18一14sex性处hd| 先锋影音欧美官网| 成人午夜电影网站| 日韩国产精品亚洲а∨天堂免| 99久久人妻无码中文字幕系列| 精品九九久久| 日韩精品电影一区二区三区| 性一交一乱一伧国产女士spa| 波多野结衣在线观看一区二区三区| 国产欧美一区二区在线观看| 国产情侣在线播放| 97人摸人人澡人人人超一碰| av在线不卡观看免费观看| 欧洲中文字幕精品| 欧美一区国产| 卡通动漫亚洲综合| 91不卡在线观看| www.九色.com| xxx性欧美| 中文字幕在线天堂| 91精品国产91久久久久久| 99精品国产高清一区二区麻豆| 韩日一区二区| 国产九色精品成人porny| 日韩精品一区在线| 国产精品视频第一区| 国内精品国产三级国产在线专| 国产精品毛片久久久久久久| 天堂av在线| 亚洲の无码国产の无码步美| 国内精品久久久久久久久久| 欧美挤奶吃奶水xxxxx| 久久久久国产免费免费| 久久精品国产精品青草| 91麻豆精品国产91久久久更新时间| 精品国产乱码一区二区三区| 99久久99久久精品免费| www.wu福利视频18| 亚洲一区制服诱惑| 玖玖国产精品视频| 欧美成人精品不卡视频在线观看| 国产不卡一区| 久久日.com| 日韩欧美在线网址| 国产精品丝袜白浆摸在线| 国产精品毛片一区二区三区| 亚洲欧洲国产一区| 欧美影院一区二区三区| 综合天天久久| 亚洲a成v人在线观看| 国产三级伦理片| 婷婷伊人五月天| 亚洲最新av在线| 91综合精品国产丝袜长腿久久| 日本视频中文字幕一区二区三区| 欧美日本免费一区二区三区| 国产大学生校花援交在线播放| 亚洲欧美aaa| 精品一区二区三区免费播放| 日韩欧美一级在线播放| 欧美日韩视频在线一区二区观看视频| 精品精品国产高清一毛片一天堂| 极品少妇一区二区| 午夜激情在线播放| 尤物视频在线观看视频| 亚洲性生活视频| 粉嫩av一区二区| 国产野外战在线播放| www.欧美视频| 日韩av三级在线观看| 天堂资源最新版在线视频观看免费网| 欧美日韩综合一区二区三区| 亚洲精品资源美女情侣酒店| 亚洲精华国产精华精华液网站| 免费免费啪视频在线观看| 丁香婷婷激情网| 成人福利片在线| 中文字幕资源网在线观看免费| 香蕉乱码成人久久天堂爱免费| 激情se五月| 中文字幕人妻一区二区三区在线视频| 欧美视频一区二| 黄色小说综合网站| 国产小视频免费在线网址| 久久精品人人做人人爽电影蜜月| 成人免费视频国产免费观看| 在线观看亚洲成人| 99色在线视频| 亚洲二区中文字幕| 欧美xo影院| 蜜臀av国产精品久久久久| sihu成人| 亚洲精品久久久久久久久久久久久久| 精品夜夜澡人妻无码av| 久久久激情视频| 天堂视频在线观看免费| 日韩少妇高潮抽搐| 国产91色在线|| 日韩少妇高潮抽搐| 黄色片网站在线免费观看| 欧美国产精品中文字幕| 最新在线地址| 人人爽人人爽人人片av| 欧美先锋资源| 先锋资源男人站| 成年人免费视频播放| 欧美激情综合网| 丰满肥臀噗嗤啊x99av| 国产视频久久久久久| 亚洲女人天堂成人av在线| 欧美 国产 小说 另类| 精品美女被调教视频大全网站| 欧美电影在线观看一区| 国产大片在线免费观看| 日本a一级在线免费播放| 影院在线观看全集免费观看| 成人亚洲一区二区| 日韩免费观看高清| 成人h视频在线| 亚洲欧美综合在线精品| 久久9热精品视频| 欧美一级xxx| 久久久国产精品人人片| 国产精品视频免费观看www| 日本一卡二卡在线播放| 欧美性受xxxx黑人猛交88| 国产女人aaa级久久久级| 日韩在线视频观看免费| a片在线免费观看| av免费在线免费观看| 免费毛片aaaaaa| 51午夜精品| 97操在线视频| 色琪琪丁香婷婷综合久久| www.男人的天堂.com| 成人信息集中地| 玖玖爱在线观看| 日韩综合av| 正在播放久久| 一本大道久久a久久综合| 18被视频免费观看视频| 国产精品精品久久久久久| 久久不射影院| 很黄的网站在线观看| 精品无码av在线| 日韩中文在线视频| 亚洲免费电影一区| 中文字幕一区二区5566日韩| 性生活黄色大片| 性孕妇free特大另类| 中文字幕一区三区| 99re6热在线精品视频播放速度| 69精品人人人人| 99国内精品久久久久| 男人用嘴添女人下身免费视频| 成人久久18免费网站麻豆| 国产精品私人自拍| 欧美香蕉大胸在线视频观看| 亚洲国产成人va在线观看天堂| 青青艹在线视频| 日韩av日韩在线观看| 男人和女人啪啪网站| 91精品亚洲一区在线观看| 91在线观看免费观看| 亚洲精品小区久久久久久| 老司机午夜在线| 久久精品人妻一区二区三区| 色综合一个色综合亚洲| 国产精品一区二区婷婷| 精品日韩久久久| 精品日韩成人av| 视频一区视频二区中文字幕| 99精品视频在线播放免费| 夜夜爽www精品| 最新日韩在线视频| 你懂的视频欧美| 亚洲综合av一区| 日韩高清免费观看| 秋霞网一区二区三区| 国产精品久久二区| www视频在线看| 国产久一一精品| 国产精品suv一区二区三区| 成人动漫中文字幕| 一区二区在线观看视频在线| 欧美精品九九99久久| 日本久久天堂| 亚洲国产精品久久久久久6q| 99精品一区二区三区无码吞精| 69视频在线观看免费| 亚洲精品第二页|