文章目录
SpringBoot
1 JPA框架
这是 SpringCore 中的一个项目,致力于简化对数据库的访问,增强了 ORM 的操作。对于JPA(Java persisten API),全称为 Java 持久化 API,是 JAVAEE 中的一套规范 API。它推出的目的是对 ORM 框架进行大统一,它提供一套接口,让厂商们(如 hibernate)对 JPA提供实现。JPA 与 hibernate 的关系就像 JDBC 与 Mysql 驱动、Oracle 驱动一样的关系,只是它更加高度抽象,可以称之为 ORM 框架的接口。
传统企业喜欢用hibernate,实现了jpa接口,互联网不喜欢用(不够灵活)
1.1 Springboot-data-jpa
- 添加依赖:
<!--spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 配置数据源application.yml
# 配置数据源
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 1234
url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=utf8
type: com.zaxxer.hikari.HikariDataSource
jpa:
database: mysql
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
- 生成pojo类
Project Structure–Modules-- +一个GPA
先连接数据库,然后生成实体类:
- dao层
public interface MemberDao extends JpaRepository<Member,Integer> {
Member findByMemberName(String memberName);
Member findByMemberNameAndMemberAge(String memberName,Integer memberAge);
List<Member> findByMemberNameLike(String memberName);
}
确实很神奇,注意属性名字不能打错了findByMemberName,错了就报错…
- 测试
@SpringBootTest
class MyfirstApplicationTests {
@Autowired
private MemberDao memberDao;
@Test
public void test02() {
Member tom = memberDao.findByMemberName("tom");
System.out.println("tom:"+tom);
Member tom1 = memberDao.findByMemberNameAndMemberAge("tom", 13);
System.out.println("tom1:"+tom1);
List<Member> tom2 = memberDao.findByMemberNameLike("tom");
System.out.println("tom2:"+tom2);
}
}
2 整合mybatis
mybatis plus
-
导入依赖:mybatis-spring-boot-starter
-
配置数据源和mybatis相关
-
dao层
启动类加入mapper自动扫描
或者在对应的mapper接口上加上@Mapper接口也行
useGeneratedKeys: 设置是否使用 JDBC 的 getGenereatedKeys 方法获取主键并赋值到 keyProperty 设置的领域模型属性中。
keyProperty:pojo 中的属性名
keyColumn:数据库中对应的字段名 -
service层
在对应的service加上事务注解:
@Transactional(rollbackFor = Exception.class)
在业务层放是因为一个业务要么成功要么全部失败 -
test测试
@Autowried
private MemberDao md;
https://blog.csdn.net/caoxuekun/article/details/76944001
3 SpringBoot定时任务
常用的定时任务
- java自带的java.util.Timer类
timer:配置麻烦,时间延后问题
timertask:不推荐 - Quartz框架(基于Timer):配置简单,XML或者注解
- SpringBoot使用注解方式开启定时任务
1)启动类里面@EnableScheduing开启定时任务,自动扫描
2)定时任务业务类,加注解@Component 被容器扫描
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000)定期执行一次
简单的定时任务,2s刷新一次:
3.1 定时任务配置
cron
cron定时任务表达式 @Scheduled(cron="*/5 * * * * *"):每隔5s执行一次,最多只能有6个 *
@Scheduled(cron=“5 * * * * *”):每分钟的第5秒
在线工具:http://tool.lu/crontab/
fixedRate
定时多久执行一次(上一次开始执行时间点后 xx 秒再次执行;)
fixedDelay
上一次执行结束时间点后 xx 秒再次执行
fixedRateString/fixedDelayString
字符串形式的配置
4 SpringBoot 异步任务
同步和异步任务区别:
同步,依次执行,
异步使用场景:
适用于处理log、发送邮件、短信等
下单接口–>查库存 100,余额校验 150,是否有优惠券等
4.1 简单异步任务
1.启动类@EnableAsync开启功能,自动扫描
2.业务类
@Component
@Async 表示异步任务(ajax默认true异步)
task02…
3.controller层使用:
说明异步任务不影响主线程的执行时间,适合日志处理,短信,报表等
4.2 带返回值的异步任务
有些业务场景需要异步任务给返回值,比如余额查询
需要增加Future< String>返回值(java.util.concurrent.Future)
5 SpringBoot整合日志
常用处理java 日志组件 slf4j,log4j,logback(官方推荐),common-logging等。
path:D:\logs
5.1 Logback
基于Log4j 基础上大量改革,不能单独使用,推荐配合日志框架SLF4J 来使用。logback 分成三个模块:logback-core, logback-classic 和 logback-access; lockback-core是其他两个模块的基础模块。
核心对象:
Logger:日志记录器
Appender:指定日志的输出的目的地,目的地可以是控制台,文件
Layout:日志布局,格式化日志信息的输出
日志级别说明:
debug < info < warn < error
Log4j配置示例:
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出 DEBUG 级别以上的日志到=D://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出 ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
5.2 整合
在resources 下面创建日志文件logback-spring.xml,官方推荐 -spring.xml 结尾,默认加载配置顺序 logback-spring.xml,logback-spring.groovy,logback.xml,or logback.groovy
配置文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>
<appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder>
<!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 路径 -->
<fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter><encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %----5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder>
<!-- 设置滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 路径 -->
<fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
<!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
且<maxHistory> 是 1,则只保存最近 1 个月的文件,删除之前的旧文件 -->
<MaxHistory>1</MaxHistory>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="consoleApp"/>
<appender-ref ref="fileInfoApp"/>
<appender-ref ref="fileErrorApp"/>
</root>
</configuration>
5.3 利用AOP进行日志记录
-
依赖:spring-boot-starter-aop
-
advice—>MyAdvice.java