Mybatis Example对Oracle数据库的分页查询

问题:

    在使用mybatis过程中通过mybatis-generator逆向生成实体(包含example)和mapper(包含xml文件)。

    对于example的理解,可以认为是一个高级查询的过程,但从执行代码的表面角度看,有点像Hibernate。

    如何使用mybatis的example来实现一个有条件筛选的分页?

思路:

    先在navicat中写出一个简单的能够实现筛选(条件)和分页的sql语句

    mysql中实现比较简单

select * from tableA where A.a>10 limit startRow ,pageSize

    在Oracle中语句就相对比较复杂

SELECT
	* 
FROM
	( SELECT t.*, row_number () over ( ORDER BY GUID ) AS num FROM tableA t WHERE MJ >= 10 ) tt 
WHERE
	num BETWEEN 5 
	AND 6

    简单解释一下这个语句,先从from()开始理解:

    首先查询条件筛选过的A.*(全部字段)和row_number()

    然后再从其中查询序列号在5到6的结果(ps:也是一个条件查询)

解决:

    1在mapper.java中声明方法

List<WfjzTsjb> selectByPage(@Param("start") int start,@Param("end") int end,@Param("example") AExample example); 

    2在对应的mapper.xml中写对应的sql语句

扫描二维码关注公众号,回复: 1896638 查看本文章
     <select id="selectByPage" parameterType="com.pojo.A" resultMap="BaseResultMap">
	    select
	    <include refid="Base_Column_List" />
	    from  ( SELECT t.*, row_number () over ( ORDER BY GUID ) as num FROM Database.A t 
	    <if test="param3 != null">  
	    	<include refid="Update_By_Example_Where_Clause" />  
	    </if>
	    ) tt 
		where num between #{start} and #{end}
  	</select>

    ps:关键是<if test="param3!=null">,因为这个是参照默认的selectByExample写的,_parameter是接口方法中只有一个参数的写法

    3编写测试方法,测试结果

public class SimpleTest{
    static ListServiceImpl serviceImpl = new ListServiceImpl();
	
    public static void main(String[] args) throws IOException {
	// TODO Auto-generated method stub
	String resource = "mybatis.xml";           // 定位核心配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    // 创建 SqlSessionFactory

        SqlSession sqlSession = sqlSessionFactory.openSession();    // 获取到 SqlSession
        AMapper aMapper = sqlSession.getMapper(AMapper.class);
        AExample example = new AExample();
        Criteria criteria = example.createCriteria();
        BigDecimal dec = new BigDecimal(10.0);
        criteria.andMjGreaterThanOrEqualTo(dec);
        List<A> list = aMapper.selectByPage(5, 10, example);
		//serviceImpl.getList().size());
        for(A a : list)
        	System.out.println("当前:" + a.getMj());
	}
}

测试结果如图,验证成功


猜你喜欢

转载自blog.csdn.net/u014418725/article/details/79714367
今日推荐