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;
-
-
public void init(){
-
connection = MybatisUtil.getConnection();
-
}
-
-
public void findOne(){
-
Dept dept = connection.selectOne("com.dyh.dao.DeptMapper.findById",10);
-
System.out.println(dept);
-
}
-
-
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 {
-
-
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传参法。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgihahf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13