MyBatis日志操作
为方便我们后端程序猿观察我们的MyBatis所封装的SQL语句,可以使用MyBatis提供的日志处理。
下面,我们来快速搭建一个MyBatis的项目来实现日志的使用:Lets‘ get it!!!
第一步:准备数据
首先在Oracle里创建一个Student的数据库,如下所示
create table STUDENT(
id number(10) primary key,
name varchar2(30) not null,
email varchar2(30) not null,
age number(10) not null
)
在往数据库中插入几条数据
第二步:搭建项目框架并导入依赖
2.1 项目框架
在Eclipse里创建一个Java项目/Maven项目,这里为了演示就使用创建的普通的Java项目,项目目录如下所示:
2.2 项目jar包
第三步: 编写db.properties
第四步:编写mybatis核心配置文件
<?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>
<!--资源引入 -->
<properties resource="db.properties"></properties>
<!--设置信息(配置) -->
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/> -->
<setting name="logImpl" value="LOG4J" />
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
<!--设置别名 -->
<typeAliases>
<!--扫描一个包 -->
<package name="com.wei.pojo"></package>
</typeAliases>
<!--环境(可以配置多个) -->
<environments default="development">
<!--开发时的环境 -->
<environment id="development">
<!--事务管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!--数据库相关 -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!--每一个mapper需要在mybatis核心配置文件中注册 -->
<mappers>
<!-- 使用resource加载映射文件 -->
<!-- <mapper resource="com/wei/mapper/StudentMapper.xml"></mapper>
<mapper resource="com/wei/mapper/EmployeeMapper.xml"></mapper>
<mapper resource="com/wei/mapper/DeptMapper.xml"></mapper>
<mapper resource="com/wei/mapper/EmpMapper.xml"></mapper> -->
<!-- 使用package方式加载 -->
<package name="com.wei.mapper"></package>
</mappers>
</configuration>
**注意:**使用日志,需要在Setting标签里写一个name属性里注入logImpl的属性值,
其值的可填项:注意严格大小写区分!!!
- STDOUT_LOGGING:标准的日志打印输出
- log4j:采用log4j的日志框架
第五步: 编写log4j.properties🔥🔥🔥
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=INFO,console
#设置指定mapper包下的所有执行的输出的日志级别未DEBUG
log4j.logger.com.wei.mapper = DEBUG
#控制台输出的相关设置
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.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
说明:
-
log4j.rootLogger:表示是全局的日志输出级别
- FATAL: 致命的错误, 不是代码引起的, 而是系统故障;
- ERROR: 错误, 代码运行发生的错误;
- WARN: 警告, 不会影响程序运行, 但是可能存在风险;
- INFO: 普通消息;
- DEBUG: 调试信息;
- TRACE: 跟踪信息, 打印出非常详细的运行过程.
以上日志级别由高到低, 可以通过调整日志级别控制哪些日志可以被打印.
- 要求名称必须叫log4j.properties, 位置必须放在src目录下.
第六步:编写utils工具类
package com.wei.utils;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SessionUtils {
private static SqlSessionFactory factory;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSession() throws Exception {
SqlSession sqlSession = factory.openSession();
return sqlSession;
}
}
第七步:项目代码测试
7.1 POJO层
package com.wei.pojo;
public class Student {
private int id;
private String name;
private String email;
private int age;
public Student() {
}
public Student(int id, String name, String email, int age) {
super();
this.id = id;
this.name = name;
this.email = email;
this.age = age;
}
public Student(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", email=" + email + ", age=" + age + "]";
}
}
7.2 Mapper层
package com.wei.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.wei.pojo.Student;
public interface StudentMapper {
List<Student> queryAll();
int insertStudentOne(Student student);
int delStudent(@Param("id") int id);
int updateStudentOne(Student student);
int insertByBatch(List<Student> list);
int deleteByBatch(List<Integer> list);
int updateByBatch(List<Student> list);
// 分页查询
List<Student> queryByPage(Map<String, Object> pageParams);
// 条件查询
Student queryById(@Param("id") Integer id);
// 模糊查询
List<Student> queryByNameLike(@Param("name") String name);
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wei.mapper.StudentMapper">
<cache></cache>
<resultMap id="maps" type="student">
<!-- 用ID的属性来映射主键字段 -->
<id property="id" column="id" jdbcType="INTEGER" />
<!-- 用result属性来映射其他非主属性字段 -->
<result property="name" column="name" jdbcType="VARCHAR" />
<result property="email" column="email" jdbcType="VARCHAR" />
<result property="age" column="age" jdbcType="INTEGER" />
</resultMap>
<!-- 普通的查询集合 -->
<select id="queryAll" resultType="com.wei.pojo.Student">
select id ,name ,email, age
from student
</select>
<!-- 分页查询 -->
<select id="queryByPage" resultMap="maps">
select * from (
select
rowP.*,rownum rn from(
select id,name,email,age from student order by
id
) rowP where 1=1 and rownum <= #{end}
) where rn > #{start}
</select>
<!-- 条件查询 -->
<select id="queryById" parameterType="java.lang.Integer"
resultType="student">
select id ,name,email,age from student where id = #{id}
</select>
<!-- 模糊查询 -->
<select id="queryByNameLike" parameterType="string"
resultType="student">
select id ,name, email,age from student where name like
concat(concat('%',#{name}),'%')
</select>
<!-- 插入一条数据操作 -->
<insert id="insertStudentOne" parameterType="student">
insert into
student(id,name,email,age)
values(seq_stu_id.nextval,#{name},#{email},#{age})
</insert>
<!-- 修改一条数据 -->
<update id="updateStudentOne" parameterType="student">
update student
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="email!=null">
email=#{email},
</if>
<if test="age!=null">
age=#{age},
</if>
</set>
<where>
id = #{id}
</where>
</update>
<!-- 删除一条数据操作 -->
<delete id="delStudent" parameterType="int">
delete from student where
id = #{id}
</delete>
<!-- 批量插入 -->
<insert id="insertByBatch" parameterType="java.util.List">
insert into student
select SEQ_STU_ID.NEXTVAL,A.* from(
<foreach collection="list" item="item" index="index"
separator="UNION ALL">
SELECT
#{item.name},
#{item.email},
#{item.age}
from dual
</foreach>
) A
</insert>
<!-- 批量删除 -->
<delete id="deleteByBatch" parameterType="java.util.List">
delete from student
where id in
<foreach collection="list" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 批量修改 -->
<update id="updateByBatch" >
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update student
<set>
<if test="item.name != null">
NAME = #{item.name},
</if>
<if test="item.email != null">
email = #{item.email},
</if>
<if test="item.age !=null">
AGE = #{item.age},
</if>
</set>
where ID = #{item.id}
</foreach>
</update>
</mapper>
6.3 测试类
package com.wei.test;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 org.junit.Test;
import com.wei.mapper.StudentMapper;
import com.wei.pojo.Student;
import com.wei.utils.SessionUtils;
public class MyTest {
@Test
public void test() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
List<Student> list = session.getMapper(StudentMapper.class).queryAll();
for (Student student : list) {
System.out.println(student);
}
}
@Test
public void testByPage() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
Map<String, Object> map = new HashMap<String, Object>();
map.put("start", 3);
map.put("end", 6);
List<Student> list = session.getMapper(StudentMapper.class).queryByPage(map);
for (Student student : list) {
System.out.println(student);
}
}
@Test
public void testById() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
Student student = session.getMapper(StudentMapper.class).queryById(24);
System.out.println(student);
}
@Test
public void testByName() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
List<Student> students = session.getMapper(StudentMapper.class).queryByNameLike("ROSE");
for (Student student : students) {
System.out.println(student);
}
}
@Test
public void testInsertOne() throws Exception {
SqlSession session = SessionUtils.getSession();
Student student = new Student();
student.setName("ROSE");
student.setAge(23);
student.setEmail("rose@qq.com");
int row = session.getMapper(StudentMapper.class).insertStudentOne(student);
if (row > 0) {
session.commit();
System.out.println("插入成功" + row + "条数据");
} else {
session.rollback();
}
}
@Test
public void testUpdateOne() throws Exception {
SqlSession session = SessionUtils.getSession();
Student student = new Student();
student.setName("ROSE");
student.setAge(25);
student.setEmail("roseloveing@qq.com");
student.setId(43);
int row = session.getMapper(StudentMapper.class).updateStudentOne(student);
if (row > 0) {
session.commit();
System.out.println("修改成功" + row + "条数据");
} else {
session.rollback();
}
}
@Test
public void testDeleteOne() throws Exception {
SqlSession session = SessionUtils.getSession();
int row = session.getMapper(StudentMapper.class).delStudent(44);
if (row > 0) {
session.commit();
System.out.println("删除成功" + row + "条数据");
} else {
session.rollback();
}
}
@Test
public void testInsertByBatch() throws Exception {
SqlSession session = SessionUtils.getSession();
List<Student> list = new ArrayList<Student>();
list.add(new Student("JACK", "jack@qq.com", 23));
list.add(new Student("Jerry", "jerry@qq.com", 30));
list.add(new Student("keppy", "keppy@qq.com", 25));
int row = session.getMapper(StudentMapper.class).insertByBatch(list);
if (row >= list.size()) {
session.commit();
System.out.println("批量插入成功" + row + "条数据");
} else {
session.rollback();
}
}
@Test
public void testUpdateByBatch() throws Exception {
SqlSession session = SessionUtils.getSession();
List<Student> list = new ArrayList<Student>();
list.add(new Student(46, "NIKE", "nike@qq.com", 26));
list.add(new Student(47, "Prscy", "Prscy@qq.com", 20));
list.add(new Student(48, "robin", "robin@qq.com", 35));
int row = session.getMapper(StudentMapper.class).updateByBatch(list);
System.out.println(row);
session.commit();
System.out.println("批量修改成功" + row + "条数据");
}
@Test
public void testDeleteByBatch() throws Exception {
SqlSession session = SessionUtils.getSession();
List<Integer> list = new ArrayList<Integer>();
list.add(1001);
list.add(1002);
list.add(1003);
int row = session.getMapper(StudentMapper.class).deleteByBatch(list);
if (row >= list.size()) {
session.commit();
System.out.println("批量删除成功" + row + "条数据");
} else {
session.rollback();
}
}
}
输出结果(部分)
总结:
可以看出,使用Log4j的日志输出,十分的简洁,比标准的日志输出要少很多不必要的信息。可以帮助我们程序猿快速找到我们想要关注的sql以及传递的参数信息,以及最终的查询结果。