Mybatis缓存、java反射(精简秒懂版)

news2024/12/26 17:34:19

目录

一、缓存

1.mybatis一级缓存

2.mybatis二级缓存

        开启二级缓存

二、Java反射机制概念

1.Java反射概念

2.Java反射相关api

三、Java反射相关类

        1.Class类(反射基础)

        (1)Object类中的getClass方法:适用于通过对象获得Class实例的情况

        (2)类名.class方式:适用于通过类名获得Class实例的情况

        (3)Class类的静态方法 forName(String name)

2.Constructor类(获得构造方法)

3.Field类(获得属性)

4.Method类(获得方法)

四、反射优缺点


一、缓存

        数据缓存使数据离我们执行程序更近,让程序能快速获得数据。有了缓存之后,我们查询数据会先从缓存中查询,缓存没有数据再去数据库。查到后将数据放到缓存中,以便下次快速查询到数据,提高数据库性能。

1.mybatis一级缓存

        在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用一个 Mapper 方法,往往只执行一次 SQL。
        因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中。以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

这里我们以一个教师表为例,通过id查询教师信息

 

一级缓存的作用域是同一个 SqlSession。
在同一个 sqlSession 中两次执行相同的 sql 语句。
第一次执行完毕会将数据库中查询的数据写到缓存(内存)。
第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
一个sqlSession 结束后该sqlSession 中的一级缓存也就不存在了
Mybatis 默认开启一级缓存

具体流程如下图:

一级缓存生命周期:
            开始于SqlSession创建
            结束于SqlSession关闭,如果期间执行了增删改操作也会清空SqlSession对象中缓存数据。
            调用sqlSession.clearCache();强制清空一级缓存数据

2.mybatis二级缓存

        二级缓存是SqlSessionFactory级别的,可以让多个SqlSession共享数据。mybatis默认不开二级缓存,需手动配置
        开启二级缓存后,SqlSession关闭后,会将一级缓存数据传到二级缓存,这时,其他SqlSession就可以从二级缓存查数据。

二级缓存是多个 SqlSession 共享的,其作用域是同一个 namespace。
不同的sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同即最终执行相同的 sql 语句
第一次执行完毕会将数据库中查询的数据写到缓存(内存)。
第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。

注:sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区域,防止脏读

具体流程如下图: 

        开启二级缓存

        (1)在.xml配置文件中添加以下标签:value值true为开始,false为关闭

<setting name="cacheEnabled" value="true"/>

        (2)给所有使用的模型类实现序列化接口 Java.io. Serializable。

        (3)在写sql语句的Mapper映射文件中添加<cache />,表示此 mapper 开启二级缓存

<!--flushInterval二级缓存关闭时间-->
<cache flushInterval="60000"></cache>

        查询结果如下: 

二、Java反射机制概念

        在之前的文章中,我为大家介绍的java基础知识通常建立在已知类名、属性,方法等等。但在最近接触了有关框架的知识后,我们发现在实际开发中,像框架、组件,他们通常要接收任何类型的类,而且只知道传进去的类的类名。这样我们该如何动态的获取类中的信息呢?这就不得不介绍Java的反射机制了。

1.Java反射概念

        JAVA反射机制是在运行状态中,对于任意一个类,只知道类名便可获取这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。

2.Java反射相关api

Java反射相关的类主要包括
        • Class 类型
        • Constructor 构造方法
        • Method 方法
        • Field 属性
        • 除了Class外,其他类都位于java.lang.reflect包中
可见,反射API将类的类型、方法、属性都封装成了类,其中最重要的类是Class,可以说,反射的使用都是从Class开始。

三、Java反射相关类

        以下演示中Object类暂由临时创建的User类代替!!!

        1.Class类(反射基础)

一旦class文件被加载到内存,就会为其创建一个Class对象。任何类被
使用时都会创建一个Class对象。
Class类是Java反射机制的基础,通过Class类,可以得到一个类的基本
信息。

