MyBatis - 系统化整理 (二, 完结, 2020年4月14日)

7 日志

如果数据库操作出现异常需要排错, 日志是最好的助手!

7.1 日志工厂

官网列出的 ‘logImpl’ (日志实现), 无默认值, 具体选择哪一个在 settings 中设置:

  • SLF4J
  • LOG4J [掌握]
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING (标准日志输出) [掌握]
  • NO_LOGGING

那么, 要如何使用呢?

7.2 STDOUT_LOGGING

测试一下吧:

  1. 在mybatis-config.xml 中设置, 无需任何其他设置:

    <!--设置-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
  2. 运行test输出结果:

    D:\Software\jdk1.8.0_71\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=56252:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\plugins\junit\lib\junit5-rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\plugins\junit\lib\junit-rt.jar;D:\Software\jdk1.8.0_71\jre\lib\charsets.jar;D:\Software\jdk1.8.0_71\jre\lib\deploy.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\access-bridge-64.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\cldrdata.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\dnsns.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\jaccess.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\jfxrt.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\localedata.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\nashorn.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunec.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunjce_provider.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunmscapi.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunpkcs11.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\zipfs.jar;D:\Software\jdk1.8.0_71\jre\lib\javaws.jar;D:\Software\jdk1.8.0_71\jre\lib\jce.jar;D:\Software\jdk1.8.0_71\jre\lib\jfr.jar;D:\Software\jdk1.8.0_71\jre\lib\jfxswt.jar;D:\Software\jdk1.8.0_71\jre\lib\jsse.jar;D:\Software\jdk1.8.0_71\jre\lib\management-agent.jar;D:\Software\jdk1.8.0_71\jre\lib\plugin.jar;D:\Software\jdk1.8.0_71\jre\lib\resources.jar;D:\Software\jdk1.8.0_71\jre\lib\rt.jar;D:\Software-idea\Project-QinJiang\com.zhangcl\mybatis-03\target\test-classes;D:\Software-idea\Project-QinJiang\com.zhangcl\mybatis-03\target\classes;D:\Software-idea\MavenRepository\repo-3.6.1\org\mybatis\mybatis\3.5.4\mybatis-3.5.4.jar;D:\Software-idea\MavenRepository\repo-3.6.1\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar;D:\Software-idea\MavenRepository\repo-3.6.1\junit\junit\4.12\junit-4.12.jar;D:\Software-idea\MavenRepository\repo-3.6.1\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.zhangcl.test.UserDaoTest,getUserById
    Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
    Class not found: org.jboss.vfs.VFS
    JBoss 6 VFS API is not available in this environment.
    Class not found: org.jboss.vfs.VirtualFile
    VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
    Using VFS adapter org.apache.ibatis.io.DefaultVFS
    Find JAR URL: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    Not a JAR: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    Reader entry: User.class
    Listing file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    Find JAR URL: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo/User.class
    Not a JAR: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo/User.class
    Reader entry: ����   1 <
    Checking to see if class com.zhangcl.pojo.User matches criteria [is assignable to Object]
    PooledDataSource forcefully closed/removed all connections.
    PooledDataSource forcefully closed/removed all connections.
    PooledDataSource forcefully closed/removed all connections.
    PooledDataSource forcefully closed/removed all connections.
    Opening JDBC Connection
    Sat Apr 11 09:49:23 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Created connection 128359175.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7a69b07]
    ==>  Preparing: select * from mybatis.user where id = ?; 
    ==> Parameters: 2(Integer)
    <==    Columns: id, name, pwd
    <==        Row: 2, 张三, 123456
    <==      Total: 1
    User{id=2, name='张三', password='123456'}
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7a69b07]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7a69b07]
    Returned connection 128359175 to pool.
    
    Process finished with exit code 0
    

7.3 LOG4J

什么是LOG4J

  • Apache的开源项目, 可以通过它控制日志信息输出目的地: 控制台、文件、GUI组建

  • 可以精确控制每一条日志信息的输出格式

  • 可以精确控制每一条日志信息的输出级别

  • 可以通过配置文件来设置它们, 而不必要修改代码

测试一下吧:

  1. 导入Maven依赖

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
  2. 在 MyBatis 核心配置文件, 也就是mybatis-config.xml 中配置使用log4j.

    要注意顺序性或顺序性报错的提示

    <!--设置-->
    <settings>
        <!--选择一个日志Impl: 标准日志输出-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <!--选择另一个日志Impl: log4j日志输出-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    
  3. 在 resource 目录下新建LOG4J的配置文件, log4j.properties

    #将等级为DEBUG的日志信息输出到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=[%c]-%m%n
    
    #文件输出的相关配置
    log4j.appender.file=org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=./log/zhangcl.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
    
  4. 单元测试, 输出结果:

    D:\Software\jdk1.8.0_71\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar=61217:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\lib\idea_rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\plugins\junit\lib\junit5-rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2\plugins\junit\lib\junit-rt.jar;D:\Software\jdk1.8.0_71\jre\lib\charsets.jar;D:\Software\jdk1.8.0_71\jre\lib\deploy.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\access-bridge-64.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\cldrdata.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\dnsns.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\jaccess.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\jfxrt.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\localedata.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\nashorn.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunec.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunjce_provider.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunmscapi.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\sunpkcs11.jar;D:\Software\jdk1.8.0_71\jre\lib\ext\zipfs.jar;D:\Software\jdk1.8.0_71\jre\lib\javaws.jar;D:\Software\jdk1.8.0_71\jre\lib\jce.jar;D:\Software\jdk1.8.0_71\jre\lib\jfr.jar;D:\Software\jdk1.8.0_71\jre\lib\jfxswt.jar;D:\Software\jdk1.8.0_71\jre\lib\jsse.jar;D:\Software\jdk1.8.0_71\jre\lib\management-agent.jar;D:\Software\jdk1.8.0_71\jre\lib\plugin.jar;D:\Software\jdk1.8.0_71\jre\lib\resources.jar;D:\Software\jdk1.8.0_71\jre\lib\rt.jar;D:\Software-idea\Project-QinJiang\com.zhangcl\mybatis-03\target\test-classes;D:\Software-idea\Project-QinJiang\com.zhangcl\mybatis-03\target\classes;D:\Software-idea\MavenRepository\repo-3.6.1\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\Software-idea\MavenRepository\repo-3.6.1\org\mybatis\mybatis\3.5.4\mybatis-3.5.4.jar;D:\Software-idea\MavenRepository\repo-3.6.1\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar;D:\Software-idea\MavenRepository\repo-3.6.1\junit\junit\4.12\junit-4.12.jar;D:\Software-idea\MavenRepository\repo-3.6.1\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.zhangcl.test.UserDaoTest,getUserById
    [org.apache.ibatis.logging.LogFactory]-Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
    [org.apache.ibatis.logging.LogFactory]-Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
    [org.apache.ibatis.io.VFS]-Class not found: org.jboss.vfs.VFS
    [org.apache.ibatis.io.JBoss6VFS]-JBoss 6 VFS API is not available in this environment.
    [org.apache.ibatis.io.VFS]-Class not found: org.jboss.vfs.VirtualFile
    [org.apache.ibatis.io.VFS]-VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
    [org.apache.ibatis.io.VFS]-Using VFS adapter org.apache.ibatis.io.DefaultVFS
    [org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    [org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    [org.apache.ibatis.io.DefaultVFS]-Reader entry: User.class
    [org.apache.ibatis.io.DefaultVFS]-Listing file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo
    [org.apache.ibatis.io.DefaultVFS]-Find JAR URL: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo/User.class
    [org.apache.ibatis.io.DefaultVFS]-Not a JAR: file:/D:/Software-idea/Project-QinJiang/com.zhangcl/mybatis-03/target/classes/com/zhangcl/pojo/User.class
    [org.apache.ibatis.io.DefaultVFS]-Reader entry: ����   1 <
    [org.apache.ibatis.io.ResolverUtil]-Checking to see if class com.zhangcl.pojo.User matches criteria [is assignable to Object]
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-PooledDataSource forcefully closed/removed all connections.
    [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Opening JDBC Connection
    Sat Apr 11 12:50:59 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-Created connection 1484171695.
    [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5876a9af]
    [com.zhangcl.dao.UserMapper.getUserById]-==>  Preparing: select * from mybatis.user where id = ?; 
    [com.zhangcl.dao.UserMapper.getUserById]-==> Parameters: 2(Integer)
    [com.zhangcl.dao.UserMapper.getUserById]-<==      Total: 1
    User{id=2, name='张三', password='123456'}
    [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5876a9af]
    [org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@5876a9af]
    [org.apache.ibatis.datasource.pooled.PooledDataSource]-Returned connection 1484171695 to pool.
    
    Process finished with exit code 0
    
    

**简单使用, 需要注意: **

  1. 导包: 注意不是 java.util 的, 而是 org.apache.Logger 的.

  2. 声明Logger对象. 考虑对象作用域问题, 可以把声明语句提升到类成员级别

    static Logger logger = Logger.getLogger(UserDaoTest.class);
    
  3. 日志的级别, 常用三种级别:

    logger.info("info: 进入了testLog4j()");
    logger.debug("debug: 进入了testLog4j()");
    logger.error("error: 进入了testLog4j()");
    /*
    在日志file中输出效果如下: 
    
    [INFO][20-04-11[com.zhangcl.test.UserDaoTest]info: 进入了testLog4j()
    [DEBUG][20-04-11[com.zhangcl.test.UserDaoTest]debug: 进入了testLog4j()
    [ERROR][20-04-11[com.zhangcl.test.UserDaoTest]error: 进入了testLog4j()
    */
    

8 分页

为什么要分页?

  • 可减少多余的数据处理量

8.1 通过 limit 分页

是SQL层面的分页, 以下是基本语法:

#[syntax] select * from user limit startIndex, pageSize;
select * from user limit 0, 3;
select * from user limit 3;	#两者等效 

使用 MyBatis 测试一下:

  1. 接口: UserMapper.java

    /*查 User 分页*/
    List<User> getUserWithLimit(Map<String, Integer> map);
    
  2. 映射文件: UserMapper.xml. 这里使用了万能Map, 可以注意一下.

    <!--查 User 分页-->
    <select id="getUserWithLimit" resultType="User" parameterType="map">
        SELECT * FROM user LIMIT #{startIndex}, #{pageSize};
    </select>
    
  3. 单元测试: UserMapperTest.java

    /*查 User Limit*/
    @Test
    public void getUserWithLimit(){
         
        Map<String, Integer> map = new HashMap<String
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值