Java知识点总结:想看的可以从这里进入
目录
5、日志5.1、搭建日志5.2、Log4j
6、注解开发
5、日志
5.1、搭建日志
在MyBatis的配置中,有settings标签,内部的属性可以配置日志,常用的日志是:LOG4J 、 STDOUT_LOGGING
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J 、LOG4J 、 LOG4J2 、 JDK_LOGGING 、COMMONS_LOGGING 、STDOUT_LOGGING、NO_LOGGING、
STDOUT_LOGGING:直接在settings里配置即可使用
LOG4J :不能直接使用,需要配置依赖
pom文件导入依赖
配置log4j.properties文件 ### 设置日志级别和输出位置 ###
log4j.rootLogger=DEBUG,console,logFile
log4j.additivity.org.apache=true
#日志输出级别
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
# 输出到控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 输出级别最低为DEBUG
log4j.appender.console.Threshold=DEBUG
# 表示所有消息都会被立即输出
log4j.appender.console.ImmediateFlush=true
#输出日志到控制台的方式
log4j.appender.console.Target= System.out
# 灵活布局输出日志
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#设定以怎样的格式显示消息。
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] -%m%n
# 日志文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] -%m%n
mybatis-config.xml配置settings
5.2、Log4j
Log4j有三个主要的组件:
Loggers(记录器):设定系统日志的类别和级别。(分别设置系统日志级别和输出级别,Log4j只输出级别不低于设定级别的日志信息)
等级(从高到低)OFF最高级别关闭所有日志记录FATAL打印将会导致应用程序退出的错误ERROR发生错误事件,但仍不影响系统的继续运行,打印错误和异常,不会输出太多的日志信息WARN警告,即潜在的错误情形INFO用于粗粒度级别上,强调应用程序的运行全程,打印感兴趣或重要信息DEBUG用于细粒度级别上,对调试应用程序有帮助,主要用于打印一些运行信息ALL最低等级,用于打开所以的日志记录log4j.rootLogger = [ 日志最低级别 ] , 指定日志信息要输出到哪里, 指定日志信息要输出到哪里, …
log4j.rootLogger=debug,console,file #最低debug,输出到控制台和文件
log4j.additivity.org.apache=true #表示Logger会不会在父Logger的appender里输出
Appenders (输出源):日志要输出的地方。可设置控制台(Console)、文件(Files)等等 org.apache.log4j.ConsoleAppender(输出到控制台)
Threshold=WARN:日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出
Target=System.err:输出日志到控制台的方式.认值是System.out。err是当错误输出为红色
org.apache.log4j.FileAppender(输出为文件)
Threshold=WARN:日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
Threshold=WARN :定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/log/log.log4j:指定当前消息输出到那个文件中。
DatePattern:多久产生一个新文件,当前月的名字为设定的名字,前面的日志文件名为:设定名.时间。
'.'yyyy-MM:每月
'.'yyyy-ww:每周
'.'yyyy-MM-dd:每天
'.'yyyy-MM-dd-a:每天两次
'.'yyyy-MM-dd-HH:每小时
'.'yyyy-MM-dd-HH-mm:每分钟
org.apache.log4j.RollingFileAppender(文件达到指定大小的时候产生一个新的文件)
Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
File=D:/log/log.log4j:指定消息输出到loglog4j文件中。
MaxFileSize=10KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动
MaxBackupIndex=2:指定可以产生的滚动文件的最大数,
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Layouts(布局):加在Appenders 之后,确定日志以何种形式输出 org.apache.log4j.HTMLLayout(以HTML表格形式布局)
LocationInfo=true:输出java文件名称和行号,默认值是false。
Title=My Logging: 默认值是Log4J Log Messages。
org.apache.log4j.PatternLayout(灵活地指定布局模式)
ConversionPattern=%m%n:设定以怎样的格式显示消息。
%p:输出日志信息的优先级
%d:输出日志时间点的日期或时间
%r:输出自应用程序启动到输出该log信息耗费的毫秒数
%t:输出产生该日志事件的线程名。
%%:输出一个"%“字符。
%L::输出代码中的行号。
%F:输出日志消息产生时所在的文件名称。
%M:输出产生日志信息的方法名。
%c:输出日志信息所属的类的全名。
%l:输出日志事件的发生位置
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
6、注解开发
很多时候后使用XML的映射文件会有一些繁琐,所以Mybatis提供了一些注解代替XML映射文件。
Mapper包的扫描:有三种方式
@Mapper注解:在Mapper接口上添加,就可以不用在XML文件中配置了 @MapperScan({“包1”,“包2”……}):用在核心配置类上,用来扫描mapper接口所在包,可以扫描多个包。不用每个接口都添加@Mapper了 在Spring的XML配置文件中通过配置 MapperScannerConfigurer 扫描
增删改查
@Insert(“SQL语句”):新增@Delete(“SQL语句”):删除@Update(“SQL语句”):更新@Select (“SQL语句”):查询 public interface UserMapper {
//根据id查询用户名
@Select("select user.username from user where user.user_id = #{id} ")
String getUserNameByI(int id);
//新增一个用户
@Insert("insert into user(username, password) values (#{username} ,#{password} )")
void insetUser(User user);
//修改
@Update("update user set username=#{username} ,password=#{password} ")
void updateUser(User user);
//删除
@Delete("delete from user where user_id = #{id} ")
void deleteUser(int id);
}
复杂关系映射:实现复杂关系映射之前我们可以在映射文件中通过配置
@Results:与@Result 一起使用,封装多个结果集,@Results({@Result(),@Result()}) @Result :结果集封装,代替了
@Result 中的属性介绍id是否是主键字段column数据库的列名property需要装配的属性名one需要使用的@One 注解(@Result(one=@One)()))many需要使用的@Many 注解(@Result(many=@many)())) @ResultMap:引用@Results 定义的封装 public interface ClassesMapper {
@Select("select * from classes where c_id=#{id} ")
@Results(id="classesMap",value = {
@Result(id = true, column = "c_id", property = "cId"),
@Result(column = "classes_name", property = "classesName"),
@Result(column = "is_deleted", property = "isDeleted")
})
Classes getClassesByID(int id);
@Select("select * from classes")
@ResultMap("classesMap")
List
}
@One:一对一结果集封装,代替了
@Select("select * from student,classes where s_id = #{id} and c_id = student.classes_id")
@Results(id="StudentMap",value = {
@Result(id=true,column = "s_id",property = "sId"),
@Result(column = "student_name",property = "studentName"),
@Result(column = "classes_id",property = "classes",
one = @One(select = "com.yu.mapper.ClassesMapper.getClassesByID")
) //映射为对象,一对多就用many=@Many(select="")
})
Student getStudentByID(int id);
}
@SelectProvider(type=xxxx.class,method=”xxxx”):反射一个自定义的类,使用类中的方法构造SQL语句。这个类可以使用方法返回SQL语句,添加SelectProvider后就能映射到自定义的类,还能用来拼接动态sql public interface StudentMapper {
@Select("select * from student,classes where s_id = #{id} and c_id = student.classes_id")
@Results(id = "StudentMap", value = {
@Result(id = true, column = "s_id", property = "sId"),
@Result(column = "student_name", property = "studentName"),
@Result(column = "classes_id", property = "classes",
one = @One(select = "com.yu.mapper.ClassesMapper.getClassesByID")
) //映射为对象
})
Student getStudentByID(int id);
//查询1班内所有学生
@SelectProvider(type = StudnetSQLProvider.class, method = "selectUser")
@ResultMap("StudentMap")
List
@SelectProvider(type = StudnetSQLProvider.class, method = "getStudentNameByID")
String getStudentNameByID(int id);
}
//SelectProvider映射的文件
public class StudnetSQLProvider {
public String selectUser(String Classesname){
//使用SQL对象动态化sql语句
String sql = new SQL() {{
SELECT("*");
FROM("classes", "student");
WHERE("classes_id=c_id");
if(!StringUtils.isEmpty(Classesname)){
WHERE("classes_name='"+Classesname+"'");
}
}}.toString();
System.out.println(sql);
return sql;
}
public String getStudentNameByID(int id){
//返回一个sql语句
return "select student_name from classes,student where classes_id=c_id and s_id = '"+id+"'";
}
}
@CacheNamespace:用于Mapper上,是用来实现二级缓存的 @Param(value=“id”):用来方法传递的参数上,解决参数名字不匹配的问题
参考阅读
发表评论