• MyBatis配置日志和使用注解


    Java知识点总结:想看的可以从这里进入

    5、日志


    5.1、搭建日志

    在MyBatis的配置中,有settings标签,内部的属性可以配置日志,常用的日志是:LOG4J 、 STDOUT_LOGGING

    logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J 、LOG4J 、 LOG4J2 、 JDK_LOGGING 、COMMONS_LOGGING 、STDOUT_LOGGING、NO_LOGGING、
    • STDOUT_LOGGING:直接在settings里配置即可使用

      <settings>
         <setting name="logImpl" value="STDOUT_LOGGING"/>
      settings>
      
      • 1
      • 2
      • 3
    • LOG4J :不能直接使用,需要配置依赖

      • pom文件导入依赖

        
        <dependency>
            <groupId>log4jgroupId>
            <artifactId>log4jartifactId>
            <version>1.2.17version>
        dependency>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
      • 配置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
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
      • mybatis-config.xml配置settings

        <settings>
              <setting name="logImpl" value="LOG4J"/>
        settings> 
        
        • 1
        • 2
        • 3

    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里输出
      
      • 1
      • 2
      • 3
    • 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(将日志信息以流格式发送到任意指定的地方)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
    • 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(包含日志产生的时间、线程、类别等信息)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    6、注解开发


    很多时候后使用XML的映射文件会有一些繁琐,所以Mybatis提供了一些注解代替XML映射文件。

    • Mapper包的扫描:有三种方式

      • @Mapper注解:在Mapper接口上添加,就可以不用在XML文件中配置了

      • @MapperScan({“包1”,“包2”……}):用在核心配置类上,用来扫描mapper接口所在包,可以扫描多个包。不用每个接口都添加@Mapper了

      • 在Spring的XML配置文件中通过配置 MapperScannerConfigurer 扫描

        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            
            <property name="basePackage" value="com.yu.mapper"/>
        bean>
        
        • 1
        • 2
        • 3
        • 4
        • 5
    • 增删改查

      • @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);
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    • 复杂关系映射:实现复杂关系映射之前我们可以在映射文件中通过配置来实现,在使用注解开发时我们需要借助@Results 注解,@Result 注解,@One 注解,@Many 注解。

      • @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<Classes> getClassesAll();
        
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
      • @One:一对一结果集封装,代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。@Result(column=" “,property=”“,one=@One(select=”"))

      • @Many:一对多结果集封装,代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。@Result(property=“”,column=“”,many=@Many(select=“”))

        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")
                    )   //映射为对象,一对多就用many=@Many(select="")
            })
            Student getStudentByID(int id);
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
    • @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<Student> selectUser(String Classesname);
      
          @SelectProvider(type = StudnetSQLProvider.class, method = "getStudentNameByID")
          String getStudentNameByID(int id);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      //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+"'";
          }
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    • @CacheNamespace:用于Mapper上,是用来实现二级缓存的

    • @Param(value=“id”):用来方法传递的参数上,解决参数名字不匹配的问题

  • 相关阅读:
    Cookie与Session详解
    【无标题】
    JWFD开源工作流-矩阵引擎设计-高维向量空间分析法
    位移运算法的解释与hashMap的应用。
    基于java+ssm的理论课_考勤,作业,签到管理系统
    Kotlin协程-那些理不清乱不明的关系
    【无标题】
    SAP 智能机器人流程自动化(iRPA)解决方案分享
    ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例
    pytest 测试框架
  • 原文地址:https://blog.csdn.net/yuandfeng/article/details/126921980