在学习 Mybatis 等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
Limit 检索 stratIndex 默认从 0 开始,pageSize 表示查询的记录数。
#语法 SELECT * FROM table LIMIT stratIndex,pageSize SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 #为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. #如果只给定一个参数,它表示返回最大的记录行数目: SELECT * FROM table LIMIT 5; //检索前 5 个记录行 #换句话说,LIMIT n 等价于 LIMIT 0,n。 复制代码
接下来我们对项目进行修改。
1、UserMapper.java
List<User> getUserByLimit(Map<String,Integer> map); 复制代码
2、UserMapper.xml
<select id="getUserByLimit" parameterType="map" resultMap="userMap"> select * from mybatis.user limit ${startIndex},${pageSize}; </select> 复制代码
3、修改测试类
@Test public void getUserByLimit(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String,Integer> map = new HashMap<String, Integer>(); map.put("startIndex",0); map.put("pageSize",2); List<User> users = userMapper.getUserByLimit(map); for (User user : users) { System.out.println(user); } sqlSession.close(); } 复制代码
我们除了使用 Limit 在 SQL 层面实现分页,也可以使用 RowBounds 在 Java 代码层面实现分页,当然此种方式作为了解即可。我们来看下如何实现的!
修改步骤:
1、UserMapper.java
List<User> getUserByRounds(); 复制代码
2、UserMapper.xml
<select id="getUserByRounds" resultMap="userMap"> select * from mybatis.user </select> 复制代码
3、修改测试类
@Test public void getUserByRounds(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); RowBounds rowBounds = new RowBounds(1, 2); List<User> users = sqlSession.selectList("com.msdn.mapper.UserMapper.getUserList",null,rowBounds); for (User user : users) { System.out.println(user); } sqlSession.close(); } 复制代码
1、在 pom.xml 中添加如下依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency> 复制代码
2、在 MyBatis 配置 xml 中配置拦截器插件
<!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? --> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!--数据库方言--> <property name="helperDialect" value="mysql"/> <!--合理化分页--> <property name="reasonable" value="true"/> </plugin> </plugins> 复制代码
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
现在是一个特殊的 dialect
实现类,是分页插件的默认实现类,提供了和以前相同的用法。
3、测试类
@Test public void getUser(){ //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtil.getSqlSession(); //2.生成Dao代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //3.设置分页参数 int pageNun = 3; // 页码 int pageSize = 2;// 每页显示条数 PageHelper.startPage(pageNun,pageSize); //4. 查询用户数据 List<User> users = userMapper.getUserList(); //5.把用户数据封装到PageInfo分页结果对象 PageInfo<User> info = new PageInfo<User>(users); //6.取出PageInfo的属性 System.out.println("总记录数:" + info.getTotal()); System.out.println("当前页数:" + info.getPageNum()); System.out.println("每页数:" + info.getPageSize()); System.out.println("总页数:" + info.getPages()); System.out.println("结果集:" + info.getList()); for (User user : users) { System.out.println(user); } //7.关闭连接 sqlSession.close(); } 复制代码
执行结果为:
总记录数:5 当前页数:3 每页数:2 总页数:3 结果集:Page{count=true, pageNum=3, pageSize=2, startRow=4, endRow=6, total=5, pages=3, reasonable=true, pageSizeZero=false}[User(id=6, name=clearLove, password=12345)] User(id=6, name=clearLove, password=12345) 复制代码
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
具体选择哪个日志实现工具由 MyBatis 的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。 如果一个都未找到,日志功能就会被禁用。
标准日志实现
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> 复制代码
上述日志输出结果比较凌乱,不符合我们预期的效果,因此可以使用其他日志。
使用步骤:
1、导入 log4j 依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 复制代码
2、配置文件编写
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/msdn.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-mm-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG 复制代码
3、mybatis-config.xml
<settings> <setting name="logImpl" value="LOG4J"/> </settings> 复制代码
4、测试类
@Test public void getUserByLimit(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String,Integer> map = new HashMap<String, Integer>(); map.put("startIndex",0); map.put("pageSize",2); List<User> users = userMapper.getUserByLimit(map); for (User user : users) { System.out.println(user); } sqlSession.close(); } 复制代码
执行结果为:
MyBatis:分页的实现