获得一个类的Class类的实例方式:

        (1)Object类中的getClass方法适用于通过对象获得Class实例的情况
//创建一个User类,通过对象user得到Class实例
User user = new User();
Class clayy = user.getClass();
        (2)类名.class方式:适用于通过类名获得Class实例的情况
Class claxx = User.class;
        (3)Class类的静态方法 forName(String name)
//classname用来接收User类路径
String classname = "com.javareflect.User";
Class clazz = Class.forName(classname);

补充:还可以通过Class类对象,创建对象

//classname用来接收User类路径
String classname = "com.javareflect.User";
Class clazz = Class.forName(classname);
Object object1 = class1.newInstance();//newInstance(Object... initargs):创建实例

        2.Constructor类(获得构造方法)

Constructor实例通过Class实例获得。

Constructor类可以通过getXXX方法获得构造方法的基本信息

Class类中定义了方法,如:

Constructor<T> getConstructor(Class... parameterTypes) :通过指定参数类型,返回构造方法实例。
newInstance(Object... initargs):创建实例
● getConstructor(Class...parameterTypes)获得指定的公共构造方法
getConstructors(Class...parameterTypes)获得所有的公共构造方法
getDeclaredConstructor(Class...parameterTypes)获得指定的构造方法(不建议)
getDeclaredConstructors(Class...parameterTypes)获得所有的构造方法(不建议)

注:一般不建议动私有方法,轻易操作私有属性,打破了封装性。

String classname = "com.javareflect.User";
//1.获得类的Class对象
Class class1 = Class.forName(classname);
//2通过类的Class对象,创建对象
Object object1 = class1.newInstance();
//获得类的构造方法,通过构造方法api中的方法创建对象
Constructor constructor = class1.getConstructor();//获得指定的公共构造方法
Object object2 = constructor.newInstance();//创建对象
//有参构造,String类型
Constructor constructor1 = class1.getConstructor(String.class,String.class);
Object object3 = constructor1.newInstance("adsd","111");
Constructor [] constructors = class1.getConstructors();//获得所有公共构造方法

class1.getDeclaredConstructor();//获得类中任意构造方法,包括私有
class1.getDeclaredConstructors();//获得类中所以构造方法,包括私有

        3.Field类(获得属性)

Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也可以对属性进行赋值.
public Field getField(String name):通过指定Field名字,返回Field实例.
●  getName:返回属性的名字
set:设置属性值
getField(String name)
获得指定的公共成员变量
getDeclaredField(String name)获得指定的成员变量,含私有
getFields()获得所有的公共成员变量
getDeclaredFields()获得所有的成员变量,含私有

注:set()方法可以给getDeclaredField获得的属性赋值,一般不建议动私有方法,轻易操作私有属性,打破了封装性。

String classname = "com.javareflect.User";
Class class1 = Class.forName(classname);
Object object1 = class1.newInstance();
//模拟从数据库查到数据,现在封装到类中
HashMap<String,String> map = new HashMap<>();
map.put("account","admin");
map.put("password","1111");
Field[] declaredFields = class1.getDeclaredFields();//依次获得类中所有成员变量
for (Field field:declaredFields){
    field.setAccessible(true);
//getName拿到类中属性的名称,map.get通过getName传进来的键get到相应的值
    field.set(object1,map.get(field.getName()));
}
    System.out.println(object1);

这里只是演示field的作用,实际开发中绝对不建议操作私有属性 !!!

        4.Method类(获得方法)

Method getMethod(String name, Class... parameterTypes) :通过指定方法名,参数类型,返回一个Method实例
getName:获得方法名字
getParameterTypes:获得方法参数类型
String classname = "com.javareflect.User";
Class class1 = Class.forName(classname);
Object object1 = class1.newInstance();
//获得类中的方法
Method method = class1.getMethod("eat");
//调用访问
method.invoke(object1);

