大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Mybatis分頁視頻教程,超強實戰

Mybatis分頁視頻教程,超強實戰

更新時間:2021-03-03 15:12:35 來源:動力節點 瀏覽2053次

MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

今天我們就來學學mybatis框架分頁實現,有幾種方式,最簡單的就是利用原生的sql關鍵字limit來實現,還有一種就是利用interceptor來拼接sql,實現和limit一樣的功能,再一個就是利用PageHelper來實現。這里講解這三種常見的實現方式:

mybatis分頁視頻教程

無論哪種實現方式,我們返回的結果,不能再使用List了,需要一個自定義對象Pager。

package com.xxx.mybatis.bean;
import java.util.List;
public class Pager<T> {
	private int page;//分頁起始頁
	private int size;//每頁記錄數
	private List<T> rows;//返回的記錄集合
	private long total;//總記錄條數
	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關鍵字實現:

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;
}

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

interceptor plugin實現:

需要定義一個類實現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傳入兩個參數,其中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設置:

到這里,你也許也猜到了MyPageInterceptor實際上是以一種攔截器的方式在程序執行findByPager方法的時候,對語句會增加limit page,size的拼接,還是和第一種原生實現思路一樣,所以這里需要對UserMapper.xml配置文件中的findByPager這個查詢對應的語句中的limit#{page},#{size}這部分去掉,變為如下的樣子:

至此,通過攔截器插件的方式也實現了分頁功能了。

PageHelper實現:

這種方式實現需要我們引入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工具方法實現分頁也實現了。其實PageHelper方法也是第二種使用Interceptor攔截器方式的一種三方實現,它內部幫助我們實現了Interceptor的功能。所以我們不用自定義MyPageInterceptor這個類了。實際上也是在運行查詢方法的時候,進行攔截,然后設置分頁參數。所以PageHelper.startPage(page,size)這一句需要顯示調用,然后再執行userDao.findAll(),在查詢所有用戶信息的時候,會進行一個分頁參數設置,讓放回的結果只是分頁的結果,而不是全部集合。

零基礎學習Mybatis,推薦動力節點Mybatis菜鳥教程,通過本課程的學習,可以在最短的時間內學會使用持久層框架MyBatis,在該視頻中沒有廢話,都是干貨,該視頻的講解不是學術性研究,項目中用什么,這里就講什么,如果您現在項目中馬上要使用MyBatis框架,那么您只需要學習完此教程,就可以順利的使用MyBatis開發了。

以上就是動力節點Java培訓機構的小編針對“Mybatis分頁視頻教程,超強實戰”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日日草天天干 | 天天操天天摸天天舔 | 久久美女精品国产精品亚洲 | 成人性生活视频 | 高清亚洲综合色成在线播放放 | 国产精品热久久 | 福利社看片| 欧美日韩激情在线一区 | 97在线资源 | 久久一区二区精品 | 97免费视频在线 | 国产成人一级片 | 999成人国产精品 | 国产边打电话边被躁视频 | 国产精品推荐 | 91成人在线| 久久精品人人做人人爱爱 | 国内精品伊人久久大香线焦 | 国产性做久久久久久 | 中文字幕丝袜在线56页 | 香蕉综合视频 | 欧美精品一区在线看 | 东北老妇露脸xxxxx | 99久久久无码国产精品 | 亚洲一区成人 | 极品吹潮视频大喷潮tv | 性做久久久久久久久男女 | 一区二区三区成人 | 美女羞羞视频网站 | 国产欧美日韩精品专区 | 国产成人综合网亚洲欧美在线 | 日韩欧美视频在线 | 中文字幕 一区 婷婷 在线 | 91成人啪国产啪永久地址 | 91九色视频在线观看 | 狠狠乱| 日韩中文在线观看 | 免费精品国产自产拍在 | 精品一久久香蕉国产线看观 | 立即播放免费毛片一级 | 操美女模特 |