MyBatis(二)-反射机制
参考文献
深入剖析 MyBatis 核心原理 – 杨四正
Reflector
Reflect是MyBatis反射模块的基础.要使用反射模块操作一个Class,都会先将Class封装成一个Reflector对象,在Reflector中缓存Class的元数据信息,这可以提高反射执行的效率.
核心初始化流程
既然是涉及反射操作,Reflector 必然要管理类的属性和方法,这些信息都记录在它的核心字段中,具体情况如下所示.
12345678910111213141516171819202122232425262728293031323334public class Reflector { private static final MethodHandle isRecordMethodHandle = getIsRecordMethodHandle(); /** * 该Reflector对应封装的Class类型 */ private final Class<?> type; /** * 可读 可写属性的名称集合 */ private ...
MyBatis(一)-基础
参考文献
mybatis是如何防止SQL注入的
聊聊MyBatis缓存机制
JDBC操作
说明 JDBC 操作的核心步骤
注册数据库驱动类,指定数据库地址,其中包括 DB 的用户名、密码及其他连接信息;
调用 DriverManager.getConnection() 方法创建 Connection 连接到数据库;
调用 Connection 的 createStatement() 或prepareStatement()方法,创建 Statement 对象,此时会指定 SQL(或是 SQL 语句模板 + SQL 参数);
通过 tatement 对象执行 SQL 语句,得到 ResultSet 对象,也就是查询结果集;
遍历 ResultSet,从结果集中读取数据,并将每一行数据库记录转换成一个 JavaBean 对象;
关闭 ResultSet 结果集、Statement 对象及数据库 Connection,从而释放这些对象占用的底层资源.
MyBatis特性
MyBatis中一个重要的功能就是可以帮助Java开发封装重复性的JDBC代码.
通过Map ...
工具-JMeter
参考文献
官方文档
JMeter必知必会系列(1) JMeter基础
JMeter测试组成
JMeter元素有以下四种类型
测试计划
线程组
组件: 包含配置元件,定时器,前置处理器,后置处理器,断言,监听器
控制器: 取样器,逻辑控制器,测试片段
测试计划
测试加护元素是JMeter测试树的根节点,是唯一的,所有的测试元素节点都位于根节点之下.
线程组
线程组控制JMeter用来执行测试的线程数。要模拟多少个用户(称之为虚拟用户)来执行测试,可以通过修改线程组的线程数来实现。
所有的取样器与逻辑控制器都必须位于线程组下,从这个角度理解,JMeter测试计划真正开始于线程组。其他元素,例如监听器,可以直接放在测试计划下,在这种情况下,它们将作用于所有的线程组。
一个测试计划下可以有多个线程组,在测试计划中可以配置以并行或顺序方式启动多个线程组。
JMeter执行顺序和作用域
执行顺序
配置元件
前置处理器
定时器
取样器
后置处理器
断言
监听器
作用域
JMeter测试树中的元素可以分为两类:层次结构与顺序结构
层次结构的元素包括:配置元件、定时器、 ...
SpringBoot-整合阿里企业邮箱
参考文献
企业云邮箱POP\SMTP\IMAP地址和端口信息
springboot 发送邮件 465端口
依赖
1234567891011121314151617181920212223<!-- <springboot.version>2.2.2.RELEASE</springboot.version>--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${springboot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
JPA-遇到的问题
参考文献
JPA自动更新问题
环境以及版本
12SpringBoot 2.2.2.RELEASEMySQL 8.0.24
示例1
描述: 不加@Transactional注解,两次查询,第一次查询修改实体的某个值
结果: 两次查询的结果一致
123456789101112@GetMapping("/test3") public void test3() { Optional<TestJpa> byId = testDAO.findById(36); if (byId.isPresent()) { TestJpa test = byId.get(); // id=36, x=0, y=71, z=53 log.info("test: {}", test); test.setX(123); } TestJpa test2 = testDAO.findById(36).get(); ...
JPA(七)-原理
参考文献
拉钩教育–Spring Data JPA原理与实战
JpaProperties 属性
1234567891011121314151617181920# 可以配置JPA的实现者的原始属性的配置,如:这里我们用的JPA的实现者是hibernate# 那么hibernate里面的一些属性设置就可以通过如下方式实现,具体properties里面有哪些,本讲会详细介绍,我们先知道这里可以设置即可spring.jpa.properties.hibernate.hbm2ddl.auto=none#hibernate的persistence.xml文件有哪些,目前已经不推荐使用#spring.jpa.mapping-resources=# 指定数据源的类型,如果不指定,Spring Boot加载Datasource的时候会根据URL的协议自己判断# 如:spring.datasource.url=jdbc:mysql://localhost:3306/test 上面可以明确知道是mysql数据源,所以这个可以不需要指定;# 应用场景,当我们通过代理的方式,可能通过datasource.u ...
JPA(四)-数据源
参考文献
拉钩教育–Spring Data JPA原理与实战
数据源
配置HikariCP
12345678910111213141516171819202122232425262728293031323334353637## 最小空闲链接数量spring.datasource.hikari.minimum-idle=5## 空闲链接存活最大时间,默认600000(10分钟)spring.datasource.hikari.idle-timeout=180000## 链接池最大链接数,默认是10spring.datasource.hikari.maximum-pool-size=10## 此属性控制从池返回的链接的默认自动提交行为,默认值:truespring.datasource.hikari.auto-commit=true## 数据源链接池的名称spring.datasource.hikari.pool-name=MyHikariCP## 此属性控制池中链接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟spring.datasource.hikari.ma ...
JPA(六)-JPA中其他功能特性
参考文献
拉钩教育–Spring Data JPA原理与实战
JPA中的乐观锁
乐观锁在实际开发过程中很常用,它没有加锁、没有阻塞,在多线程环境以及高并发的情况下 CPU 的利用率是最高的,吞吐量也是最大的。
而 Java Persistence API 协议也对乐观锁的操作做了规定:通过指定 @Version 字段对数据增加版本号控制,进而在更新的时候判断版本号是否有变化。如果没有变化就直接更新;如果有变化,就会更新失败并抛出“OptimisticLockException”异常。我们用 SQL 表示一下乐观锁的做法,代码如下:
12select uid,name,version from user where id=1;update user set name='jack', version=version+1 where id=1 and version=1
乐观锁的实现方法
JPA 协议规定,想要实现乐观锁可以通过 @Version 注解标注在某个字段上面,并且可以持久化到 DB 即可。其支持的类型有如下四种:
intorInteger ...
JPA(三)-审计功能
参考文献
拉钩教育–Spring Data JPA原理与实战
JAP审计功能
Auditing 是帮我们做审计用的,当我们操作一条记录的时候,需要知道这是谁创建的、什么时间创建的、最后修改人是谁、最后修改时间是什么时候,甚至需要修改记录……这些都是 Spring Data JPA 里面的 Auditing 支持的,它为我们提供了四个注解来完成上面说的一系列事情,如下:
@CreatedBy 是哪个用户创建的。
@CreatedDate 创建的时间。
@LastModifiedBy 最后修改实体的用户。
@LastModifiedDate 最后一次修改的时间。
具体实现步骤
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010 ...
JPA(五)-高级查询
参考文献
拉钩教育–Spring Data JPA原理与实战
QueryByExampleExecutor
QueryByExampleExecutor(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询。
QBE 的基本语法
1234567891011121314public interface QueryByExampleExecutor<T> { //根据“实体”查询条件,查找一个对象 <S extends T> S findOne(Example<S> example); //根据“实体”查询条件,查找一批对象 <S extends T> Iterable<S> findAll(Example<S> example); //根据“实体”查询条件,查找一批对象,可以指定排序参数 <S extends T> Iterable<S> findAll(Example<S&g ...