MyBatis中分页的实现

mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession,Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程

SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(r);
SqlSession session=fac.openSession();
RoleMapper roleMapper=session.getMapper(RoleMapper.class);
roleMapper.insertSelective(role);
session.commit();
session.close();

1、在映射元文件中直接编写相关的SQL语句实现分页

<select id="selectByMap" parameterType="map" resultMap="BaseResultMap">
		<if test="rowsPerPage!=null and rowsPerPage > 0 and pageNum!=null">
			select * from (
			select rownum rn,t.* from (
		</if>
		select
		<include refid="Base_Column_List" />
		from t_roles
		<include refid="condition" />
		<if test="rowsPerPage!=null and rowsPerPage > 0 and pageNum!=null">
		<![CDATA[
		) t where rownum<=${pageNum*rowsPerPage}
		) where rn>${(pageNum-1)*rowsPerPage}
		]]>
		</if>
	</select>

问题在于不能跨数据库平台

2、在跟踪代码时可以发现其中有个扩展点:Plugin,可以通过添加插件的方式拦截要执行的SQL语句,并根据配置的参数识别不同的数据库实现生成不同的分页查询语句
映射元文件中只使用标准SQL[ISO ANSI]
通过拦截器根据配置信息识别不同的数据库平台追加对应的方言
–和使用mybatis的初衷有抵触:以编写SQL语句的工作量为代价换取高灵活性,例如高度优化的SQL语句

String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");要执行的SQL语句
        //构建分页功能的sql语句
         limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;
        MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);将原始要执行的SQL语句修改为带有分页操作的SQL

3、使用PageHelper框架实现分页

添加依赖
	<dependency>
		<groupId>com.github.pagehelper</groupId>
		<artifactId>pagehelper-spring-boot-starter</artifactId>
		<version>1.2.9</version>
	</dependency>

配置
pagehelper.helper-dialect=mysql分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle mysql mariadb sqlite hsqldb postgresql db2 sqlserver informix h2 sqlserver2012 derby

reasonable:分页合理化参数,默认值为false。当该参数设置为true时,pageNum<=0时会查询第一页,pageNum超过总数时,会查询最后一页。默认false时,直接根据参数进行查询

编码调用
	在执行查询之前调用PageHelper.startPage(第几页,每页行数);
	PageHelper.startPage(1,3);
	return userMapper.selectAll();

startPage返回的Page对象在执行查询后自动填充了相关数据,其中包括pageNum=正确的当前页面, pageSize=每页行数, startRow=起始行号, endRow=终止行号, total=总行数, pages=最大页码值

具体应用:
	Page pageInfo = null;
	if (pages != null && pages.getRowsPerPage() > 0) {
		pageInfo = PageHelper.startPage(pages.getPageNum(), pages.getRowsPerPage());
	}
	res = userMapper.selectAll();
	if (pages!=null && pageInfo != null) {
		pages.setMaxPage(pageInfo.getPages());
		pages.setPageNum(pageInfo.getPageNum());
		pages.setRowsNum(((Number)pageInfo.getTotal()).intValue());
	}

4、MyBatis支持软分页

RowBounds rowBounds = new RowBounds(offset, page.getPageSize()); 
		// offset起始行 
		// limit是当前页显示多少条数据

	RowBounds rowBounds = new RowBounds(2, 2);
	List<Role> rlist = session.selectList("com.yan.dao.RoleMapper.selectByMap", new HashMap<String, Object>(),
			rowBounds);

具体的实现:

DefaultResultContext<Object> resultContext = new DefaultResultContext<Object>();
	//跳过RowBounds设置的offset值
	skipRows(rsw.getResultSet(), rowBounds);

什么是Thymeleaf
Thymeleaf是一个模板引擎,它可以完全替代JSP。不同于一般地在模板里编码实现逻辑,而是利用了XML标签和属性,由模板引擎来执行这些DOM上预定义好的逻辑。
是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本。

模板语言或模板引擎是什么?
常见的模板语言都包含以下几个概念:数据Data、模板Template、模板引擎Template Engine和结果文档Result Documents
数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意
义,数据只有对实体行为产生影响时才成为信息。
模板,是一个蓝图,即一个与类型无关的类。编译器在使用模板时,会根据模板实参对模板进行实例化,得到一个与类型相关的类
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个
标准的HTML文档
结果文档是一种特定格式的文档,比如用于网站的模板引擎就会生成一个标准的HTML文档。

模板语言用途广泛,常见的用途如下:页面渲染、文档生成、代码生成。所有 “数据+模板=文本” 的应用场景

Thymeleaf特点:
1、Thymeleaf在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持
html原型,然后在html标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释html时会忽略未定义的标签属性,所以thymeleaf的模板可以静态地运行;当有数据
返回到页面时,Thymeleaf标签会动态地替换掉静态内容,使页面动态显示。
  2、Thymeleaf开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时
开发人员也可以扩展和创建自定义的方言。
 3、Thymeleaf提供spring标准方言和一个与SpringMVC完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

添加依赖:

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

添加配置信息
在application.properties中添加

#thymelea模板配置
		spring.thymeleaf.prefix=classpath:/templates/
		spring.thymeleaf.suffix=.html
		spring.thymeleaf.mode=HTML5一般spring.thymeleaf.mode的默认值是HTML5,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求
		spring.thymeleaf.encoding=UTF-8
	
#热部署文件,页面不产生缓存,及时更新
	spring.thymeleaf.cache=false
	spring.resources.chain.strategy.content.enabled=true
	spring.resources.chain.strategy.content.paths=/**

页面开发流程:
引用命名空间在html中引入此命名空间,可避免编辑器出现html验证错误,虽然加不加命名空间对Thymeleaf的功能没有任何影响。

th:text文本替换    <p th:text="${collect}">description</p>
th:utext支持html的文本替换   <p th:utext="${htmlcontent}">conten</p>

可对表达式或变量求值,并将结果显示在其被包含的 html标签体内替换原有html文本。
文本链接: 用+号,若是变量表达式也可以用|符号

	在标签内赋值。<p>Hello, [[${session.user.name}]]!</p>
	等价于<p>Hello, <span th:text="${session.user.name}">Sebastian</span>!</p>
	
	表达式:
		${session.user.name}原理类似OGNL/SpringEL表达式	
	
	表达式基本对象:
		当对上下文变量评估OGNL表达式时,某些对象可用于表达式以获得更高的灵活性。这些对象将被引用(按照OGNL标准),从#符号开始:
			#ctx:上下文对象。
			#vars: 上下文变量。
			#locale:上下文区域设置。
			#request:(仅在Web上下文中)HttpServletRequest对象。
			#response:(仅在Web上下文中)HttpServletResponse对象。
			#session:(仅在Web上下文中)HttpSession对象。
			#servletContext:(仅在Web上下文中)ServletContext对象。
			
				例子:${#session.id}调用session.getId()
		
	简单数据转换(数字,日期)
		    <td>价格</td>
    			<td th:text="${#numbers.formatDecimal(product.price, 1, 2)}">180</td>
			<td>进货日期</td>
   			<td th:text="${#dates.format(user.birth, 'yyyy-MM-dd')}">2018-01-01</td>

th:remove删除某个属性

<tr th:remove="all"> 
     		1.all:删除包含标签和所有的孩子。
        2.body:不包含标记删除,但删除其所有的孩子。
        3.tag:包含标记的删除,但不删除它的孩子。
        4.all-but-first:删除所有包含标签的孩子,除了第一个。
        5.none:什么也不做。这个值是有用的动态评估。

条件判断

<span th:if="${product.price lt 100}">Special offer!</span>
	<a th:href="@{/login}" th:unless="${session.user!=null}">Login</a>

th:unless于th:if恰好相反,只有表达式中的条件不成立,才会显示其内容

		 <tr th:each="u1:${userList}">
    			<td th:text="${u1.name}">Onions</td>
          </tr>
		<h1 th:text="${appName}">用户管理</h1>
			${appName}用来引用appName变量

th:href链接地址

<a href="login.html" th:href="@{/login}">Login</a>

@{……}支持绝对路径和相对路径
绝对URL(Absolute URLs) 开始通过指定协议名称(包含http://或https://开头)

<script type="text/javascript" th:src="@{https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js}"></script>

上下文相关的URL(Context-relative URLs) 最常用的如应用程序myapp的访问地址:http://localhost:8080/pp,那么pp就是上下文名称

	/表示从应用程序根路径开始访问 ,去掉/表示相对路径
    <script type="text/javascript" th:src="@{/jslib/jquery.validate.js}"></script>

星号选择符

		    <tr th:object="${pages}">
				<td>
					<a th:href="@{/users/}+*{pageNum}+'/list'">ddd</a>
				</td>
			</tr>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值