面试题《Mybatis》

3 篇文章 0 订阅
1 篇文章 0 订阅

Mybatis

Mybatis是一个半orm(关系对象映射)框架,内部封装了jdbc,让开发人员只关注sql编写,无需考虑加载驱动,创建连接,创建statement等繁杂过程。

  • 半orm:仍需手动编写sql
  • 优点:自己编写sql,灵活度高,可以控制执行的性能;sql写在xml文件中,与代码解耦,方便统一管理;
  • 缺点:对开发人员对编写sql能力要求高;数据库移植性差(编写的sql依赖数据库);
  • 适用场景:频繁迭代的项目
  • 对比Hibernate:Hibernate完全orm框架;数据库移植性好;深入使用难;

实体名与数据库字段名不一致处理

  1. xml文件中的sql字段起别名,映射到实体属性中
  2. 实体属性加注解,映射到对应的数据库字段中
  3. 定义resultMap,将数据库字段与实体属性一一对应

#{}与${}有什么区别

#{}是预编译处理,会以?的形式作为占位符,可防止sql注入,提高系统安全性;${}是字符串替换,会替换成变量的值。

mapper接口的工作原理

mapper接口的工作原理是jdk动态代理,运行时会为mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql结果返回。接口的全限名+接口的方法名,就是namespce+id,组成了MapperStatement的key,这样就可以查找到对应的sql。所以同mapper下的id值需不同。(mapper接口中的方法不能重载)

mybatis是如何将结果封装成对象并返回的?

通过resultMap或者起别名的方式,定义好数据库字段名与实体属性名的映射关系后,mybatis通过反射机制创建对象并赋值,将结果返回。无映射关系的属性是无法赋值的。

一级缓存与二级缓存概念

一级缓存是基于SqlSession的缓存,当使用delete/update/insert时,会清除缓存,不同的SqlSession之间是不能够相互读取额度。与spring整合,在service上加事务,每次调用完毕,都会将SqlSession进行关闭(关闭将会清除缓存),所以一级缓存失效(默认开启)

二级缓存是基于mapper的缓存,是跨SqlSession的缓存,同一个mapper会共享缓存,当使用delete/update/insert时,会清除缓存。二级缓存配置方式:mybatis.xml文件中需要开启二级缓存,然后在需要使用二级缓存的mapper.xml文件中,加入<cache />标签,最后对应的实体需实现序列化接口。由于设计到增删改时,会清除mapper缓存,导致一种情况。比如:已缓存了10个对象的信息,其中一个更改,导致清除了所有信息(对细粒度的数据缓存实现不好),缓存失效。对于这种情况,在service内在加入redis缓存。还面临着一种情况,比如:获取订单信息,而订单信息是由两部分信息组成,基本信息和详细信息,分两表进行存储。在首次获取时,在订单mapper上加入了缓存,当详细信息更改时,并没有清除基本信息缓存,导致读取到了历史数据(脏数据)。对于这种联合查询到问题,我们在对应的查询配置中,将对应的二级缓存取消,useCache=false;(对实时性要求不高的数据可以使用二级缓存)

可以对单个查询的二级缓存,设置禁用或刷新缓存;可以设置刷新时间;

缓存存储的数据结构都是HashMap,缓存清楚即是清除HashMap数据结构

延迟加载

Mybatis支持延迟加载,需要用到数据时才进行加载,不需要时就不进行加载。好处是,先从单表查询,需要时在从关联表进行关联查询

具体实现:https://blog.csdn.net/qq_22172133/article/details/81513730

mybatis分页插件的原理?

在拦截方法内拦截待执行的sql,然后重写sql,添加对应的分页语句。

 

如何传递多个参数?

1、通过#{0},#{1}。#{index},index作为参数的下标,从0开始计算。例如:public void list(String name, String age);

第一个参数name为#{0},第二个参数age为#{1}

2、通过参数别名@Param。例如:public void list(@param("name") String my_name, @param("age") String age);

3、通过参数封装为map(也可封装为对象,对象也是map结构)

常见标签有哪些?

基本标签:<select>/<insert>/<update>/<delete>

动态标签(可完成逻辑判断,动态生成sql):<if>/<where>/<when>/<chose>/<foreach>/<trim>

片段标签(可复用):<sql>,通过<include>引入

<resultMap>/<parameterMap>

主键生成策略标签:<selectKey>,对不支持生成自增主键的主键生成策略

一对一映射:<resultMap>下的<association>

一对多映射:<resultMap>下的<collection>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值