Mybatis学习笔记(五)

在前四章中我们已经基本完成了对单表的CRUD与多表联合查询方式的Mybatis操作与配置方式,今天这里要讲的是关于一个业务问题中我们常 碰到的分页问题。在开发web项目的时候我们经常会使用到列表显示,一般我们都会用一些常用的列表控件例如,datatables(个人感觉十分不 错),easy ui下面的那些封装好的表格控件。

思路:在这些控件里要达到分页的效果,一般都会传2个参数,第一个是表示当前页的索 引(一般从0开始),第二个表示当前页展示多少条业务记录,然后将相应的参数传递给List<T> getList(PagenateArgs args)方法,最终实现数据库中的分页时候我们可以使用limit关键词(针对mysql)进行分页,如果是oracle或者sql server他们都有自带的rownum函数可以使用。

针对上述思路,首先我们需要还是一如既往的在 com.yy.model下面新建一个名为PagenateArgs的分页参数实体类与一个名为SortDirectionEnum的枚举 类

package com.yy.model;


//分页参数实体类;
public class PagenateArgs {

            private int pageNum;//页数
   private int pageSize;//每页显示记录数
   private int pages;//当前页第一条记录索引
   private String orderFieldStr;//排序字段
   private String orderDirectionStr;//排序方向


   public PagenateArgs() {
            pages=(pageNum-1)*pageSize+1;
   }


   public PagenateArgs(int pageNum, int pageSize, String orderFieldStr, String orderDirectionStr) {
       this.pageNum = pageNum;
       this.pageSize = pageSize;
       this.orderFieldStr = orderFieldStr;
       this.orderDirectionStr = orderDirectionStr;
       this.pages=(pageNum-1)*pageSize+1;
   }


   public int getPageNum() {
return pageNum;
}


public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}


public int getPageSize() {
return pageSize;
}


public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}


public int getPages() {
return pages;
}



public String getOrderFieldStr() {
return orderFieldStr;
}


public void setOrderFieldStr(String orderFieldStr) {
this.orderFieldStr = orderFieldStr;
}


public String getOrderDirectionStr() {
return orderDirectionStr;
}


public void setOrderDirectionStr(String orderDirectionStr) {
this.orderDirectionStr = orderDirectionStr;
}


}

/*
 * 排序枚举
 
*/
public enum SortDirectionEnum {
    
/*
     * 升序
     
*/
    ASC,
    
    
/*
     * 降序
     
*/
    DESC
}

    完成上面的步骤以后我们在IVisitorOperation接口类中继续添加一个方法public List<Visitor> getListByPagenate(PagenateArgs args),前几章中我们其实已经有getList方法了,这次的分页其实也就是在这个的基础上稍加改动即可,IVisitorOperation接口类 改动后如下所示:

package com.yy.demo;


import java.util.List;


import com.yy.model.PagenateArgs;
import com.yy.model.Visitor;
/*
 * 访问者操作接口;
 */
