• 备战秋招--mybatis篇


    mybatis篇

    125、mybatis中的#{}和${}有什么区别?

    #{}是先编译sql语句,再拼接条件,${}是先拼接sql语句,再执行编译(会有sql注入)。

    当我们传入的参数是sql语句的关键字时,比如你传的参数是asc或desc是否升降序时,我们必须要用${},因为关键字在编译的时候必须要有不然会有语法错误。

    126、mybatis有几种分页方式?

    物理分页:sql分页

    逻辑分页:拦截器分页、rowbounds分页

    127、RowBounds 是一次性查询全部结果吗?为什么?

    不是,因为mybatis是对jdbc的封装,jdbc驱动力有一个fetch size配置,它规定了每次从数据库中拿多少数据出来。如果想要拿更多的数据出来,它会在你执行next()的时候去查询更多的数据。

    128、mybatis逻辑分页和物理分页的区别是什么?

    逻辑分页在速度上不一定快于物理分页;物理分页在速度上不一定快于逻辑分页。

    物理分页总是优于逻辑分页,没必要将数据库端的压力拿到应用端来,就算它在速度上有优势,但是其他方面的性能足以弥补这个缺点。

    129、mybatis是否支持延迟加载?延迟加载的原理是什么?

    mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在mybatis配置文件中,可以配置是否开启延迟加载。

    它的原理是,使用cglib创建目标对象的代理类对象,当调用目标方法时,进入拦截器方法,比如调用a.getb().getName(),拦截器invoke()方法发现a.getb()的值为null,那么就会发送事先保存好的查询关联b对象的sql,把b查询出来,然后调用a.setb(b),于是a对象就有了b属性,接着完成a.getb().getName()方法。

    130、说一说mybatis的一级缓存和二级缓存?

    一级缓存是基于perpetualcache的hashmap本地缓存,其存储的作用域是session,默认打开一级缓存。

    二级缓存也是基于perpetualcache的hashmap缓存,但作用域为namespace。

    先走二级缓存再走一级缓存最后去查数据库。

    补:mybatis默认开启一级缓存,二级缓存需要在要开启缓存的mapper中加入开启.

    生命周期:一级缓存是sqlsession级别的,同一个sqlsession持有相同的一级缓存;二级缓存是sqlsessionFactory级别的,凡是由sqlsessionFactoy创建的sqlsession都持有相同的二级缓存。

    运行:一个查询如果在一级缓存中查询不到,会去db中查询,返回结果后存入一级缓存,下次再有相同的sql查询时直接从一级缓存中取即可,只有当sqlsession或者说一级缓存关闭的时候,一级缓存中的内容太才会进入二级缓存,下次查询时先查二级换粗再查未关闭sqlsession中的一级缓存。

    注意:期间如果缓存中的数据发生了更新或者删除,那么缓存的数据会清空。

    131、mybatis 和 hibernate 的区别有哪些?

    hibernate 框架没接触过,问了就说不会。

    132、mybatis 有哪些执行器(Executor)?

    不用管,问了就说不会。

    133、mybatis分页插件的实现原理是什么?

    通过mybatis提供的插件接口,实现自定义插件。在拦截器的方法内拦截待执行的sql,然后重写sql语句,通过dialect方言添加相应的物理分页语句和物理分页参数。

    134、mybatis如何编写一个自定义插件?

    就说知道有这么回事,但是自己不会写。

    补:

    1、mybatis使用集合或对象传参

    如果是一个查询语句,那么#{}中集合放key,对象放它的get方法的小写如,getName写成#{name}

    如果是一个插入语句,那么**#{}中集合放key,对象放对象的属性名**

    2、namespace的作用

    namespace+sqlId可以在sqlsession使用sql语句的时候标识一个mapper中的sql语句。

    3、mybatis拼接表名和批量删除

    拼接表名简单,只需要把表名要拼接的部分替换成#{}即可。批量删除直接#{自定义参数名}一个参数就可以接收你对应接口方法中传过来的多个参数

    4、mybatis 传long类型和data类型

    基本数据类型直接用什么传什么即可,不放心的话可以在parameterType里标明一下参数的类型

    5、mybatis执行sql的过程

    首先创建sqlsessionfactory,由sqlsessionfactory创建sqqlsession对象,由sqlsession对象去执行sql语句如sqlsession.insert(参数一,参数二…)参数一标明要执行那个mapper中的哪个sql语句,参数二写上要传入的参数可以有多个。

    亦可以通过sqlsession.getmapper方法,直接获取mapper对象,通过mapper对象调用接口中的方法即可。

    6、传多个参数#{}中怎么写?

    如果接口中有两个参数,那么mapper中sql语句的#{}写成#{param1,param2}来指定是第一个还是第二个参数;

    亦可以使用@param注解在接口中就将参数和mapper中sql语句的参数给绑定。

    7、使用Map接收返回的参数(个人认为最实用的一个)

    如果你查询出来的结果没有合适的实体类进行封装,我们可以将resultType改成Map类型,它会将返回的一条记录以key–value的形式保存进map里。如果有多个返回结果我们可以将返回类型改成list>这样返回的一条条记录就封装进了list集合的一个个map中。

    8、mybatis的映射策略

    多对一,一对多,一对一

    多对一:如多个多个学生对应一个班级

    谁在前面谁是主表多的一方是主表,一的一方是从表。也就是学生表是主表,班级表是从表,由于多的一方有外键,我们在设计实体类的时候将这个外键替换成外键所关联的对象类型。

    在这里插入图片描述

    当我们在mapper文件拼接处sql语句返回值类型的时候有三种方法:级联关系映射、association、分布查询

    一对多:如一个班级有多个学生。班级表示主表,学生表是从表。将学生表以一个集合的形式嵌套进班级表里如list

    两种处理方式:collection(这个就是处理集合的,查出来的结果自动封装进集合里)和分布查询

    对多**:如一个班级有多个学生。班级表示主表,学生表是从表。将学生表以一个集合的形式嵌套进班级表里如list

    两种处理方式:collection(这个就是处理集合的,查出来的结果自动封装进集合里)和分布查询

    在这里插入图片描述

  • 相关阅读:
    Java 中的全部锁
    学习java第七十四天
    SOLIDWORKS® 2024 新功能 - 3D CAD
    dependencyManagement和dependencies区别
    C //例 7.13 有一个3*4的矩阵,求所有元素中的最大值。
    IntelliJ IDEA 插件推荐
    wallys/QCN9074/WiFi 6 (802.11ax) 4×4 MU-MIMO 2.4GHz Single Band Wireless Module
    MySQL的group by与count(), *字段使用问题
    linux设备模型:sysfs(kobject)解析
    java计算机毕业设计ssm学生过程性评价系统(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/weixin_51930617/article/details/127092683