Logback的特点
1,重启的实现2,非常充分的测试3,文档充分4,自动重新加载配置等
开发步骤
1,/资源目录下新建logback-spring.xml 2,布局配置的规则logback-spring.xml 3,/资源目录下新建application.yml(application.properties)4,配置项目环境和日志记录(Dev [开发]测试[测试]专业[项目])
Logback的常规配置
1,配置:root根目录-appender:负责写日志的组件(0–多个)-logger:使用设置某一个类的日志打印等级(0–多个)-root:是根logger(只能有一个)2,等级从低到高分别是跟踪<调试<信息<警告<错误<fatal如果设置的是调试的话,跟踪将不会被打印3,在application.yml里面配置文件打印的地址。
logback.spring.xml的终版配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<property name="log.path" value="E:\IDEA\log\demolog" />-->
<springProperty scope="context" name="log.path" source="logging.path" defaultValue="/home/logs/bms"/>
<contextName>logback</contextName>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<!--RollingFileAppender的作用是滚动记录文件,先将日志记录到指定文件,当符合某个条件时再将日志记录到其他文件-->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<!--
日志输出格式:
%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,%n是换行符
-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<!-- <rollingPolicy>的作用是当发生滚动时,定义RollingFileAppender的行为,其中TimeBasedRollingPolicy是最常用的滚动策略,它根据时间指定滚动策略,既负责滚动也负责触发滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<!-- <onMatch>:用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
-->
<!--<logger name="org.springframework.web" level="info"/>-->
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<!-- 多环境配置管理 -->
<!--开发环境:打印控制台-->
<springProfile name="dev">
<root level="info">
<!--<logger name="com.nmys.view" level="debug"/>-->
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<!--线上环境:-->
<springProfile name="prod">
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<!--测试环境:-->
<springProfile name="test">
<root level="info">
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
</configuration>
Spring数据
Spring Data是什么?
1,主要做的是对mybatis其中一个,进行对数据库的访问和操作,并进行持久化存储和访问![在这里插入图片描述](https://img-blog.csdnimg.cn/20200125155141738。PNG ?X-OSS-过程=图像/水印,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hvbmd3ZWlzb25nNjj70,size_16,color_FFFFFF,t_
Spring Data的子项目
此时1所示,弹簧数据JDBC 2,弹簧数据JPA等等
Mybatis
Mybatis数据操作的步骤
1,JDBC(Java数据库连接,简称JDBC)的操作流程五个步骤:编写SQL->预编译->设置参数->执行SQL->封装结果
2,JPA操作流程JavaBean->(在JDBC的总之前封装)-> DB只需要操作JavaBean就可以操作DB
Ⅰ、MyBatis是支持定制化SQL、存储过程以及高级映射的持久层框架
Ⅱ、Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。
Mybatis功能结构
1、接口层:提供API,增删改查等接口
2、数据处理层:完成对数据库的操作
3、数据支撑层:连接管理、事务管理、配置加载等
Mybatis架构结构
1、配置configuration,去读取mappler.xml等映射,有两种读取方式,分别是 mapper.Annotations 和SqlMap.xml来读取
实际项目中:Ⅰ、比较简单的用mapper.annotations Ⅱ、数据操作比较复杂的使用SqlMap.xml
2、在Mapper.Statement里面会有一个SqlID,左边的sql输入映射的参数,传入后通过Mapper.Statement会有输出的映射结果,如HashMap等
3、首先的话,完成Sql的编写(一是采用Mapper.annotations的方式来编写,二是采用SqlMap.xml的方式来编写)
;其次的话,要定义输入参数的类型(HashMap,Pojo,String,Integer等基本类型)
;最后的话,定义输出的类型(HashMap,Pojo,String,Integer等基本类型)
草图如下:
Springboot整合Mybatis
1、引入所需要的启动器(MySql和mybatis)
2、配置数据源(数据源要访问到MySql的数据库 )
3、配置Mybatis(配置javaBean,要映射到数据表;配置Mapper,用来定义Sql的一些行为)
4、编写实体类 根据User类,主要和第三部分的javaBean有关;
5、编写mapper映射接口:主要和第三部分的Mapper有关;
6、编写测试代码(通过junit来测试)
编写:
1、在com.hws.demo目录下面新建一个model文件,用来存放javaBean等代码,可以建立一个BaseEntity类,用来存放所有的表中一些通用的字段,一些其它的就可以继承它,减少代码量,像ID,createTime和updateTime都是必须的字段,就放在BaseEntity里面就可以了,然后在前面写上 @Data (在lombok里面的,减少了getter和setter的使用)
@Data
public abstract class BaseEntity<ID extends Serializable> implements Serializable {
private static final long serialVersionUID = 8925514045582235838L;
private ID id;
private Date createTime = new Date();
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime = new Date();
}
2、编写实体类(model),具体数据库表里面的信息字段,以sys_user表为例
使用 @EqualsAndHashCode(callSuper = true) 此注解会生成equals(Object other) 和 hashCode()方法
@Data
@EqualsAndHashCode(callSuper = true)
public class SysUser extends BaseEntity<Long> {
private static final long serialVersionUID = -6525908145032868837L;
private String username;
private String password;
private String nickname;
private String headImgUrl;
private String phone;
private String telephone;
private String email;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
private Integer sex;
private Integer status;
public interface Status {
int DISABLE = 0;
int VALID = 1;
int LOCKED = 2;
}
3、编写dao(里面放入mapper)
@Mapper
public interface UserDao {
@Select("select * from sys_user t where t.username = #{username}")
SysUser getUser(String username);
}
4、在编写测试代码的时候,用@Resource 引入,若用 @Autowired方式引入的话,会有错误
yml的小问题
这里又要着重记一下了,解决yml前面没有绿色的小叶子的问题,1、首先的话,先去plugin里面把yaml的插件下载下来,我是下载了这两个
2、去file types下面在yaml里面添加.yml,至此才算最终完成
3、这里再插播一个yml的坑,它NN的,格式不能错,然后空格之类的都不能错,一错就连不上数据库了,终于,经过了修改yml配置文件里面的信息,终于能够成功连接上我自己阿里云上面的数据库了,开心~~,附yml格式代码
spring:
profiles:
active: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://(阿里云分配的外网地址):12345/hws_quanxian?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username: root
password: aliyun123456
platform: mysql
mybatis:
type-aliases-package: com.hws.demo.model
mapper-locations: classpath:/mybatis-mappers/*
configuration:
mapUnderscoreToCamelCase: true
logging:
path: E:\IDEA\log\demolog
这里附上一个Springboot集成Mybatis的链接,方法是这个上面找到的,我的错误也是这个(空格和Tab的错误,格式不规范,哎):Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded
https://blog.csdn.net/nuomizhende45/article/details/84678976