问题:
在使用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());
}
}
测试结果如图,验证成功