Java日志处理框架与Mybatis 的日志管理

一、Java日志处理框架

1. 常用的日志处理框架

对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,错误排查,基于 日志的业务逻辑统计分析等都离不日志。

日志的管理是系统很重要的一部分,千万不可忽略其重要性。完整的日志将会在系统维 护中起着异常重要的作用。

在 Java 领域存在多种日志框架, 目前常用的日志框架包括 Log4j , Log4j2 ,Commons Logging,Slf4j,Logback,Jul。

2. Log4j 简介

Log4j :Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java 主流的日志框架。

3. Log4j 的日志级别

Log4j 定义了 8 个 日志级别(除去 OFF 和 AL L,可以说分为 6 个级别) ,优先级从高到低依次为:OFF、 FATAL、 ERROR、 WARN、 INFO、 D EB UG、 TRACE、 ALL。

在 Log4j 中建议只使用 DEBUG、 INFO、 WARN、 ERROR 四个日志级别。

  • ALL 最低等级的,用于打开所有日志记录。

  • TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12 ,很低的日志级别,一般不会使用。

  • DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

  • INFO 消息在粗粒度级别上突出强调应用程序的运行过程。 打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的 日志。

  • WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一 些提示。

  • ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

  • FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

  • OFF 最高等级的,用于关闭所有日志记录。

4. Log4J 的使用

详细参考文档《Mybatis实战.doc》。

二、Mybatis 的日志管理

1. 引入日志jar包

如下图所示:

2. 日志配置log4j.properties

log4j.rootLogger=error,console,logfile

### appender.console输出到控制台 ###
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=<%d> %5p (%F:%L) [%t] (%c) - %m%n
log4j.appender.console.Target=System.out

### appender.logfile输出到日志文件 ###
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=SysLog.log
log4j.appender.logfile.MaxFileSize=500KB
log4j.appender.logfile.MaxBackupIndex=7
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=<%d> %p (%F:%L) [%t] %c - %m%n

3.测试LogDemo

package com.dyh.test;

import org.apache.log4j.Logger;
public class LogDemo {
    public static Logger logger = Logger.getLogger(LogDemo.class);

    public static void main(String[] args) {
        logger.fatal("fatal级别的日志信息");
        logger.error("error级别的日志信息");
        logger.warn("warn级别的日志信息");
        logger.info("info级别的日志信息");
        logger.debug("debug级别的日志信息");
        logger.trace("trace级别的日志信息");
    }
}

因为配置的日志级别是error(如下log4j.properties文件中的第一行配置)

log4j.rootLogger=error,console,logfile

所以,运行结果如下

因为配置的日志级别是info(如下log4j.properties文件中的第一行配置)

log4j.rootLogger=info,console,logfile

所以,运行结果如下

三、SqlSession 对象下的常用 API

selectOne、selectList、selectMap

使用上次的mybatis_comfig.xml、db.properties和MybatisUtil.java、Dept.java。

TestSqlSessionAPI.java

public class TestSqlSessionAPI {
    SqlSession connection;
    @Before
    public void init(){
        connection = MybatisUtil.getConnection();
    }
    @Test
    public void findOne(){
        Dept dept = connection.selectOne("com.dyh.dao.DeptMapper.findById",10);
        System.out.println(dept);
    }
    @After
    public void destroy(){
        MybatisUtil.closeConnection();
    }
}

运行报错如下:

是因为找不到映射。

connection.selectOne("com.dyh.dao.DeptMapper.findById",10);

是通过namespace+id找到Mapped Statement的。

所以,需要在主配置文件中做如下修改:

四、Mapper 动态代理模式下的多参数处理

顺序传参法

在映射文件中,SQL 语句中的参数需要使用 arg0,arg1...或者 param1,param2...表示参数的顺序。 此方法可读性低,且要求参数的顺序不能出错,在开发中不建议使用。

@Param注解传参法

在接口方法的参数列表中通过@Param 注解来定义参数名称,在 SQL 语句中通过注解中 所定义的参数名称完成参数位置的指定。

此方式在参数不多的情况还是比较直观的,推荐使用。

POJO 传参法

在 Mapper 动态代理中也可以使用 POJO 作为传递参数的载体,在 SQL 语句中绑定参数

时使用 POJO 的属性名作为参数名即可。 此方式推荐使用。

Map 传参法

在 Mapper 动态代理中也可以使用 Map 作为传递参数的载体,在 SQL 语句中绑定参数 时使用 Map 的 Key 作为参数名即可。此方法适合在传递多参数时,如果没有 POJO 能与参数 匹配,可以使用该方式传递参数。 推荐使用。

My Batis 传递 map 参数时,如果传递参数中没有对应的 key 值,在执行 sql 语句时默认取的是 null。

前三种已经在之前案例中讲过,下面仅讲解Map传参法。

1、动态代理接口DeptMapper.java

public interface DeptMapper {
    // 获取前端浏览器页面参数的时候经常会有Map结构的数据
    // 比如&userName=zs&pwd=123 或者form表单中
    // <form><input type="text" name="uname" value="zs"></form>
    List<Dept> queryByMap(Map<String, String> paramMap);
}

2、接口实现映射DeptMapper.xml

<mapper namespace="com.dyh.dao.DeptMapper">
    <!-- type属性值是实体类,id属性值,为映射的唯一标识  -->
    <resultMap type="dept" id="resultMapDept">
        <id property="deptno" column="deptno" />
        <!-- property实体类中的字段,column表示查询结果中的列名  -->
        <result property="dname" column="dname" />
        <result property="city" column="loc" />
    </resultMap>
​
    <sql id="deptColumns">
        deptno,dname,loc as city
    </sql>
    <select id="queryByMap" resultType="dept">
        select <include refid="deptColumns" /> from dept_bak where dname=#{dname} and loc=#{city}
    </select>
    <!-- 下面代码略 -->

3、测试TestDeptMapper.java

注意:测试时,Map存放的key值的名称要与上一步select id="queryByMap"中设置的参数名(dname=#{dname} and loc=#{city})一致。

map.put("dname","测试部"); map.put("city","广州");

public class TestDeptMapper {
    @Test
    public void testSelectByMap(){
        SqlSession connection = MybatisUtil.getConnection();
        DeptMapper mapper = connection.getMapper(DeptMapper.class);
        // Map<参数名称,参数值>
        Map<String,String> map = new HashMap<>();
        map.put("dname","测试部");
        map.put("city","广州");
        List<Dept> depts = mapper.queryByMap(map);
        if (depts != null && depts.size()>0){
            depts.forEach(System.out::println);
        }
    }
}

4、测试

测试如果报如下错误,原因是MapperRegistry中已经存在这个名字的注册器。

修改办法为注释掉<mapper resource=......>

运行结果如下:

总结

1、了解日志级别及配置;

2、了解SQLSession对象常用API:selectOne、selectList、selectMap

3、Mapper动态代理模式下的多参数处理。

顺序传参法、@Param注解传参法、POJO传参法、Map传参法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值