文章目录
- 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代表当前属性在表中没有字段名
- 创建实体类对应的dao接口 继承 BaseMapper 就会拥有MybatisPlus所有默认方法,需要继承BaseMapper 泛型 即当前dao对应的实体类
- 条件构造器,分页插件,
连表查询不使用mybatis plus
更多推荐
MyBatis、Mybatis Plus(面试常问)
发布评论