====Mybatis模块
1.一级缓存和二级缓存
一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
2.如何进行结果嵌套的
必须使用resultMap 标签定义一个嵌套的查询结果
一对一
association javaType=“” 关联实体的类型 java类名
一对多
collection ofType=“” 集合中元素的类型 java类名
3.动态sql标签
动态sql标签执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。
if标签:用于根据不同的条件生成不同的SQL语句
choose、when、otherwise标签:类似于java的switch语句。
foreach标签:用于循环生成SQL语句。
include标签:用于引入其他XML文件中定义的SQL片段。
where标签:用于动态生成WHERE子句,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
set标签:用于动态生成SET子句,当在update语句中使用if标签时,如果前面的if没有执行,则会导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
4.常见的标签
insert、delete、update、select等定义sql语句的标签。
resultMap 标签,用于建立SQL查询结果字段与实体属性的映射关系信息
5.#和$的区别
#{}(占位符)
:预编译语句,防止 SQL 注入。MyBatis 会将其解析为一个占位符?
,并使用 PreparedStatement 进行参数绑定。${}
(字符串替换):直接拼接字符串,会导致 SQL 注入风险。
6.字段名和属性名不一致如何处理
一般使用驼峰命名法字段名和属性会自动匹配。
也可以使用resultMap标签灵活的进行Java对象属性和数据库表列字段进行匹配或者@Results和@Result注解.
7.mybatis和mybatisplus的区别
- MyBatis:一个持久层框架,提供了 SQL 映射和执行的功能,需要开发者编写大量的 SQL 语句和 XML 配置。
- MyBatis-Plus:在 MyBatis 的基础上进行了扩展,提供了 CRUD 接口、自动生成代码、条件构造器等功能,简化了开发工作。
====LINUX模块
常用命令:
- cd:切换目录。
cd /path/to/directory
- 复制:
cp source_file destination_file
- 剪切:
mv source_file destination_file
- 压缩:
tar -czvf archive_name.tar.gz directory_name
- 解压:
tar -xzvf archive_name.tar.gz
- 删除:
rm filename rm -r directory_name # 递归删除目录
- 查看:
ls ls -l # 详细信息
- 查看日志:
tail -f
- 编辑:
nano filename vi filename
- 查看进程:
ps aux top
- 杀死进程:
kill pid kill -9 pid # 强制终止
====Object和String模块
Object常见的方法
1.getClass():获取运行时类型,常用于反射。
2.hashCode():获取哈希值,当子类重写时通常需要同时重写hashCode()和equals()方法。
3.equals():比较方法,基本数据类型:判断值是否相同。
引用数据类型:判断地址值是否相同。
4.clone(): 实现对象的浅拷贝方法,只有实现Cloneable接口才能调用,否则抛出异常。
5.toString():输出为String
6.notify():唤醒线程,能够唤醒某个被wait()的线程。
7.notifyAll():唤醒所有线程,能够唤醒所有被wait()的线程。
8.wait():使线程等待,能够使当前线程等待该对象的锁,然后进入睡眠状态,直到被notify()或者notifyAll()方法调用。
9.finalize():垃圾回收方法,垃圾回收方法,一般不会自己调用。
String常见的方法
1.length() :获取字符串长度
2.charAt(int index) :返回下标对应的字符
3.indexOf():返回字符对应的下标值(有重复字符返回第一个)
4.subString():截取字符串,形成新的字符串。
5.split():字符串分割
6.trim():去除字符串两端空白
7.replace():字符串替换
8.compareTo()
如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
9.contains() 判断该字符串是否包含传递过来的字符串
10.isEmpty() 判断字符串是否为空
11.equals() 判断字符串内容是否相同(区分大小写)
12.startsWith()、endsWith() 判断字符串是否以传进来的字符串开头/结尾
13.toLowerCase()、toUpperCase() 将字符串转成大写字符/将字符串转为大写字符串
14.toCharArray() 将String类型的字符串转化为char字符数组
15.comcat() 字符串拼接
String能不能继承?
不能继承。String
类是用 final
修饰的,因此不能被继承。
String时final修饰的不能被改变,那为什么String s = “a”; s = s+“b”;被变了呢?
String
是不可变对象,s = s + "b"
实际上是创建了一个新的 对象,s
变量指向了这个新对象。涉及到变量参与的拼接,底层是使用的是StringBuilder。
==和equals的区别?
== 是一个运算符,用于比较两个值是否相等。它可以用于比较基本类型的值和引用类型的值。当用于基本数据类型时,比较的是值是否相同;当用于引用数据类型时,比较的是引用所指向的对象的地址是否相同。
equals 是一个方法,用于比较当前对象是否与另一个对象相等。这个方法在Object类中定义,所有Java对象都继承了这个方法。默认实现中,equals()方法通过比较对象的引用(即内存地址)来判断两个对象是否相等。但是,子类通常会重写equals()方法以提供更复杂的比较逻辑,例如比较对象的实际内容是否相同。
在运行速度方面,**** 的运行速度通常比equals()快,因为****只是简单地比较引用,而equals()可能需要执行更复杂的比较逻辑。
特别地,对于String和部分引用数据类型,equals()的比较行为被重写以比较对象的内容而不是引用地址的相等性。这是因为这些类(如String)希望提供基于内容而不是引用的等价性判断。
需要注意的是,如果自定义的类没有重写equals()方法,那么该类的equals()方法将继承自Object类,其默认行为是使用==运算符来比较引用地址的相等性。因此,在自定义类中重写equals()方法时,通常会同时重写hashCode()方法以确保满足Java的hashCode()和equals()方法的通用约定。
String、sb、sf的区别
String是不可变的,底层使用的是数组保存的是字符串常量。StringBuffer,Stringbuilder有缓冲区,底层是字符数组,每次进行拼接时不会创建新的对象会修改本身,如果考虑到线程是否安全就用stringBUff而,如果不考虑就是用StringBuilder,如果不频繁修改字符串,就用String
重写equals的时候为什么要重写hashcode
在java中 a = =b 比较的是对象的在内存中的物理地址,equals()方法的作用本来和==相同,也是比较两者的物理地址,但String类重写了equals()方法,于是String类的equals方法变成了比较两个字符串对象的字符串内容是否相等。
hashCode()方法的作用是确定对象在散列存储结构例如HashMap、HashSet中的存储地址。
如果重写了equals()方法,没有重写hashCode()方法的话,如果a.equals(b),但a的hashCode与b的hashCode不相等,则当我们将a、b同时加入散列存储结构map、set时,就可能出现数据结构中存在两个值相等的对象的情况,从而导致混淆。所以,重写equals()方法同时尽量也要重写hashcode()方法。
深拷贝和浅拷贝的区别?
1、浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。
Integer a = 130; Integer b = 130; a==b?为什么?
不会相等。Integer
对象在范围 -128 到 127 之间会被缓存,超出这个范围的 Integer
对象会创建新的实例。因此,a
和 b
指向的是不同的对象。