mybatis 篇

sleep 和 wait 区别

wait()和sleep()的关键的区别在于,wait()是用于线程间通信的,而sleep()是用于短时间暂停当前线程。更加明显的一个区别在于,当一个线程调用wait()方法的时候,会释放它锁持有的对象的管程和锁,但是调用sleep()方法的时候,不会释放他所持有的管程。
总而言之就是一句话 wait会释放锁 但是sleep不会

悲观锁 和 乐观锁

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。(一般操作在数据库里面加个版本号的字段,只有进去的人才能修改)
线程等待时间过长消耗性能 可能会造成自旋

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(synchronized)

threadlocal 的特征和 使用场景

threadlocal是一个线程容器 每个线程都可以往此容器中存放东西,但是同时每个线程只能拿到自己存的那份东西,这样就保证了事物的唯一性

mybatis 是一个什么样的框架

MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装。 MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类 

ORM类型的半自动数据库

什么是orm 模式

ORM(Object-relational mapping),
中文翻译为对象关系映射
是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术

mybatis 中@Param注解的作用是

@Param的作用就是定义输入参数的别名,在SQL语句中可以使用参数别名。

jdbc 连接数据库并且操作数据库的过程

1)加载(注册)数据库驱动(到JVM)。

2)建立(获取)数据库连接。

3)创建(获取)数据库操作对象。

4)定义操作的SQL语句。

5)执行数据库操作。

6)获取并操作结果集。

7)关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)。

{} 和 ${} 的区别

1)#{}是预编译处理,$ {}是字符串替换
2)MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理$ { } 时,就是把${ } 替换成变量的值。 
3)使用#{} 可以有效的防止SQL注入,提高系统安全性

statement和preparestatement的区别

关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高   

什么是javaEE

Java EE平台构建于Java SE平台之上,Java EE平台提供一组API和运行环境来开发和运行大规模的,多层的,可扩展的,可靠的和安全的网络应用程序。

简单来说就是 就是一种企业规范

resulttype 和 resultmap

resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。

1)
当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性

2)
当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用

列名和成员变量名对不上有多少种解决方案

1. 通过sql语句,使用 as 起别名,就是给数据库的列名起一个别名,别名与类的成员变量名一致
2. 通过resultMap标签进行数据库列与类的成员变量的映射
3. xml 配置驼峰结构转换

进程 线程之间的关系

 进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元, 或者说进程之内独立执行的一个单元。

线程不安全的问题怎么产生的

多线程并发执行某个代码时,产生了逻辑上的错误,结果和预期值不相同

1.线程是抢占执行的。

2.有的操作不是原子的。当 cpu 执行一个线程过程时,调度器可能调走CPU,去执行另一个线程,此线程的操作可能还没有结束;(通过锁来解决)

3.多个线程尝试修改同一个变量(一对一修改、多对一读取、多对不同变量修改,是安全的)
内存可变性

4.指令重排序:java的编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,来提高程序的运行效率。

简单来说 就是多个线程区去访问同一份资源 就有可能出现线程不安全

线程的生命周期

线程的生命周期包括四个状态:创建状态、就绪状态、阻塞状态、死亡状态

一个管理系统中 怎样避免两个人用同一个用户名和密码 同时登录

加乐观锁

什么是动态sql

在mapper的xml文件中使用mybaits的自带标签进行sql的拼接 其中的参数是动态的 参数由方法出传入

什么是缓存 缓存的作用是什么 你们项目中使用到缓存的场景

缓存其实就是为了保护数据库加速网站而出现的,数据库的并发量小,但是前端可能高并发的向后端去请求,没有缓存的话就会出现数据库奔溃的情况,一般来说经常用来展示,不容易变的数据,热点数据都得用到缓存,举例来说———>门户网站

什么是mybatis的一级缓存 什么是二级缓存

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


二级缓存:
二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
二级缓存就是事务缓存 程序员一般手动给这个缓存设置时间,且设置淘汰策略,具体有时间淘汰策略和点击淘汰策略还有热度淘汰策略

mybatis 和 hibernate的区别

mybatis 是orm模型半自动sql框架 需要程序员有深厚的sql基础,对于hibernate来说移植性不行,轻量,得处理sql映射 容易掌握
hibernate 是orm模型自动sql框架 面向对象,数据库即对象 学习较难 

什么是嵌套查询

嵌套查询指的是一个查询语块可以嵌套在另外一个查询语句块的where子句或者having子句中,前者为子查询或内查询,后者为父查询或外查询

什么是懒加载 什么是及时加载

懒加载机制,就是在使用的时候才去创建。
及时加载  只在类加载的时候创建一次实例

单例和多例的区别?谁的效率高,谁安全?

单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。
所以单例效率高线程不安全
多级效率低但是线程安全(相对来说)

单例模式 饱汉式 和 饿汉式的区别?

饿汉模式 类加载时即创建实例对象
饱汉模式 延迟加载,啥时候用啥时候创建实例,存在线程安全问题
最后修改:2021 年 07 月 26 日 04 : 45 PM
如果觉得我的文章对你有用,请随意赞赏