Java面试—MyBatis篇

1、Hibernate和MyBatis有什么区别?

  1. 相同点:都是对jdbc的封装,都是应用于持久层的框架
  2. 不同点:
    1. 映射关系:
      1. MyBatis是一个半自动映射的框架,Java对象和sql语句执行结果的对应关系,多表关联关系配置简单
      2. Hibernate是一个全表映射的框架,Java对象和数据库表的对应关系,多表关联关系配置复杂
    2. SQL优化和移植性:
      1. MyBatis需要手动编写SQL,支持动态SQL。。。开发工作量大些,直接使用SQL语句操作数据库,不支持数据库无关性,但Sql语句优化容易。
      2. Hibernate对SQL语句进行了封装,提供了日志、缓存、级联等,此外还提供了HQL操作数据库,数据库无关性支持好,但会消耗一些性能,开发工作量小些,但是sql语句优化困难
    3. 适用场景不同:
      1. MyBatis是半ORM框架,需要编写较多SQL,但是比较灵活,适合于需求变化频繁,快速迭代的项目
      2. Hibernate是标准的ORM框架,SQL编写量较少,但是不够灵活,比较使用于相对稳定,中小型软件项目。

2、#{}和${}是什么?它们有什么区别?

  1. #{}表示一个占位符号,相当于jdbc中的 ? 符号;#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个“”符号,如果是select * from user where id = #{user_id},传入的是11,就成了select * from user where id = "11";如果sql语句中只用一个参数,你可以id = #{namefadsf}id = #{fadgds},里面的随便写,如果是有多个参数的话,只能按照对应的Java实体写id = #{id}nane = #{name}了。
  2. ${}就像是原值传入,比如select * from user where id = ${id},传入的是11,就成了select * from user where id = 11;${}中只能乖乖的填对应的实体的属性名
  3. 区别:
#{} ${}
是占位符,预编译处理 是拼接符,字符串替换,没有预编译处理
可以防止SQL注入,提高系统安全性 不能防止SQL注入

3、Mybatis支持的关联查询?

  • association:一对一、多对一

比如说这里举一个多对一的例子,对于一个学生,就是一个学生有一堆老师教,这就是多对一

<!--思路:
    1.查询所有的学生信息
    2.根据查询出来的学生的tid,寻找对应的老师
-->
<select id="getStudent" resultMap="studentbyteacher">
    select * from student
</select>

<resultMap id="studentbyteacher" type="student">
    <!--单个的属性-->
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--复杂的属性,我们需要单独处理
        对象:association
        集合:collection  子查询
    -->
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="Teacher">
    select * from teacher where id = #{
    
    tid}
</select>
  • collection:一对多、多对多

还是上面那个例子,我们来演示一下一对多,一个老师要教好多个学生

<select id="getTeacher2" resultMap="teacherstudent2">
   select * from teacher where id = #{
    
    id}
</select>

<resultMap id="teacherstudent2" type="teacher">
   <collection property="students" column="id" javaType="ArrayList" ofType="student" select="getStudentByTeacherId">
   </collection>
</resultMap>

<select id="getStudentByTeacherId" resultType="student">
   select * from student where tid = #{
    
    id}
</select>

4、MyBatis执行的详细流程?

image.png

5、说说你对MyBatis的缓存的理解?

image.png

  1. 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为SqlSession,各个SqlSession之间的缓存相互隔离,当Session flush或 close之后,该SqlSession中的所有的Cache就会清空,MyBatis默认打开一级缓存。
  2. 二级缓存:基于PerpetualCache、HashMap存储,不同之处在于其存储作用域Mapper(NameSpace),可以在多个SqlSession之间共享,并且可以自定义存储源,默认不打开,要开启二级缓存,需要将实体给序列化了,要不然会报错

只要开启了二级缓存,在同一个Mapper就有效,所有的数据都会放在一级缓存中,只有当会话提交,或者关闭的时候,才会提交到二级缓存中。

6、模糊查询like语句应该怎么写?

       比较多种like方式,如'%${question}%'(可能引起SQL注入)、"%"#{question}"%"(解析的时候,会多加""),所以这里推荐的是使用concat函数来完成,也就是concat('%', #{qeustion}, '%')

猜你喜欢

转载自blog.csdn.net/weixin_52487106/article/details/131112473
今日推荐