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

幾種常見mybatis分頁實(shí)現(xiàn)方式

 更新時間:2023年11月18日 16:24:09   作者:luffy5459  
這篇文章主要介紹了幾種常見mybatis分頁實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

幾種常見mybatis分頁實(shí)現(xiàn)

mybatis框架分頁實(shí)現(xiàn),有幾種方式,最簡單的就是利用原生的sql關(guān)鍵字limit來實(shí)現(xiàn),還有一種就是利用interceptor來拼接sql,實(shí)現(xiàn)和limit一樣的功能,再一個就是利用PageHelper來實(shí)現(xiàn)。

這里講解這三種常見的實(shí)現(xiàn)方式:

無論哪種實(shí)現(xiàn)方式,我們返回的結(jié)果,不能再使用List了,需要一個自定義對象Pager。

package com.xxx.mybatis.bean;
import java.util.List;
public class Pager<T> {
	private int page;//分頁起始頁
	private int size;//每頁記錄數(shù)
	private List<T> rows;//返回的記錄集合
	private long total;//總記錄條數(shù)
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	public List<T> getRows() {
		return rows;
	}
	public void setRows(List<T> rows) {
		this.rows = rows;
	}
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
}

limit關(guān)鍵字實(shí)現(xiàn)

UserDao.java增加兩個方法

public List<User> findByPager(Map<String, Object> params);
public long count();

UserMapper.xml中增加兩個查詢

<select id="findByPager" resultType="com.xxx.mybatis.domain.User">
	select * from xx_user limit #{page},#{size}
</select>
<select id="count" resultType="long">
	select count(1) from xx_user
</select>

UserService.java中增加分頁方法

public Pager<User> findByPager(int page,int size){
	Map<String, Object> params = new HashMap<String, Object>();
	params.put("page", (page-1)*size);
	params.put("size", size);
	Pager<User> pager = new Pager<User>();
	List<User> list = userDao.findByPager(params);
	pager.setRows(list);
	pager.setTotal(userDao.count());
	return pager;
}

這是最直觀的實(shí)現(xiàn)方式,也是最簡單的,不用任何插件或者工具就能夠很方便的實(shí)現(xiàn)的方法。 

interceptor plugin實(shí)現(xiàn)

需要定義一個類實(shí)現(xiàn)Interceptor接口

MyPageInterceptor.java

package com.xxx.mybatis.bean;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
public class MyPageInterceptor implements Interceptor {
	
	private int page;
	private int size;
	@SuppressWarnings("unused")
	private String dbType;
 
	@SuppressWarnings("unchecked")
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		System.out.println("plugin is running...");
		StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
		MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
		while(metaObject.hasGetter("h")){
			Object object = metaObject.getValue("h");
			metaObject = SystemMetaObject.forObject(object);
		}
		while(metaObject.hasGetter("target")){
			Object object = metaObject.getValue("target");
			metaObject = SystemMetaObject.forObject(object);
		}
		MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement");
		String mapId = mappedStatement.getId();
		if(mapId.matches(".+ByPager$")){
			ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler");
			Map<String, Object> params = (Map<String, Object>)parameterHandler.getParameterObject();
			page = (int)params.get("page");
			size = (int)params.get("size");
			String sql = (String) metaObject.getValue("delegate.boundSql.sql");
			sql += " limit "+(page-1)*size +","+size;
			metaObject.setValue("delegate.boundSql.sql", sql);
		}
		return invocation.proceed();
	}
 
	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}
 
	@Override
	public void setProperties(Properties properties) {
		String limit = properties.getProperty("limit","10");
		this.page = Integer.parseInt(limit);
		this.dbType = properties.getProperty("dbType", "mysql");
	}
 
}

我們之前在service的findByPager方法里面,為了給limit傳入兩個參數(shù),其中page做了計算,這里使用攔截器的方式就無需計算了:

public Pager<User> findByPager(int page,int size){
	Map<String, Object> params = new HashMap<String, Object>();
	params.put("page", page);
	params.put("size", size);
	Pager<User> pager = new Pager<User>();
	List<User> list = userDao.findByPager(params);
	pager.setRows(list);
	pager.setTotal(userDao.count());
	return pager;
}

spring配置中,增加plugin設(shè)置:

到這里,你也許也猜到了MyPageInterceptor實(shí)際上是以一種攔截器的方式在程序執(zhí)行findByPager方法的時候,對語句會增加limit page,size的拼接,還是和第一種原生實(shí)現(xiàn)思路一樣,所以這里需要對UserMapper.xml配置文件中的findByPager這個查詢對應(yīng)的語句中的limit #{page},#{size}這部分去掉,變?yōu)槿缦碌臉幼樱?/p>

至此,通過攔截器插件的方式也實(shí)現(xiàn)了分頁功能了。 

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

這種方式實(shí)現(xiàn)需要我們引入maven依賴。

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>4.2.1</version>
 </dependency>

spring.xml配置文件做一下修改:

 <bean id="pageInterceptor" class="com.github.pagehelper.PageHelper">
	<property name="properties">
		<props>
			<prop key="helperDialect">mysql</prop>
			<prop key="reasonable">true</prop>
			<prop key="supportMethodsArguments">true</prop>
			<prop key="params">count=countSql</prop>
		</props>
	</property>
 </bean>
 
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="mapperLocations"  value="classpath:com/xxx/mybatis/dao/*Mapper.xml"/>
	<property name="plugins" ref="pageInterceptor"></property>
