面试常见问题之 MyBatis 部分 | Java Debug 笔记

235 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

下面将面试中常见问题进行汇总,关于 MyBatis 部分常遇见的问题如下:

1、Mybatis 中 $# 的区别?

都是可以来传递参数的,不过 # 可以方防止 sql 注入,而 $ 就是字符串拼接的方式处理,可能会有sql 注入的问题。

#{} 在预处理时,会把参数部分用一个占位符 ? 代替 ,变成了如下的 sql 语句:

select * from user where name = ?;

${} 则只是简单的字符串拼接,在动态解析阶段就直接拼接成了 最终的sql 语句:

select * from user where name = 'xcbeyond';

2、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
       select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>

第2种: 通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系。

 <select id="getOrder" parameterType="int" resultMap="orderresultmap">
     select * from orders where order_id=#{id}
 </select>
 
 <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
    <!–用id属性来映射主键字段–>
    <id property=”id” column=”order_id”>
 
    <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>
    <result property = “orderno” column =”order_no”/>
    <result property=”price” column=”order_price” />
</reslutMap>

3、MyBatis中怎么实现一个动态SQL?

Mybatis 动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。

Mybatis 提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind

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

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

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