Mybatis模块和Linux命令面试题

====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 对象会创建新的实例。因此,ab 指向的是不同的对象。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值