</bean> 

service層的方法,做一些修改:

public Pager<User> findByPager(int page,int size){
	Pager<User> pager = new Pager<User>();
	Page<User> res = PageHelper.startPage(page,size);
	userDao.findAll();
	pager.setRows(res.getResult());
	pager.setTotal(res.getTotal());
	return pager;
}

至此,PageHelper工具方法實(shí)現(xiàn)分頁也實(shí)現(xiàn)了。其實(shí)PageHelper方法也是第二種使用Interceptor攔截器方式的一種三方實(shí)現(xiàn),它內(nèi)部幫助我們實(shí)現(xiàn)了Interceptor的功能。

所以我們不用自定義MyPageInterceptor這個類了。

實(shí)際上也是在運(yùn)行查詢方法的時候,進(jìn)行攔截,然后設(shè)置分頁參數(shù)。

所以PageHelper.startPage(page,size)這一句需要顯示調(diào)用,然后再執(zhí)行userDao.findAll(),在查詢所有用戶信息的時候,會進(jìn)行一個分頁參數(shù)設(shè)置,讓放回的結(jié)果只是分頁的結(jié)果,而不是全部集合。

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java擴(kuò)展Hibernate注解支持java8新時間類型

    java擴(kuò)展Hibernate注解支持java8新時間類型

    這篇文章主要介紹了java擴(kuò)展Hibernate注解支持java8新時間類型,需要的朋友可以參考下
    2014-04-04
  • 基于Java編寫一個html轉(zhuǎn)pdf的工具類

    基于Java編寫一個html轉(zhuǎn)pdf的工具類

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫一個html轉(zhuǎn)pdf的工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下
    2025-09-09
  • 使用CI/CD工具Github Action發(fā)布jar到Maven中央倉庫的詳細(xì)介紹

    使用CI/CD工具Github Action發(fā)布jar到Maven中央倉庫的詳細(xì)介紹

    今天通過對Github Action的簡單使用來介紹了CI/CD的作用,這個技術(shù)體系是項(xiàng)目集成交付的趨勢,也是面試中的一個亮點(diǎn)技能。 而且這種方式可以實(shí)現(xiàn)“一次配置,隨時隨地集成部署”,感興趣的朋友一起看看吧
    2021-07-07
  • SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    跨域問題指的是不同站點(diǎn)之間,使用 ajax 無法相互調(diào)用的問題,跨域問題本質(zhì)是瀏覽器的一種保護(hù)機(jī)制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),本文給大家介紹了SpringBoot使用CORS解決無法跨域訪問問題的具體步驟,需要的朋友可以參考下
    2025-05-05
  • 動態(tài)遞歸之正則表達(dá)式實(shí)戰(zhàn)案例(含Java代碼)

    動態(tài)遞歸之正則表達(dá)式實(shí)戰(zhàn)案例(含Java代碼)

    正則表達(dá)式是對字符串的一種描述方法,即使用特定的信息來描述字符串格式的一種方式,這篇文章主要介紹了動態(tài)遞歸之正則表達(dá)式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • SpringMVC如何域?qū)ο蠊蚕頂?shù)據(jù)

    SpringMVC如何域?qū)ο蠊蚕頂?shù)據(jù)

    在Spring MVC中,可以使用域?qū)ο髞砉蚕頂?shù)據(jù),域?qū)ο笫且粋€Map類型的對象,可以在請求處理方法之間共享數(shù)據(jù),本文給大家介紹SpringMVC 域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,一起看看吧
    2023-09-09
  • 微服務(wù)通過Feign調(diào)用進(jìn)行密碼安全認(rèn)證操作

    微服務(wù)通過Feign調(diào)用進(jìn)行密碼安全認(rèn)證操作

    這篇文章主要介紹了微服務(wù)通過Feign調(diào)用進(jìn)行密碼安全認(rèn)證操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 9種Java單例模式詳解(推薦)

    9種Java單例模式詳解(推薦)

    這篇文章主要介紹了9種Java單例模式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 使用Iterator刪除List中的多個元素操作

    使用Iterator刪除List中的多個元素操作

    這篇文章主要介紹了使用Iterator刪除List中的多個元素操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java面向接口編程之簡單工廠模式示例

    Java面向接口編程之簡單工廠模式示例

    這篇文章主要介紹了Java面向接口編程之簡單工廠模式,結(jié)合實(shí)例形式詳細(xì)分析了java面向接口編程簡單工廠模式的具體定義與使用方法,需要的朋友可以參考下
    2019-09-09

最新評論

青海省| 宜都市| 临清市| 思茅市| 淮南市| 双城市| 巴塘县| 镇安县| 礼泉县| 丹寨县| 团风县| 星子县| 徐水县| 万安县| 伊宁市| 贺州市| 确山县| 凤山市| 平度市| 达日县| 赤城县| 桐柏县| 永宁县| 甘南县| 云阳县| 涿鹿县| 普洱| 牙克石市| 股票| 济源市| 绍兴县| 嘉鱼县| 柳河县| 湘阴县| 博野县| 汉川市| 罗田县| 南郑县| 泸定县| 昌平区| 贵阳市|