MyBatis之日志介绍
一、日志工厂
如果在测试SQL的时候,控制台能够输出相关的 SQL信息,那么是不是排错效率就更快了?在Java程序开发过程中,我们经常使用debug模式来调节程序,跟踪代码的执行过程。但是MyBatis是基于接口、配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发、调试程序的工具。
1.1 MyBatis日志功能:
MyBatis内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:
- SLF4J
- Apache Commons Logging
- Log4j
- Log4j 2
- JDK logging
注:具体选择的日志工具由MyBatis的内置日志工厂确定。它会按上文列举的顺序查找,如果都未找到,则日志功能就会被禁用。
1.2 Log4j日志
Log4j日志是Apache的一个开源项目,通过使用Log4j,我们可以将控制日志信息输送到控制台,文本等,同时也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j日志功能使用步骤:
- 导入log4j的包:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 编写配置文件log4j.properties:
#将等级为DEBUG的日志信息输出到console和file
log4j.root Logger=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.Conversion Pattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.Max File Size=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.Pattern Layout
log4j.appender.file.layout.Conversion Pattern=[%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.Result Set=DEBUG
log4j.logger.java.sql.Prepared Statement=DEBUG
- setting设置日志实现:
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 在程序中使用Log4j输出日志:
//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);
@Test
public void selectUser() {
logger.info("info:进入select User方法");
logger.debug("debug:进入select User方法");
logger.error("error: 进入select User方法");
SqlSession session = MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
List<User> users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}
二、使用Limit实现分页
在学习MyBatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。
2.1 SQL语句实现分页功能:
#分页语法
SELECT * FROM table LIMIT stratIndex,page Size
#检索记录行 1-5
SELECT * FROM table LIMIT 0,5;
#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:(此方法已经废除)
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
#如果只给定一个参数,它表示返回最大的记录行数目:
#LIMIT n 等价于 LIMIT 0,n。
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
2.2 MyBatis实现分页步骤:
- 修改Mapper文件:
<select id="selectUser" parameterType="map" resultType="user">
select * from user limit #{startIndex},#{pageSize}
</select>
- 增加Mapper接口,参数为map:
//选择全部用户实现分页
List<User> selectUser(Map<String,Integer> map);
- 在测试类中传入参数测试:
//分页查询 , 两个参数start Index , pageSize
@Test
public void testSelectUser() {
SqlSession session =MybatisUtils.getSession();
Mapper mapper = session.getMapper(Mapper.class);
int currentPage = 1; //第几页
int pageSize = 2; //每页显示几个
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("startIndex",(currentPage-1)*pageSize);
map.put("pageSize",pageSize);
List<User> users = mapper.selectUser(map);
for (User user: users){
System.out.println(user);
}
session.close();
}
2.3 RowBounds分页
我们除了使用Limit在SQL层面实现分页,也可以使用RowBounds在Java代码层面实现分页。
RowBounds分页步骤:
- 新增Mapper接口:
//选择全部用户Row Bounds实现分页
List<User> getUserByRowBounds();
- 修改Mapper文件:
<select id="getUserByRowBounds" resultType="user">
select * from user
</select>
- 实现测试类:
//这里使用RowBounds类
@Test
public void testUserByRowBounds() {
SqlSession session = MybatisUtils.getSession();
int currentPage = 2; //第几页
int pageSize = 2; //每页显示几个
RowBounds rowBounds = new RowBounds((currentPage-
1)*page Size,page Size);
//通过session.方法进行传递rowBounds,[此种方式现在已经不推荐使用了]
List<User> users = session.select List("com.kuang.mapper.User Mapper.get User By Row Bounds",null, rowBounds);
for (User user: users){
System.out.println(user);
}
session.close();
}
2.4 分页插件PageHelper
在处理分页的时候,MyBatis并没有什么特别的方法,一般需要自己去写limit子句实现,不过有个PageHelper插件。
PageHelper插件分页步骤:
- POM依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
- MyBatis对PageHelper的配置:
<!--打开Mybatis配置文件mybatis-config.xml,一般在Resource路径下。-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="offsetAsPageNum" value="false"/>
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="supportMethodsArguments" value="false"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
- 修改Mapper文件
- 新增Mapper接口
- 分页查询测试