数据分页
limit实现分页
在学习 Mybatis 等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
使用Limit实现分页
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();
}
RowBounds分页
我们除了使用 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();
}
PageHelper
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内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
具体选择哪个日志实现工具由 MyBatis 的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。 如果一个都未找到,日志功能就会被禁用。
标准日志实现
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
上述日志输出结果比较凌乱,不符合我们预期的效果,因此可以使用其他日志。
Log4j
简介:
- Log4j是Apache的一个开源项目
- 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件….
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
使用步骤:
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();
}
执行结果为: