最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis攔截器與分頁(yè)插件實(shí)例教程

 更新時(shí)間:2019年04月04日 09:16:42   作者:五頭牛  
Mybatis攔截器常常會(huì)被用來(lái)進(jìn)行分頁(yè)處理。所以下面這篇文章主要給大家介紹了關(guān)于mybatis攔截器與分頁(yè)插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

mybatis介紹

攔截器的一個(gè)作用就是我們可以攔截某些方法的調(diào)用,我們可以選擇在這些被攔截的方法執(zhí)行前后加上某些邏輯,也可以在執(zhí)行這些被攔截的方法時(shí)執(zhí)行自己的邏輯而不再執(zhí)行被攔截的方法。

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄。

mybatis架構(gòu)圖

我們這個(gè)demo實(shí)現(xiàn)就是基于mybatis的插件模塊(主要實(shí)現(xiàn)mybatis的Interceptor接口)

Interceptor接口

package org.apache.ibatis.plugin;

import java.util.Properties;

/**
 * @author Clinton Begin
 */
public interface Interceptor {

 Object intercept(Invocation invocation) throws Throwable;

 Object plugin(Object target);

 void setProperties(Properties properties);
}

demo實(shí)現(xiàn)

主要技術(shù) spring boot + mybatis

pom.xml

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 </dependency>

數(shù)據(jù)庫(kù) DDL

create table user
(
 id int  auto_increment primary key,
 username varchar(20) null
);

核心代碼

 @Override
 public Object intercept(Invocation invocation) throws Throwable {
 logger.info("進(jìn)入攔截器");
 Object[] args = invocation.getArgs();
 MappedStatement mappedStatement = (MappedStatement) args[0];

 //獲取參數(shù)
 Object param = invocation.getArgs()[1];
 BoundSql boundSql = mappedStatement.getBoundSql(param);
 Object parameterObject = boundSql.getParameterObject();

 /**
  * 判斷是否是繼承PageVo來(lái)判斷是否需要進(jìn)行分頁(yè)
  */
 if (parameterObject instanceof PageVo) {
  //強(qiáng)轉(zhuǎn) 為了拿到分頁(yè)數(shù)據(jù)
  PageVo pagevo = (PageVo) param;
  String sql = boundSql.getSql();
  
  //獲取相關(guān)配置
  Configuration config = mappedStatement.getConfiguration();
  Connection connection = config.getEnvironment().getDataSource().getConnection();

  //拼接查詢當(dāng)前條件的sql的總條數(shù)
  String countSql = "select count(*) from (" + sql + ") a";
  PreparedStatement preparedStatement = connection.prepareStatement(countSql);
  BoundSql countBoundSql = new BoundSql(config, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
  ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBoundSql);
  parameterHandler.setParameters(preparedStatement);
  //執(zhí)行獲得總條數(shù)
  ResultSet rs = preparedStatement.executeQuery();
  int count = 0;
  if (rs.next()) {
  count = rs.getInt(1);
  }
  //拼接分頁(yè)sql
  String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset();
  //重新執(zhí)行新的sql
  doNewSql(invocation, pageSql);

  Object result = invocation.proceed();
  connection.close();
  //處理新的結(jié)構(gòu)
  PageResult<?> pageResult = new PageResult<List>(pagevo.page, pagevo.rows, count, (List) result);
  List<PageResult> returnResultList = new ArrayList<>();
  returnResultList.add(pageResult);

  return returnResultList;
 }
 return invocation.proceed();
 }

測(cè)試結(jié)果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下載

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 詳解Java面向?qū)ο缶幊讨鄳B(tài)

    詳解Java面向?qū)ο缶幊讨鄳B(tài)

    這篇文章主要為大家介紹了Java面向?qū)ο缶幊讨鄳B(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池簡(jiǎn)易教程

    Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池簡(jiǎn)易教程

    這篇文章主要為大家介紹了Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池簡(jiǎn)易教程,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù)

    JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù)

    這篇文章主要介紹了JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù) ,本文通過(guò)一段代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)Kruskal算法的示例代碼

    Java實(shí)現(xiàn)Kruskal算法的示例代碼

    Kruskal算法是一種用來(lái)尋找最小生成樹(shù)的算法,由Joseph Kruskal在1956年發(fā)表。用來(lái)解決同樣問(wèn)題的還有Prim算法和Boruvka算法等。本文將介紹用Java語(yǔ)言實(shí)現(xiàn)Kruskal算法的示例代碼,需要的可以參考一下
    2022-07-07
  • nacos中的配置使用@Value注解獲取不到值的原因及解決方案

    nacos中的配置使用@Value注解獲取不到值的原因及解決方案

    這篇文章主要介紹了nacos中的配置使用@Value注解獲取不到值的原因分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 如何實(shí)現(xiàn)java Iterator迭代器功能

    如何實(shí)現(xiàn)java Iterator迭代器功能

    這篇文章主要介紹了如何實(shí)現(xiàn)java Iterator迭代器功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java雙向鏈表的操作

    Java雙向鏈表的操作

    這篇文章主要介紹了Java雙向鏈表的操作,雙向鏈表,對(duì)于該鏈表中的任意節(jié)點(diǎn),既可以通過(guò)該節(jié)點(diǎn)向前遍歷,也可以通過(guò)該節(jié)點(diǎn)向后遍歷,雙向鏈表在實(shí)際工程中應(yīng)用非常廣泛,是使用鏈表這個(gè)結(jié)構(gòu)的首選
    2022-06-06
  • Java熱門筆試試題整理

    Java熱門筆試試題整理

    給大家整理了現(xiàn)在很熱門的java程序員面試時(shí)候的筆試試題以及答案,希望能幫助到你。
    2017-11-11
  • IntelliJ?IDEA?2022安裝注冊(cè)永久激活

    IntelliJ?IDEA?2022安裝注冊(cè)永久激活

    java開(kāi)發(fā)工具IntelliJ?IDEA深受用戶喜愛(ài),很多朋友對(duì)這個(gè)idea開(kāi)發(fā)工具比較忠心,一旦有新版本發(fā)出,很多小伙伴就迫不及待的想更新,今天小編給大家?guī)?lái)了idea2022.1最新永久激活碼,親測(cè)有效,喜歡的朋友快來(lái)下載體驗(yàn)吧
    2022-08-08
  • java之左旋轉(zhuǎn)字符串介紹

    java之左旋轉(zhuǎn)字符串介紹

    java之左旋轉(zhuǎn)字符串介紹,需要的朋友可以參考一下
    2013-02-02

最新評(píng)論

蕲春县| 侯马市| 陈巴尔虎旗| 建平县| 伊通| 汪清县| 安新县| 绩溪县| 怀集县| 佛坪县| 山西省| 太仓市| 三门峡市| 白朗县| 土默特左旗| 招远市| 泰来县| 深水埗区| 紫云| 宁强县| 山阴县| 舒城县| 新绛县| 广南县| 宁陵县| 屯留县| 舒城县| 宁远县| 乡宁县| 会昌县| 鹿泉市| 荆门市| 辽宁省| 蒙城县| 尉氏县| 沿河| 胶南市| 清原| 六安市| 从江县| 宝坻区|