调用了User类中的eat()方法 

 

四、反射优缺点

  优点:
        ● 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
        ● 2.提高代码的复用率,比如动态代理
        ● 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用
  缺点:
        ● 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低
        ● 2.使用反射技术通常要在一个没有安全限制的程序运行 .
        ● 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sdk监控平台

监控平台实现方案 监测网页加载时长是关注的是以下5个过程&#xff1a; 1.重定向时间&#xff1a;获取此网页前重定向所花费的时间 2.DNS域名查找时间&#xff1a;查找此网页的DNS所花费的时间 3.TCP服务器连接时间&#xff1a;用户连接到您的服务器所需的时间 4.服务器响应…

基于文心智能体平台打造的德语学习助手

德语学习助手&#xff1a;您的智能德语语言学专家 在学习德语的道路上&#xff0c;是否曾遇到过这样的困扰&#xff1a;不知道自己的德语水平如何&#xff1f;学习过程中缺乏系统的计划&#xff1f;在日常交流中总是担心表达不准确&#xff1f;或者在面对德语文本时&#xff0c…

[深度学习] 时间序列分析工具TSLiB库使用指北

TSLiB是一个为深度学习时间序列分析量身打造的开源仓库。它提供了多种深度时间序列模型的统一实现&#xff0c;方便研究人员评估现有模型或开发定制模型。TSLiB涵盖了长时预测&#xff08;Long-term forecasting&#xff09;、短时预测&#xff08;Short-term forecasting&…

【力扣】划分为k个相等的子集

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定一个整数数组 …

Learn OpenGL In Qt之系列简介

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Learn OpenGL In Qt 文章目录 传送门写在前面为什么是OpenGL和Qt能学到什么能做点什么国漫女神炫酷进度冷酷机器人 传送门 待更新 写在前面 本博客系列将带领读…

Vue——初识vue

目录 1.浏览器控制台报错 2.Vue入门 3.Vue模版语法 4.数据绑定 5.el与data的两种写法 总结 本系列属于纯干货系列&#xff0c;我们也不多说&#xff0c;直接上干货。 1.浏览器控制台报错 GET http://127.0.0.1:5500/favicon.ico 404 (Not Found) 具体如下图 这是为什么…

自己动手写CPU_step5_移动指令

移动操作指令 define EXE_MOVN 6b001011 //不等于0转移 if rt ! 0 then rs -> rd define EXE_MOVZ 6b001010 //等于0转移 if rt 0 then rs -> rd define EXE_MFHI 6b010000 // hi -> rd define EXE_MFLO 6b010010 // lo…

一步迅速了解Spring框架的几个特点

一&#xff0c;特点1&#xff1a;IOC(控制反转) 1&#xff0c;IOC是什么 反转控制”(Inverse of Control) 不是什么技术&#xff0c;而是一种设计思想&#xff0c;就是将原本在程序中手动创建对象的控制权&#xff0c;交由 Spring 框架来管理 2&#xff0c;IOC的作用 IOC 容器…

tensor core实现矩阵乘法的详细解读

之前关于tensor core的介绍可以参考链接添加链接描述 基础的tensor core实现C=AB的代码可以参考下面这段内容: 上面代码的几个注意事项: 首先是加载mma.h头文件,这个是包含wmma模板类的头文件。 其次是设置的WMMA_M=16,WMMA_N=16,WMMA_K=8,这三个参数的表示的意思是,对于…

乐凡三防:工业界的硬核产品——重新定义三防平板的极限

在工业4.0的浪潮中&#xff0c;科技与制造业的深度融合催生了一系列高性能、高耐用的智能产品。乐凡三防平板&#xff0c;作为工业界的新宠&#xff0c;正以其卓越的防护性能和强大的功能&#xff0c;重新定义了三防平板的极限&#xff0c;成为硬核科技的代表。 硬核防护&#…

Marching Cubes 算法三探

