对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,错误排查,基于 日志的业务逻辑统计分析等都离不日志。
日志的管理是系统很重要的一部分,千万不可忽略其重要性。完整的日志将会在系统维 护中起着异常重要的作用。
在 Java 领域存在多种日志框架, 目前常用的日志框架包括 Log4j , Log4j2 ,Commons Logging,Slf4j,Logback,Jul。
Log4j :Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java 主流的日志框架。
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 最高等级的,用于关闭所有日志记录。
详细参考文档《Mybatis实战.doc》。
如下图所示:
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
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
所以,运行结果如下
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的。
所以,需要在主配置文件中做如下修改:
顺序传参法
在映射文件中,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传参法。
public interface DeptMapper {
// 获取前端浏览器页面参数的时候经常会有Map结构的数据
// 比如&userName=zs&pwd=123 或者form表单中
//
List queryByMap(Map paramMap);
}
deptno,dname,loc as city
注意:测试时,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 map = new HashMap<>();
map.put("dname","测试部");
map.put("city","广州");
List depts = mapper.queryByMap(map);
if (depts != null && depts.size()>0){
depts.forEach(System.out::println);
}
}
}
测试如果报如下错误,原因是MapperRegistry中已经存在这个名字的注册器。
修改办法为注释掉
运行结果如下:
1、了解日志级别及配置;
2、了解SQLSession对象常用API:selectOne、selectList、selectMap;
3、Mapper动态代理模式下的多参数处理。
顺序传参法、@Param注解传参法、POJO传参法、Map传参法。