Mybatis分頁視頻教程,超強實戰(zhàn)

Mybatis分頁視頻教程,超強實戰(zhàn)

長沙一度軟件培訓(xùn)      2022-03-24 11:10:01     12

Mybatis分頁視頻教程,超強實戰(zhàn),MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細(xì)介紹

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

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

無論哪種實現(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)鍵字實現(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;}

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

interceptor plugin實現(xiàn):

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

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

PageHelper實現(xiàn):

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

零基礎(chǔ)學(xué)習(xí)Mybatis,推薦長沙一度軟件培訓(xùn)Mybatis菜鳥教程,通過本課程的學(xué)習(xí),可以在最短的時間內(nèi)學(xué)會使用持久層框架MyBatis,在該視頻中沒有廢話,都是干貨,該視頻的講解不是學(xué)術(shù)性研究,項目中用什么,這里就講什么,如果您現(xiàn)在項目中馬上要使用MyBatis框架,那么您只需要學(xué)習(xí)完此教程,就可以順利的使用MyBatis開發(fā)了。

以上就是長沙一度軟件培訓(xùn)Java培訓(xùn)機(jī)構(gòu)的小編針對“Mybatis分頁視頻教程,超強實戰(zhàn)”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

培訓(xùn)啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險,謹(jǐn)防上當(dāng)。