Mybatis基础学习之日志工厂的简单使用

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。

这个Mybatis基础学习系列是用来记录我学习Mybatis框架基础知识的全过程 (这个系列是参照B站狂神的Mybatis最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)


之后我将尽量以两天一更的速度更新这个系列,还没有学习Mybatis3框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧!加油吧!少年们!

特别提醒:如果对Mybatis基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇Mybatis基础学习之初识Mybatis
第二篇Mybatis基础学习之第一个Mybatis程序
第三篇Mybatis基础学习之CRUD增删改查
第四篇Mybatis基础学习之万能的Map和模糊查询
第五篇Mybatis基础学习之配置解析(上篇)
第六篇Mybatis基础学习之配置解析(下篇)
第七篇Mybatis基础学习之使用ResultMap解决字段名不一致


今天我们来到了Mybatis基础学习的第七站:日志工厂的简单使用。废话不多说,让我们开始今天的学习内容吧。

7.日志工厂的简单使用

如果一个数据库操作,出现了异常,我们需要排错,而日志就是最好的助手!

曾经sout、debug现在日志工厂

7.1 简单了解日志工厂

logImpl日志工厂

作用指定MyBatis所用日志的具体实现,未指定时将自动查找

有效值SLF4J |LOG4J |LOG4J2 |JDK_LOGGING |COMMONS_LOGGING |STDOUT_LOGGING |NO_LOGGING

默认值未设置

  • SLF4J
  • LOG4J【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 【掌握】
  • NO_LOGGING

总之,在MyBatis具体使用哪一个日志实现,在设置中设定即可

7.2 使用STDOUT_LOGGING日志输出

STDOUT_LOGGING标准日志输出

7.2.1 设置日志输出

1.编写Mybatis的核心配置文件

1-1 编写 db.properties 配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
pwd=123456
1-2 编写 mybatis-config.xml 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration: 核心配置文件 -->
<configuration>
    
    <!-- 引入外部配置文件(优先使用外部配置文件) -->
    <properties resource="db.properties"/>
    
    <!-- 设置日志输出 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
    <!-- 通过给包起别名 -->
    <typeAliases>
        <package name="com.kuang.pojo"/>
    </typeAliases>  
    
    <!-- 设置默认环境为开发环境 -->
    <environments default="development">
        <!-- 设置一道环境为开发环境 -->
        <environment id="development">
            <!-- transactionManager: 表示事务管理器 (MyBatis的默认管理器是JDBC) -->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源, 主要作用: 连接数据库 (注意: MyBatis的默认数据源类型是POOLED,也就是有池的连接) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
</configuration>

2.编写User实体类和MybatisUtils工具类

2-1 编写User实体类
package com.kuang.pojo;

// User用户实体类
public class User {

    private int id; // 编号
    private String name; // 用户名
    private String password; // 密码

    // User实体类的无参构造方法
    public User() {
    }

