一、日志工厂
如果在测试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);
二、使用Limit实现分页
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
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类
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接口
-
分页查询测试
官方文档: