Mybatis最全的高质量面试题和答案—3

16、Xml 映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

答: resultMap、parameterMap、sql、include、selectKey,加上动态sql 的9 个标签, 其中sql为sql 片段标签,通过include标签引入sql 片段,selectKey为不支持自增的主键生成策略标签。

17、Mybatis 的Xml 映射文件中, 不同的Xml 映射文件, id 是否可以重复?

不同的Xml 映射文件,如果配置了namespace,那么id 可以重复;如果没有配置namespace,那么id 不能重复;

原因就是namespace+id 是作为Map<String, MapperStatement>的key使用的, 如果没有namespace,就剩下id,那么, id 重复会导致数据互相覆盖。

有了namespace,自然id 就可以重复,namespace 不同,namespace+id 自然也就不同。

18、为什么说Mybatis 是半自动ORM 映射工具?它与全自动的区别在哪里?

Hibernate 属于全自动ORM 映射工具,使用Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql 来完成,所以,称之为半自动ORM 映射工具。

19、一对一、一对多的关联查询?

<mapper namespace="com.lcb.mapping.userMapper">

<!--association 一对一关联查询-->
<select id="getClass" parameterType="int"
resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and
c.c_id=#{id}
</select>

<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 实体类的字段名和数据表的字段名映射-->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>

<!--collection 一对多关联查询-->
<select id="getClass2" parameterType="int"
resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id
and c.c_id=s.class_id and c.c_id=#{id}
</select>

<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student"
ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>

</mapper>

20、MyBatis 实现一对一有几种方式?具体怎么操作的?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap 里面配置association 节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association 配置,但另外一个表的查询通过select 属性配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是 MyBatisMyBatis 是一种持久化框架,它可以帮助开发人员使用 Java 语言轻松地与关系数据库进行交互。MyBatis 的主要目标是提供与 SQL 映射的简单性和灵活性。 2. MyBatis 的优点是什么? MyBatis 具有以下优点: - 灵活性:MyBatis 允许开发人员使用 SQL 映射自定义 SQL 查询,从而提高了应用程序的灵活性。 - 易于使用:MyBatis 易于使用,因为它不需要开发人员执行任何复杂的 ORM 映射。 - 易于调试:MyBatis 可以轻松地启用日志记录,从而使开发人员更容易理解和调试其应用程序。 - 性能较好:MyBatis 的性能很好,因为它可以直接使用 SQL 查询数据库,而不需要通过 ORM 映射进行转换。 3. MyBatis 中的 Mapper 是什么? MapperMyBatis 中用于定义 SQL 映射的接口。它包含了数据访问方法的定义,以及这些方法使用的 SQL 语句。Mapper 接口可以使用注解或 XML 文件来定义 SQL 映射。 4. MyBatis 中的动态 SQL 是什么? 动态 SQL 是指根据条件动态生成 SQL 查询语句。MyBatis 中的动态 SQL 支持 if/else 条件判断、foreach 循环、choose/when/otherwise 选择语句等。 5. MyBatis 中的一级缓存和二级缓存是什么? 一级缓存是指在同一个 SqlSession 中,对于同一个查询语句,MyBatis 只查询一次,并将结果缓存起来。二级缓存是指在多个 SqlSession 中,对于同一个查询语句,MyBatis 只查询一次,并将结果缓存到多个 SqlSession 中共享。二级缓存需要在配置文件中进行配置。 6. MyBatis 中的插件是什么? 插件是 MyBatis 中的一种机制,可以在执行 SQL 语句之前或之后,对其进行拦截、修改或扩展。MyBatis 插件需要实现 Interceptor 接口,并在配置文件中进行配置。 7. MyBatis 中的 #{} 和 ${} 有什么区别? #{} 是 MyBatis 中的占位符,用于防止 SQL 注入攻击,同时也可以防止 SQL 语句中的特殊字符被转义。#{} 会将传入的参数解析为一个占位符,并将其替换为一个 ? 。 ${} 是 MyBatis 中的字符拼接符号,会将传入的参数直接拼接到 SQL 语句中。使用 ${} 可能会导致 SQL 注入攻击,因此不建议使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值