public interface IVisitorOperation {
/*
* 基础查询;
*/
public Visitor basicQuery(int id);
/*
* 添加访问者;
*/
public int add(Visitor visitor);
/*
* 删除访问者;
*/
public int delete(int id);
/*
* 更新访问者;
*/
public int update(Visitor visitor);
/*
* 查询访问者(单个);
*/
public Visitor query(int id);
/*
* 查询访问者(多个)
*/
public List<Visitor> getList();
/*
     * 分页查询List
     */
    public List<Visitor> getListByPagenate(PagenateArgs args);    


} 接下来我们就要开始动手改动我们的VisitorMapper.xml配置文件了,新增一个<select>节点id与参数类型参照前几章的方式配置好,如下此处新增的id就为getListByPagenate,配置好以后如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yy.demo.IVisitorOperation">
<!-- 此处的resultType就是对应刚刚你在typeAlias节点里面规定的别名 -->
     <!-- 
        useGeneratedKeys="true"代表是否使用自增长序列, 
        keyProperty="Id"指定自增长列是哪一列, 
        parameterType="Visitor"指定IVisitorOperation接口类中定义中所传的相应类型
        resultType 表示返回的类型,例如query中的visitor
        resultMap 自定义的返回类型,是返回复杂类型是的最佳首选,也是mybatis里最强大的武器
     -->
     
     <!--
     MyBatis与SQL Server 驱动包sqljdbc4.jar存在兼容问题,故有些功能不予支持。
     useGeneratedKeys="true"
     keyProperty="Id"
     -->
     
     <insert id="add" parameterType="Visitor" useGeneratedKeys="true"
     keyProperty="Id">
     insert into Visitor(Id,Name,Email,Status,CreateTime)
     values(#{id},#{name},#{email},#{status},#{createTime})
     </insert>
     
     <delete id="delete" parameterType="int">
     delete from Visitor where
     status>0 and id=#{id}
     </delete>
     
     <update id="update" parameterType="Visitor">
     update Visitor set Name=#{name},Email=#{email},Status=#{status} where id=#{id}
     and Status>0
     </update>
     
    <select id="basicQuery" parameterType="int" resultType="Visitor">
        select * from visitor where id=#{id} and
        Status>0 order by Id
    </select>
    
    <select id="getList" resultMap="visitorRs">
    <include refid="getListSql"/>
    </select>
     <!-- 
        这里指的注意的地方是property属性,里面的字段一定要和你在实体里面定义的属性一样,此处区分大小写
        否则会出现默认setter为属性赋值的时候找不到相应属性的异常,大家可以试下
        column属性对应于查询语句返回结果集的名字,如果有为相应字段起过别名例如吧id变为了visitor_id
        那么相应的column名字也要对应上
    -->
    <resultMap type="Visitor" id="visitorRs">
    <id column="visitor_id" property="id" />
    <result column="Name" property="name"/>
    <result column="Email" property="email"/>
    <result column="Status" property="status"/>
    <result column="CreateTime" property="createTime"/>
    </resultMap>
    
    <sql id="getListSql">
    select  id as visitor_id, name, email, status, createtime  from Visitor where status>0
    </sql>
    
    <!-- 以下为新增部分用来分页,orderBySql这个提取出来 是为了后面有示例复用-->
    
    <!--  mysql分页
    <select id="getListByPagenate" parameterType="PagenateArgs" resultType="Visitor">
    select * from (
    <include refid="getListSql"/>
    <include refid="orderBySql"/>
    )t-->
    <!-- #{}表示参数化输出,${}表示直接输出不进行任何转义操作,自己进行转移 -->
    <!--  
    <if test="pageStart>-1 and pageSize>-1">
     limit #{pageStart}, #{pageSize}
    </if>
    
    </select>
    -->
    <!-- sqlserver分页 -->
    <select id="getListByPagenate" parameterType="PagenateArgs" resultType="Visitor">
   
    <include refid="getsqlserverList"/>
  
    
    </select>
    
    <sql id="getsqlserverList">
     select top ${pageSize} * from Visitor where id>=(select max(id) from 
    (select top ${pages} id from Visitor order by ${orderFieldStr} ${orderDirectionStr})t)
    </sql>
    
    <sql id="orderBySql">
    order by ${orderFieldStr}${orderDirectionStr}
    </sql>
</mapper>

在上面你会发现有类似,下图中的配置,这些是属于后面一章会讲述的动态SQL问题,现在可以暂时不管,这里面的字段属性都是针对PagenateArgs参数类中的属性名,保持一致


/*
 * 分页参数
 
*/
public static void queryVisitorListWithPagenate(int pageIndex, int pageSize, String orderField, String orderDire) {
    PagenateArgs args 
= new PagenateArgs(pageIndex, pageSize, orderField, orderDire);
    SqlSession session 
= MybatisUtils.getSqlSession();
    IVisitorOperation vOperation 
= session.getMapper(IVisitorOperation.class);
    List
<Visitor> visitors = vOperation.getListByPagenate(args);
    
for (Visitor visitor : visitors) {
        System.out.println(visitor);
    }
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
}

问题:

SQL: select top ? * from Visitor where id>=(select max(id) from      (select top ? id from Visitor order by id DESC ) t )

### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: '@P0' 附近有语法错误。

解决:

  <sql id="getsqlserverList">
     select top ${pageSize} * from Visitor where id>=(select max(id) from 
    (select top ${pages} id from Visitor order by ${orderFieldStr} ${orderDirectionStr})t)
    </sql>
    不能用#{},#{} 否则将报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值