文章目录
1.#{} 和${}的区别
#{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入。
是
进
行
字
符
串
拼
接
,
相
当
于
s
q
l
语
句
中
的
S
t
a
t
e
m
e
n
t
,
使
用
字
符
串
去
拼
接
s
q
l
;
{} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;
是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;可以是sql中的任一部分传入到Statement中,不能防止sql注入。
使用
去
取
出
参
数
值
信
息
,
需
要
使
用
{} 去取出参数值信息,需要使用
去取出参数值信息,需要使用{value}
#{} 只是表示占位,与参数的名字无关,如果只有一个参数,会自动对应。
2.SqlSession、sqlSessionFactory、sqlSessionFactoryBuilder三者的生命周期及区别
(1)sqlSessionFactoryBuilder:
一旦将SqlSessionFctory创建出来后,其生命周期就结束。
(2)sqlSessionFactory:
一旦被创建,会在你的应用执行期间都会存在。要保证在全局范围内sqlSessionFactory只有一个
,为了保证这一点要用单例模式或静态单例模式去创建它。
(3)SqlSession:
每个线程都应该有它自己的 SqlSession 。每调用一个方法就得重新创建一个SqlSession。
它不能被共享,也是线程不安全的。
3.Mybatis的缓存
一级缓存:
基于SqlSession
, 在一个SqlSession生命周期范围内, 连续
查询相同的sql,会只发送一次语句。
原理:
a : 查询时 先看缓存中 是否有该对象 如果有直接返回,没有,则查询数据库 并且写入到缓存中
b : 两次之间 如果有 添加 删除 修改 动作并提交事务 一级缓存自动清空
二级缓存:
基于SqlSessionFactory
为什么用?
一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要
每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的。
4.mybatis多个参数,该怎么处理
(1)@Param注解传参法
public List selectStudent3(@Param(“name”) String name, @Param(“a”) int index);
(2)普通java类
public List selectStudent4(Student student);
(3)Map传参法
public List selectStudent5(Map map);
5.mybatis映射的接口里能不能写重载方法
mybatis映射的接口里 方法名称不能相同,也不能重载
因为会导致 mapper文件id冲突