转载

Mybatis分页及日志

数据分页

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.PageInterceptorcom.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();
    }
复制代码

执行结果为:

Mybatis分页及日志

参考文献

MyBatis:分页的实现

原文  https://juejin.im/post/5e81f94651882573680f1aa7
正文到此结束
Loading...