    // User实体类的有参构造方法
    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    /**
     * 生成对应的get和set方法
     */
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // toString方法
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
    
}
2-2 编写MybatisUtils工具类
package com.kuang.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * Mybatis工具类
 * SqlSessionFactoryBuilder (建造工厂)
 * --> sqlSessionFactory (生产sqlSession)
 * --> sqlSession
 */
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    // 静态方法体
    static {
        try {
            // 读取配置文件
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 获取工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SqlSession提供了在数据库执行SQL命令所需的所有方法
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

}

3.编写UserMapper接口和UserMapper.xml映射文件

3-1 编写UserMapper接口
package com.kuang.dao;

import com.kuang.pojo.User;
import org.apache.ibatis.annotations.Param;

// UserMapper接口
public interface UserMapper {

    /**
     * 根据Id查询用户
     * 使用@Param注解, 用来定义参数的别名
     */
    public User getUserById(@Param("uid") int id);

}
3-2 编写UserMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.UserMapper">

    <!-- 结果集映射: 其中id对应select标签中的resultMap,type对应Java实体类(由于在mybatis的核心配置文件中, 我们使用给包起别名的方式, 因此这里的User使用使用小写即可) -->
    <resultMap id="UserMap" type="user">
        <!-- column: 对应数据库中的字段, property: 对应Java实体类中的属性
             注意: 只需要显式定义不一致的字段和属性即可(即id和name字段可以不用再次定义) -->
        <!--        <result column="id" property="id"/>
                <result column="name" property="name"/>-->
        <result column="pwd" property="password"/>
    </resultMap>

    <!-- 查询语句: 通过Id查询指定用户信息 -->
    <select id="getUserById" parameterType="int" resultMap="UserMap">
        <!-- 这里的#{}中的值要使用@Param注解中设置的值(即uid) -->
        select * from mybatis.user where id = #{uid}
    </select>

</mapper>

4. 编写UserMapperTest测试类和查看测试结果

4-1 编写UserMapperTest测试
package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class UserMapperTest {

    @Test
    public void test() {
        //获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //使用getMapper方法来获取接口对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用getUserById方法,查询所有用户
        User user = userMapper.getUserById(1);
        System.out.println(user);
        
        //关闭sqlSession
        sqlSession.close();
    }

}
4-2 查看测试结果

在这里插入图片描述

结果成功的输出了日志信息,查询到1号用户“周杰伦”的具体信息

想必刚开始看到这个日志信息时,很多小伙伴还是比较疑惑的,那么这里我们就来简单分析一下日志输出的内容!

5. 简单解析日志内容

在这里插入图片描述

日志核心步骤

  • 打开JDBC连接
  • 创建Connection连接
  • 设置自动提交,默认值false
  • 预编译SQL
  • 查询参数
  • 查询的列
  • 查询的记录
  • 记录总数
  • 结果
  • 结果集自动设置
  • 关闭JDBC连接
  • 返回connection的值到连接池

简单了解了日志输入后,我们来看一下两种导致日志输出失效的使用场景,很多刚接触Mybatis的小伙伴可能会遇到这些错误

7.2.2 模拟name值错误测试

1.修改 mybatis-config.xml 配置文件

  • 为了模拟name值错误的使用场景,这里我们把settings标签中的name值首字母大写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration: 核心配置文件 -->
<configuration>
    
    <!-- 引入外部配置文件:优先使用外部配置文件 -->
    <properties resource="db.properties"/>
    
    <!-- 设置日志输出 (这里故意将settings标签中的name的值首字母大写来模拟错误场景) -->
    <settings>
        <setting name="LogImpl" value="STDOUT_LOGGING "/>
    </settings>
    
    <!-- 通过给包起别名 -->
    <typeAliases>
        <package name="com.kuang.pojo"/>
    </typeAliases>  
    
    <!-- 设置默认环境为开发环境 -->
    <environments default="development">
        <!-- 设置一道环境为开发环境 -->
        <environment id="development">
            <!-- transactionManager: 表示事务管理器 (MyBatis的默认管理器是JDBC) -->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源, 主要作用: 连接数据库 (注意: MyBatis的默认数据源类型是POOLED,也就是有池的连接) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
</configuration>

2. 查看测试结果

在这里插入图片描述

结果出现了“设置 LogImpl未知” 的错误!

3.结果分析

分析

根据报错提示,我们可以将错误定位到setting标签中name的值LogImpl上,很明显是由于我们将原本首字母小写"loglmpl"写成了"LogImpl"而造成的!

7.2.3 模拟value值错误测试

1.修改 mybatis-config.xml 配置文件

  • 为了模拟value值错误的使用场景,这里我们把settings标签中的value的值后面加空格
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration: 核心配置文件 -->
<configuration>
    
    <!-- 引入外部配置文件:优先使用外部配置文件 -->
    <properties resource="db.properties"></properties>
    
    <!-- 设置日志输出 (这里故意将settings标签中的value的值后面加空格来模拟错误场景) -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING "/>
    </settings>
    
    <!-- 通过给包起别名 -->
    <typeAliases>
        <package name="com.kuang.pojo"/>
    </typeAliases>  
    
    <!-- 设置默认环境为开发环境 -->
    <environments default="development">
        <!-- 设置一道环境为开发环境 -->
        <environment id="development">
            <!-- transactionManager: 表示事务管理器 (MyBatis的默认管理器是JDBC) -->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源, 主要作用: 连接数据库 (注意: MyBatis的默认数据源类型是POOLED,也就是有池的连接) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
</configuration>

2 查看测试结果

在这里插入图片描述

结果出现了“不能找到STDOUT_LOGGING类”的错误!

3.结果分析

分析

根据报错提示,我们可以将错误定位到mybatis核心配置文件中,setting标签中value的值STDOUT_LOGGING上,很明显是由于我们将"STDOUT_LOGGING"后面不小心加了空格,写成了"STDOUT_LOGGING "而造成的!

4.使用总结

总结

因此,在使用STDOUT_LOGGING日志输出的时候,要尽量避免以上两种低级错误!

7.3 使用Log4j日志输出

提示

如果想了解有关Log4j配置的详细内容,可以跳转到log4j配置详解去查看!

7.3.1 什么是Log4j?

  • Log4jApache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地控制台文件GUI组件,甚至是套接口服务器NT的事件记录器UNIX Syslog守护进程
  • 可以控制每一条日志的输出格式
  • 定义每一条日志信息的级别,能够更加细致地控制日志的生成过程
  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

7.3.2 Log4j的简单使用

1. 导入Log4j的资源依赖

  • 在项目的pom.xml配置文件中导入log4j的资源依赖
<dependencies>
    <!-- 引入log4j的资源依赖-->
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

2.编写log4j.properties配置文件

  • resources目录下创建并编写log4j.properties配置文件
# 将等级为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=[%c]-%m%n

# 文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.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.设置log4j标准日志输出

  • mybatis-config.xml配置文件中设置标准日志输出
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration: 核心配置文件 -->
<configuration>
    
    <!-- 引入外部配置文件(优先使用外部配置文件) -->
    <properties resource="db.properties"></properties>
    
    <!-- 设置使用LOG4J作为标准日志输出 -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    
    <!-- 通过给包起别名 -->
    <typeAliases>
        <package name="com.kuang.pojo"/>
    </typeAliases>  
    
    <!-- 设置默认环境为开发环境 -->
    <environments default="development">
        <!-- 设置一道环境为开发环境 -->
        <environment id="development">
            <!-- transactionManager: 表示事务管理器 (MyBatis的默认管理器是JDBC) -->
            <transactionManager type="JDBC"/>
            <!-- dataSource: 表示数据源, 主要作用: 连接数据库 (注意: MyBatis的默认数据源类型是POOLED,也就是有池的连接) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"/>
    </mappers>
    
</configuration>

4.查看测试结果

  • 再次运行UserMapperTest测试类中的test方法,查看控制台输出的日志信息

在这里插入图片描述

结果成功输出日志信息,可以看到查询到1号用户“周杰伦”的具体信息!

7.3.3 Logger的简单使用

1.导入Logger的jar包

  • 在要使用Log4j的类中导入log4j.Logger的jar包
import org.apache.log4j.Logger; // 注意: 要导入log4j.Logger

2.定义日志对象

  • UseMapperTest测试类中定义日志对象,参数为当前类的class
// 定义属性: UserMapperTest是当前类
static Logger logger = Logger.getLogger(UserMapperTest.class);

3.设置日志级别

  • UseMapperTest测试类中创建testLog4j方法,分别设置infodebugerror三个日志级别
@Test
public void testLog4j(){
    /** 
     * 设置日志的级别
     */
    // 日志输出info信息:等价于sout
    logger.info("测试,进入getUserById方法成功!");
    // 日志输出debug信息
    logger.info("info:进入了testLog4j");
    logger.debug("debug:进入了testLog4j");
    // 日志输出error信息
    logger.error("error:进入了testLog4j");
}

4. 查看log文件

  • 自动生成log文件

在这里插入图片描述

  • 查看日志文件信息

在这里插入图片描述


好了,今天的有关 日志工厂的简单使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!


参考视频链接【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论

打赏作者

狂奔の蜗牛rz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值