Mybatis学习-日志与分页
日志
为什么需要日志
如果一个数据库操作出现了异常,需要排错,那么日志就是最好的助手
Mybatis通过使用内置的日志工厂提供日志功能,有一下几种实现方式:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j(官方推荐)
- JDK Logging
Mybatis会按照上面的顺序使用第一个查找到的实现
有不少的应用服务器的类路径下已经包含了Commons Logging,这种情况下,Mybatis会将优先级高的Commons Logging作为日志实现,其他的日志配置将会被忽略。如果想使用其他日志实现,需要在Mmybatis-config.xml中添加以下配置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
value的值可以是以下任意一个

在所有的日志实现中,我们需要掌握LOG4J和STDOUT_LOGGING(标准日志输出)
<settings>
<!--标准的日志工厂的实现-->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
Log4J
可以控制日志信息输送的目的地是控制台、文件、GUI组件
也可以控制每一条日志的输出格式,自定义日志输出
通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程
通过一个配置文件来灵活地进行配置,不需要修改应用的代码
使用方式:
- 导入Log4J包
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 在mybatis-config.xml中配置log4j日志的实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 添加接口代码
package org.luoqing.dao;
public interface TeacherMapper {
@Select("SELECT * FROM teacher WHERE id = #{id}")
Blog selectTeacher(int id);
}
- 在resource目录中添加log4j.properties
### 将等级为DEBUG的日志信息输出到console和file两个目的地 ###
log4j.rootLogger = DEBUG,console,file
### 打印Mapper的日志(以下配置对于注解和XML配置文件都可) ###
log4j.logger.org.luoqing.dao.TeacherMapper=TRACE
### 或者也可以打印包中所有的Mapper的日志
log4j.logger.org.luoqing.dao=TRACE
### 甚至可以打印Mapper中特定语句的日志
log4j.logger.org.luoqing.dao.TeacherMapper.selectTeacher=TRACE
### 输出到控制台 ###
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 = [%c]-%m%n
### 输出到日志文件 ###
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/log.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
- 测试
测试代码此处省略
自定义输出语句
- 在要使用log4j的类中导入包
import org.apache.log4j.Logger;
- 日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserMapperTest.class);
- 日志级别
@Test
public void logTest() {
logger.info("info:进入了logTest");
logger.debug("debug:进入了logTest");
logger.error("error:进入了logTest");
}
分页
为什么要分页
为了减少数据的处理量
使用limit分页
语法:select * from tableName limit startIndex, pageSize
select * from user limit 0,3 # 从第0条记录开始,每页显示3个
使用Mybatis实现
- 接口
public interface UserMapper {
// 分页实现
List<User> getUserByLimit(Map<String, Integer> map);
}
- Mapper.xml
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from learn.user limit #{startIndex}, #{pageSize}
</select>
- 测试
@Test
public void limitTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex", 0);
map.put("pageSize", 2);
List<User> userByLimit = mapper.getUserByLimit(map);
for (User user : userByLimit) {
System.out.println(user);
}
sqlSession.close();
}
使用RowBounds分页
不再使用SQL实现分页
- 接口
public interface UserMapper {
// RowBounds分页
List<User> getUserByRowBounds();
}
- Mapper.xml
<select id="getUserByRowBounds" resultMap="UserMap">
select * from learn.user
</select>
- 测试
@Test
public void getUserByRowBoundsTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(0, 2);
List<User> userList = sqlSession.selectList("com.luoqing.dao.UserMapper.getUserByRowBounds", null, rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
分页插件-PageHelper
- 添加依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
- 在mybatis-config.xml中配置插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql"/>
<!--
默认是false
设置为true,会将RowBounds第一个参数offset当成pageNum使用
-->
<property name="offsetAsPageNum" value="true"/>
<!--
默认是false
设置为true时,使用RowBounds分页会进行count查询
-->
<property name="rowBoundWithCoun" value="true"/>
<!--
默认是false
设置为true,如果pageSize=0或者RowBounds.limit=0就会查询出所有的结果
相当于没有执行分页查询,返回结果仍是Page类型
-->
<property name="pageSizeZero" value="true"/>
<!--
分页合理化参数,默认是false
设置为true,pageNum<=0时会查询第一页,pageNum>pages(超过总数时)会查询最后一页
-->
<property name="reasonable" value="true"/>
<!--
为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从Map或ServletRequest中根据属性名取值
-->
<property name="params" value="pageNum=start;pageSize=limit;"/>
<!--
默认是false
支持通过Mapper接口参数来传递分页参数
会从查询方法的参数值中,自动根据上面params配置的字段中取值,查找到合适的值时就会自动分页
-->
<property name="supportMethodsArgument" value="true"/>
</plugin>
</plugins>
- 测试
数据库准备

需要创建对应的POJO、DAO接口、Mapper.xml,此处省略
以下为测试代码
@Test
public void test1() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//方式一:
PageHelper.startPage(1,5);
List<Student> all = mapper.findAll();
for (Student student : all) {
System.out.println(student);
}
//方式二:
Page page = PageHelper.startPage(1,5);
mapper.findAll();
for (Object o : page) {
System.out.println(o);
}
sqlSession.close();
}