Marching Cubes 算法再探 CUDA SamplesMarchingCubesworkflowCodedata structurecomputeIsosurfacelaunch_classifyVoxelclassifyVoxel ThrustScanWrapperlaunch_compactVoxelscompactVoxels launch_generateTriangles2generateTriangles2 improvements 初探再探三探&#xff0…

翻译软件推荐:有道翻译及其他选择!

一款好的翻译软件不仅能帮助我们跨越语言障碍&#xff0c;还能提升我们的工作效率。今天&#xff0c;我将为大家深入介绍几款亲测好用的翻译工具&#xff1a;福昕在线翻译、福昕翻译客户端、海鲸AI翻译以及有道翻译。 福昕在线翻译 链接&#xff1a; https://fanyi.pdf365.cn…

write your own xx-starter【1】

在springboot 中&#xff0c;我们加入例如mybatis-spring-boot-starter&#xff0c;接着在application.yml配置数据库信息&#xff0c;就可以使用mybatis了&#xff0c;无需我们手动进行配置 这就是springboot威力&#xff0c;那么他是如何实现的呢&#xff1f;简单来说类似于…

Java面向接口编程—习题

Java面向接口编程—习题 Java面向接口编程—习题 Java面向接口编程—习题需求实现思路具体步骤1.步骤一:创建接口2.步骤2&#xff1a;创建接口的实现类3.步骤3&#xff1a;创建一个厂商4.步骤四&#xff1a;创建测试类 需求 说明采用面向接口编程思想组装一台计算机计算机的主…

【RabbitMQ工作原理相关】

RabbitMQ如何保证消息不丢失 开启生产者确认机制,确保生产者的消息能到达队列开启持久化功能,确保消息未消费前在队列中不会丢失开启消费者确认机制为auto,由spring确认消息处理成功后完成ack开启消费者失败重试机制,多次重试失败后将消息投递到异常交换机,交由人工处理 Rabb…

Linux Debian12安装Peek录屏软件,录制gif动态图

一、Peek安装 在Debian 12 (codenamed “Bookworm”) 上安装 Peek 录屏软件&#xff0c;可以通过以下步骤进行&#xff1a; 1.打开终端。 2.更新系统的包索引&#xff1a; sudo apt update3.安装 Peek 的依赖项&#xff1a; sudo apt install peek如果你遇到问题&#xff…

【大模型LLMs】文本分块Chunking调研LangChain实战

【大模型LLMs】文本分块Chunking调研&LangChain实战 Chunking策略类型1. 基于规则的文本分块2. 基于语义Embedding分块3. 基于端到端模型的分块4. 基于大模型的分块 Chunking工具使用&#xff08;LangChain&#xff09;1. 固定大小分块&#xff08;字符&token&#xff…

IC-Light还原细节的节点 DetailTransfer使用时报错-comfyui

&#x1f388;问题描述 今天在调试一个工作流节点的时候&#xff0c;遇到一个问题&#xff1a; Error occurred when executing DetailTransfer: The size of tensor a (848) must match the size of tensor b (853) at non-singleton dimension 2 File "F:\ComfyUI-aki\…

Volvo EDI 项目测试流程详解

近期知行帮助多个供应商成功对接Volvo EDI&#xff0c;这些案例中&#xff0c;供应商收到Volvo发来的EDI需求是基本一致的&#xff1a; 传输协议选择OFTP报文标准选择EDIFACT业务单据包括&#xff1a;DELFOR交付预测以及DESADV发货通知 扩展阅读&#xff1a;汽车EDI&#xff…

车规级CAN总线外围电路设计方案

目录 1、共模电感 1.1、电感值 1.2、泄漏电感 1.3、直流电阻 1.4、CMC的模式转换特性 2、终端分立电阻 3、总线电容 4、ESD保护二极管 在汽车领域&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题一直备受瞩目。相较于传统汽车&#xff0c;新能源汽车的EMC挑战更…