文章目录
- 什么是MyBatis
- MyBatis与Hibernate的区别
- MyBatis的核心组件有哪些?
- MyBatis的动态SQL有了解吗?
- MyBatis的Mapper中的常见标签有哪些?
- DAO接口中的方法可以重载吗(重点)
- 不同的映射文件xml中的id值可以重复吗?
- MyBatis中 # 和 $ 的区别是什么?(高频考点)
- Mybatis的缓存机制
- MyBatis的接口绑定以及实现方式
什么是MyBatis
Mybatis是一个半ORM(对象关系映射)集合,内部封装了JDBC,在开发时只需要关注SQL语句本身而不需要去关注驱动加载,创建连接,statement使用等,可通过原生SQL和动态SQL操作数据库
MyBatis与Hibernate的区别
- MyBatis的优点是代码开发量少,容易上手,SQL与代码分离,方便修改;缺点是SQL需要自己写
- Hibernate的优点是完全面对对象,不需要手写SQL;缺点是不能灵活使用原生SQL,SQL无法优化,学习成本较高
MyBatis的核心组件有哪些?
- SqlSessionFactoryBuilder:构建SqlSessionFactory
- SqlSessionFactory :构建SqlSession
- SqlSession:相当于Connection,获取Mapper
- Mapper : 发送SQL,返回结果
MyBatis的动态SQL有了解吗?
- if:单条件分支的判断语句
<if test="name!=null" >
and name=#{name}
</if>
- choose, when, otherwise:多条件的分支判断语句
<choose>
<when test="no!=null">
and no=#{no}
</when>
<when test="name!=null">
and name=#{name}
</when>
<otherwise>
<if test="age!=null" >
and age=#{age}
</if>
</otherwise>
</choose>
- where 标签
<where>
<if test="no!=null" >
no=#{no}
</if>
</where>
- set 标签
<set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set>
- trim 标签,格式化标签,可以替代set和where,可以设置前后缀
- prefix表示调用SQL语句时在最前面添加的前缀
- prefixOverrides表示调用SQL语句时去掉的第一个指定内容
- suffix表示调用SQL语句时在最后面添加的后缀
- suffixOverride表示调用SQL语句时去掉的最后一个指定内容
<trim prefix="set" prefixOverrides="and | or">
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null"> or age=#{age}</if>
</trim>
<trim prefix="where" prefixOverrides="and | or">
<if test="userName != null and userName != ''">
and u.userName like concat('%', #{userName}, '%')
</if>
<if test="userRole != null">
and u.userRole = #{userRole}
</if>
</trim>
- foreach:列举条件,遍历集合,实现循环语句
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
MyBatis的Mapper中的常见标签有哪些?
- 操作的标签:select、insert、update、delete本质上没什么不同,只是为了方便阅读
- 常用的标签:
- resultMap 结果集与实体映射配置
<resultMap id="getStudentRM" type="EStudnet"> <id property="id" column="ID"/> <result property="studentName" column="Name"/> <result property="studentAge" column="Age"/> </resultMap>
-
sql:抽取出的公用代码块
如sql查询时select后的条件,多表查询时组合好的结果可能多个地方用到
<sql id="query_user"> username,password </sql>
- include:使用抽取的公共sql
- 动态sql标签:trim、where、set、foreach、if、choose、when、otherwisr、bind
DAO接口中的方法可以重载吗(重点)
重载
映射
运行抛出异常,不能准确定位方法。所以不能重载
因为Mybatis是使用 全限名+方法名 的保存和寻找策略,重载后方法不唯一,无法准确找到需要的方法,抛出异常
不同的映射文件xml中的id值可以重复吗?
- 如果设置了namespace,那么每个xml都在不同namespace下,可以重复
- 如果没有设置则全局在同一个namespace下,不能重复
一般都是使用生成工具自动生成的代码,会自动添加namespace的
MyBatis中 # 和 $ 的区别是什么?(高频考点)
-
使用时会解析为一个JDBC预编译语句的参数标记符,一个#{}
被翻译成一个占位符#{}
(相当于使用prepareStatement运行预编译sql)?
-
使用时直接替换值(相当于使用Statement拼接sql)${}
- 能使用
的地方尽可能的使用#{}
,相当于预编译,可重复使用,并且能避免SQL注入#{}
-
一般可用在表名,字段名替换,如order by ${列名}语句中,直接设置排序顺序${}
Mybatis的缓存机制
-
一级缓存
基于HashMap的本地缓存,存在于同一个SqlSession对象,Session flush或者close后清空,默认为开启一级缓存
-
二级缓存
存在于SqlSessionFactory生命周期,需要手动开启。当查询频率高更新频率低时使用,因为每次更新都会刷新缓存
MyBatis的接口绑定以及实现方式
- 接口能帮到是指:把定义的接口里面的方法与SQL语句的绑定, 使得我们直接调用接口方法就可以执行sql
- 实现方式有两种
- 通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含SQL语句来绑定
- 通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。