• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
暖锋丫
帮助1

一、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

  1.  
    log4j.rootLogger=error,console,logfile
  2.  
     
  3.  
    ### appender.console输出到控制台 ###
  4.  
    log4j.appender.console=org.apache.log4j.ConsoleAppender
  5.  
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
  6.  
    log4j.appender.console.layout.ConversionPattern=<%d> %5p (%F:%L) [%t] (%c) - %m%n
  7.  
    log4j.appender.console.Target=System.out
  8.  
     
  9.  
    ### appender.logfile输出到日志文件 ###
  10.  
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender
  11.  
    log4j.appender.logfile.File=SysLog.log
  12.  
    log4j.appender.logfile.MaxFileSize=500KB
  13.  
    log4j.appender.logfile.MaxBackupIndex=7
  14.  
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  15.  
    log4j.appender.logfile.layout.ConversionPattern=<%d> %p (%F:%L) [%t] %c - %m%n

3.测试LogDemo

  1.  
    package com.dyh.test;
  2.  
     
  3.  
    import org.apache.log4j.Logger;
  4.  
    public class LogDemo {
  5.  
    public static Logger logger = Logger.getLogger(LogDemo.class);
  6.  
     
  7.  
    public static void main(String[] args) {
  8.  
    logger.fatal("fatal级别的日志信息");
  9.  
    logger.error("error级别的日志信息");
  10.  
    logger.warn("warn级别的日志信息");
  11.  
    logger.info("info级别的日志信息");
  12.  
    logger.debug("debug级别的日志信息");
  13.  
    logger.trace("trace级别的日志信息");
  14.  
    }
  15.  
    }

因为配置的日志级别是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

  1.  
    public class TestSqlSessionAPI {
  2.  
       SqlSession connection;
  3.  
       @Before
  4.  
       public void init(){
  5.  
           connection = MybatisUtil.getConnection();
  6.  
      }
  7.  
       @Test
  8.  
       public void findOne(){
  9.  
           Dept dept = connection.selectOne("com.dyh.dao.DeptMapper.findById",10);
  10.  
           System.out.println(dept);
  11.  
      }
  12.  
       @After
  13.  
       public void destroy(){
  14.  
           MybatisUtil.closeConnection();
  15.  
      }
  16.  
    }

运行报错如下:

学新通

是因为找不到映射。

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

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

2、接口实现映射DeptMapper.xml

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

3、测试TestDeptMapper.java

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

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

  1.  
    public class TestDeptMapper {
  2.  
       @Test
  3.  
       public void testSelectByMap(){
  4.  
           SqlSession connection = MybatisUtil.getConnection();
  5.  
           DeptMapper mapper = connection.getMapper(DeptMapper.class);
  6.  
           // Map<参数名称,参数值>
  7.  
           Map<String,String> map = new HashMap<>();
  8.  
           map.put("dname","测试部");
  9.  
           map.put("city","广州");
  10.  
           List<Dept> depts = mapper.queryByMap(map);
  11.  
           if (depts != null && depts.size()>0){
  12.  
               depts.forEach(System.out::println);
  13.  
          }
  14.  
      }
  15.  
    }

4、测试

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

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

学新通

运行结果如下:

学新通

总结

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

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

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgihahf
系列文章
更多 icon
同类精品
更多 icon
继续加载