文章目录

  • MyBatis概述
      • 啥是SqlSession及其作用?
      • Mybatis中取值方式有几种?各自区别是什么?
      • MyBatis的缓存机制?
      • 一级缓存:
      • 二级缓存:
      • MyBatis的重要标签?
  • Mybatis Plus
    • MyBatis Plus简介?
    • 使用

MyBatis概述

持久层解决方案(DAO),半自动化的ORM框架,SQL mapper.
MyBatis是一个ORM框架,底层封装了JDBC,简化对数据库的增删改查操作

啥是SqlSession及其作用?

sqlSession是mybatis框架中的一个对象,类似JDBC的Connection对象,是java程序端和数据库之间的会话
框架底层通过sqlSession对象,去执行sql语句,帮助我们实现增删改查操作

Mybatis中取值方式有几种?各自区别是什么?

Mybatis取值方式就是在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ 和 #

#{}只能绑定数据,底层采用的是?占位符赋值的方式,可以对SQL语句预编译,执行同构SQL效率高

${}可以绑定SQL语句中的任意内容,底层采用的是字符串拼接sql的方式,容易产生sql注入,如果需要一些字段名或者关键字(比如order by)需要用$

注意:排序字段若是动态字段需要用${}如:

order by ${sortField} ${sortRule}
limit #{startNo},#{pageSize}

MyBatis的缓存机制?

作用:

减少web应用和数据库(磁盘)访问次数,提高查询效率,减轻数据库访问压力。
减轻数据库压力的思路:内存中数据的获取速度大于物理磁盘,可以将数据存到缓存中。

缓存的数据结构:

Mybatis的缓存实际上就是一个HashMap,key是真正执行的sql语句,value是缓存的结果。

一级缓存:

SqlSession级别的缓存,作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个 sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存

二级缓存:

mapper级别的缓存(也称之为SqlSessionFactory级别的缓存 对应一个mapper文件),其作用域是mapper的同一个namespace,两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的 数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存,mapper文件中增加标签,实体类实现序列化
当执行了增删改操作清空当前sql所对应的namespace的缓存

自定义缓存:自己写一个类,必须实现mybatis提供的cache接口,可以自定义为redis

机制:

web应用执行sql获取数据,mybatis会先从缓存中获取,如果没有,则发送sql查询数据库,返回结果,同时将结果放入缓存中。

MyBatis的重要标签?

<Mapper>标签的Namespace,此处和DAO接口的全类名应保持一致

<Select>标签的id和DAO接口的方法名一致,resultType为查询结果的返回类型(全类名)

<resultMap>标签,当表中的列名和实体类的属性名不一致,查询的结果中属性不能被自动赋值,使用<resultMap><result>标签来映射
将查询select标签的resultType改成resultMap

<association>标签
多表连接:外键的使用,引入此表中不存在的列数据(将一个类作为另一个类中的属性(对象类属性))
在mapper中编写多表查询 以及 查询结果的映射关系
对象属性的属性和对应的列写到association标签中

条件查询 <where> <if>标签
< 这个符号在xml文件中是一个特殊符号 需要使用<![CDATA[ ]]> 特殊处理

<foreach>标签应用场景:批量删除 批量添加
collection:需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效;
Item:循环遍历元素的变量名
separator:除了最后一次都拼接一个“,”
可参考:https://wwwblogs/sgw1018/p/mybatis-foreach.html?ivk_sa=1024320u

<collection>标签 可以映射集合类属性,如list
DAO的方法参数类型是int 或者String 时
Mapper文件中使用#{}获取DAO传递过来的参数值:#{随便写}
DAO的方法参数类型是实体类对象时
Mapper文件中使用#{}获取DAO传递过来的参数值: #{实体类中的属性名}

DAO接口的方法中传递多个参数用@Param

Mybatis Plus

MyBatis Plus简介?

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。如果添加了MybatisPlus的依赖 但是不想使用MybatisPlus的类和方法 这时候仍然可以按照之前使用Mybatis的步骤做开发 几乎和之前没有任何的改变

使用

① 导入依赖,如果有注释掉之前mybatis的依赖
②如果MyBatis plus有自定义mapper文件,地址配置的由mybatis-mapper-locations改为mybatis-plus.mapper-locations
③ 给实体类加注解
@TableName(“user”) 加载类上 将该类和数据库中对应的表建立联系 注解值为表名
@TableId(value = “对应表列名”,type = IdType.AUTO) 建立主键属性和主键字段之间的联系。 value 字段名, type 定义主键自增类型 IdType.AUTO MySQL自动递增
常规属性@TableField(“name”) 将常规属性和常规字段名建立联系
连表查询 封装数据的属性 没有对应的字段 需要定义忽略
@TableField(exist = false) exist = false代表当前属性在表中没有字段名

  1. 创建实体类对应的dao接口 继承 BaseMapper 就会拥有MybatisPlus所有默认方法,需要继承BaseMapper 泛型 即当前dao对应的实体类
  2. 条件构造器,分页插件,

连表查询不使用mybatis plus

更多推荐

MyBatis、Mybatis Plus(面试常问)