#{}是先编译sql语句,再拼接条件,${}是先拼接sql语句,再执行编译(会有sql注入)。
当我们传入的参数是sql语句的关键字时,比如你传的参数是asc或desc是否升降序时,我们必须要用${},因为关键字在编译的时候必须要有不然会有语法错误。
物理分页:sql分页
逻辑分页:拦截器分页、rowbounds分页
不是,因为mybatis是对jdbc的封装,jdbc驱动力有一个fetch size配置,它规定了每次从数据库中拿多少数据出来。如果想要拿更多的数据出来,它会在你执行next()的时候去查询更多的数据。
逻辑分页在速度上不一定快于物理分页;物理分页在速度上不一定快于逻辑分页。
物理分页总是优于逻辑分页,没必要将数据库端的压力拿到应用端来,就算它在速度上有优势,但是其他方面的性能足以弥补这个缺点。
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()方法。
一级缓存是基于perpetualcache的hashmap本地缓存,其存储的作用域是session,默认打开一级缓存。
二级缓存也是基于perpetualcache的hashmap缓存,但作用域为namespace。
先走二级缓存再走一级缓存最后去查数据库。
补:mybatis默认开启一级缓存,二级缓存需要在要开启缓存的mapper中加入开启.
生命周期:一级缓存是sqlsession级别的,同一个sqlsession持有相同的一级缓存;二级缓存是sqlsessionFactory级别的,凡是由sqlsessionFactoy创建的sqlsession都持有相同的二级缓存。
运行:一个查询如果在一级缓存中查询不到,会去db中查询,返回结果后存入一级缓存,下次再有相同的sql查询时直接从一级缓存中取即可,只有当sqlsession或者说一级缓存关闭的时候,一级缓存中的内容太才会进入二级缓存,下次查询时先查二级换粗再查未关闭sqlsession中的一级缓存。
注意:期间如果缓存中的数据发生了更新或者删除,那么缓存的数据会清空。
hibernate 框架没接触过,问了就说不会。
不用管,问了就说不会。
通过mybatis提供的插件接口,实现自定义插件。在拦截器的方法内拦截待执行的sql,然后重写sql语句,通过dialect方言添加相应的物理分页语句和物理分页参数。
就说知道有这么回事,但是自己不会写。
补:
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
8、mybatis的映射策略
多对一,一对多,一对一
多对一:如多个多个学生对应一个班级
谁在前面谁是主表多的一方是主表,一的一方是从表。也就是学生表是主表,班级表是从表,由于多的一方有外键,我们在设计实体类的时候将这个外键替换成外键所关联的对象类型。

当我们在mapper文件拼接处sql语句返回值类型的时候有三种方法:级联关系映射、association、分布查询
一对多:如一个班级有多个学生。班级表示主表,学生表是从表。将学生表以一个集合的形式嵌套进班级表里如list
两种处理方式:collection(这个就是处理集合的,查出来的结果自动封装进集合里)和分布查询
对多**:如一个班级有多个学生。班级表示主表,学生表是从表。将学生表以一个集合的形式嵌套进班级表里如list
两种处理方式:collection(这个就是处理集合的,查出来的结果自动封装进集合里)和分布查询
