MyBatis必知必会

文章目录

  • 什么是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
    	<include refid="query_user"/>
    
  • 动态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必须为接口的全路径名。

你可能感兴趣的:(#,基础知识,mybatis,java,mysql,数据库)