Mybatis学习-日志与分页的更多相关文章
- mybatis学习日志之总结
一.介绍mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- Mybatis学习--日志
学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/logging.html Logging Mybatis内置的日志工厂提供日志功能,具 ...
- mybatis学习日志二
一.动态sql语句 if语句 if+where语句 if+set语句 choose(when,otherwise)语句 trim语句 sql片段 foreach语句 总结 bean部分的User类代码 ...
- MyBatis学习总结_17_Mybatis分页插件PageHelper
如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ...
- mybatis学习——日志工厂
为什么要使用日志工厂? 我们想一下,我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?答案是肯定的,如果一个 数据库相关的操作出现了问题,我们就可以根据输出的S ...
- mybatis学习日志一
Mybatis 介绍 MyBatis 是支持 普通 SQL 查询 , 存储过程 和 高级映射 的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以 及对结果集的检索封装 ...
- MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...
- Mybatis学习--XML映射配置文件
学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/configuration.html MyBatis 的配置文件包含了影响 MyBat ...
随机推荐
- 为什么说线程太多,cpu切换线程会浪费很多时间?
问题1: 假如有一个计算任务,计算1-100的和,每10个数相加,需要占用一个cpu时间片(1s).如果起一个线程(模拟没有线程切换),完成任务需要多长时间?如果起5个线程,完成任务需要消耗多久时间? ...
- LTMU论文解析
LTMU 第零部分:前景提要 一般来说,单目标跟踪任务可以从以下三个角度解读: A matching/correspondence problem.把其视为前后两帧物体匹配的任务(而不考虑在跟踪过程中 ...
- BUUCTF 不一样的flag writeup
感谢BUUCTF提供的学习平台 https://buuoj.cn 题目:不一样的flag 工具:x64dbg 这是一道内存的迷宫题,迷宫是402000处的字符串 根据经验,这应该(a行*b列)的字符, ...
- 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码
Tcp消息传输主要参照surging来做的,做了部分裁剪和改动,详细参见:https://github.com/dotnetcore/surging Json-rpc没有定义消息如何传输,因此,Jso ...
- 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式
Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...
- .NET 5 ORM 八大实用技巧 干货 - SqlSugar ORM
介绍 sqlsugar已经在第一时间完美兼容.NET5并且已经有人在使用了, 很多人都担心用了开源框架遇到问题无法解决,导致前功尽弃,使用SqlSugar你大可放心,除了有详细文档和几年的大量用户积累 ...
- Camtasia中对录制视频进行编辑——行为
小视频的逐渐兴起,让我们的生活变得多姿多彩,同时,也造就了一批新媒体的创业者还有越来越多的网红,这不禁使我们也想加入他们的行列.但是问题来了,拍摄视频后最重要的是对视频进行剪辑,没有一款经济适用的软件 ...
- EasyRecovery扫描预览功能,助你选择需要的数据恢复
说到数据恢复,很多人都会选择EasyRecovery,EasyRecovery作为一个功能性还不错的数据恢复软件,能够帮你恢复丢失的数据以及重建文件系统. 在数据恢复的同时,EasyRecovery还 ...
- FLstudio 系列教程(六):如何安装FL studio
FL Studio简称FL,全称:Fruity Loops Studio,因此国人习惯叫它"水果".目前版本是FL Studio20,它让你的计算机就像是全功能的录音室,大混音盘, ...
- PHP 递归删除目录中文件
/** * 递归删除目录中文件 * @param $pathname * @return bool */public static function delDir($pathname)//要删除的目录 ...