前言:
小伙伴们,大家好,我是狂奔の蜗牛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?
- Log4j是Apache的一个开源项目,通过使用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方法,分别设置info、debug、error三个日志级别
@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文件:
- 查看日志文件信息:
好了,今天的有关 日志工厂的简单使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!