<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.RELEASE</version>
</parent>
<dependencies>
<!-- SpringBoot 整合SpringMVC -->
<!-- 我们依赖spring-boot-starter-web能够帮我整合Spring环境 原理通过Maven子父工程 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
springboot 通过引用spring-boot-starter-web依赖,整合SpingMVC框架。当你添加了相应的starter模块,就相当于添加了相应的所有必须的依赖包,包括spring-boot-starter(这是Spring Boot的核心启动器,包含了自动配置、日志和YAML);
spring-boot-starter-test(支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块);
spring-boot-starter-web (支持全栈式Web开发,包括Tomcat和spring-webmvc)等相关依赖。
@SpringBootApplication
public class Application {
//方式一
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
//方式二
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.run(args);
}
//方式三
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.run(args);
}
}
springboot有三种方式启动,都会在没有web.xml配置文件的情况,通过java代码操作整个SpringMVC的初始化过程,java代码最终会生成class文件,内置Tomcat就会加载这些class文件,当所有程序加载完成后,项目就可以访问了。
@SpringBootApplication
@EnableAutoConfiguration
@Configuration
… …
https://spring.io/guides/gs/spring-boot/
方志鹏博客
Jar规范-官网
小马哥
了解MyBatis-Plus主要流程,便于快速分析问题,有大局观,从整体来把控、分析。
mybatis-plus 是基于mybatis增强版。
了解MyBatis主要流程,便于快速分析问题,有大局观,从整体来把控、分析。
mybatis 是ORM框架,主要是基于JDBC封装、改造、优化,包括连接池
、会话
、namespae
、缓存
、映射器
、处理器
等等;我们先了解JDBC的主要执行流程:
mybatis底层还是采用原生jdbc来对数据库进行操作的,只是通过 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程
执行器:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
参数处理器: ParameterHandler (getParameterObject, setParameters)
结构处理器: ResultSetHandler (handleResultSets, handleOutputParameters)
sql查询处理器:StatementHandler (prepare, parameterize, batch, update, query)
mybatis缓存cache接口实现类如下:PerpetualCache(默认)、LruCache、FifoCache、SoftCache、WeakCache等等
一级缓存基于session,缓存是在SqlSession的executor中;
mybatis默认开启的一级缓存,不需要配置;
新增、更新、删除时,缓存失效。
一级缓存的不足:不同的会话(SqlSession),相同的查询不会走缓存,需重新查询;在多个会话下或分布式,可能会存在脏数据的情况。
为了解决一级缓存不能跨会话共享问题,范围是namespace级别,缓存可以被多个sqlSession共享。生命周期和应用同步。
二级缓存基于namespae,缓存位于CachingExecutor(Execotr装饰类)中
如何开启二级缓存?
<!-- 声明这个 namespace 使用二级缓存 -->
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"
size="1024"
eviction="LRU"
flushInterval="120000"
readOnly="false"/> <!--默认是 false(安全),改为 true 可读写时,对象必须支持序列 化 -->
<!-- 最多缓存对象个数,默认 1024 -->
<!-- LRU回收策略-->
<!-- 120000 自动刷新时间 ms,未配置时只有调用时刷新-->
什么场合适用二级缓存?
-- 以查询为主的应用,查询历史订单、消费记录等。
如何跨namespace进行缓存共享?
<cache-ref namespace="com.xx.xxMapper" />
<!--cache-ref 代表引用别的命名空间的 Cache 配置,两个命名空间的操作使用的是同 一个 Cache。-->
<!-- 在这种情况下,多个 Mapper 的操作都会引起缓存刷新,缓存的意义已经不 大了。-->
介绍项目中遇见的常见问题,便于分析及快速定位问题。
1.1 字符串非空判断 != 与 单引号与双引号
1.2 数字或字符串相等的判断 == 异常:(根据条件查询字段)
<choose>
<!-- 集团、区客:人均日拜访目标为3 -->
<when test="basePro.dataType=0">
3,
</when>
<when test="basePro.dataType=2">
3,
</when>
<!-- 大客:人均日拜访目标为2 -->
<when test="basePro.dataType=1">
2,
</when>
<otherwise>
2,
</otherwise>
</choose>
1.3 case when 查询条件
length(depart_id) > 0
<choose>
<when test="secondDeptName != null and secondDeptName='区客'">
AND (depart_name2 = #{secondDeptName} or depart_id='2317')
</when>
<otherwise>
AND depart_name2 = #{secondDeptName}
</otherwise>
</choose>