Mybatis 学习笔记

Mybatis特性:1.Mybatis是支持定制化SQL存储过程以及高级映射的优秀持久层框架2.Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集3.Mybatis可以使用简单的XML注解用于配置和原始映射,将接口的Java的POJO(普通Java对象)映射成数据库的记录4、Mybatis是一个半自动的ORM(对象关系映射,将实体类对象映射到数据库,通过操作实体类对象完成对数据库的操作)框架。

JDBC:

Sql夹杂在Java代码中耦合度高,导致硬编码内伤

维护不易且实际开发需求中SQL有变化,频繁修改的情况多见

代码冗长,开发效率低

Hibernate和JPA:

操作简单,开发效率高

程序中的长难复杂SQL需要绕过框架

内部自动生产的SQL,不需要做特殊优化

基于全映射的全自动框架,大量字段的POJO进行部分映射比较困难

反射操作太多,导致数据库性能下降

Mybatis:

轻量级,性能出色

SQL和Java编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据

开发效率稍逊于Hibernate,但是完全可以接受。

ORM:对象关系映射,对象:Java实体类对象,关系:关系型数据库 映射:二者之间的对应关系。

Mybatis面向接口编程的两个一致:1、映射文件的namespace要和Mapper接口中的全类名保持一致 2、映射文件中的SQL语句的id要和Mapper接口中的方法名一致

日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUGA(调试)从左到右打印的内容越来越详细

查询功能的标签必须设置resultType或者resultMap

resultType:设置默认的映射关系,字段名对应属性名

resultMap:设置自定义的映射关系。

以包为单位引入映射文件要求:1、Mapper接口所在的包要和映射文件所在的包一致2、Mapper接口要和映射文件的名字一致

Mybatis获取参数值的各种情况:1、Mapper接口方法的参数为单个字面量类型,可以通过${}本质是字符串拼接,#{}本质是占位符赋值,以任意的名称获取参数值,但是使用${}需要加单引号。2、若参数为多个,Mybatis会将这些参数放在一个map集合中,以两种方式进行存储。以arg0,arg1...为键,param1,param2...

为键通过${},#{}来获取参数值。3、自定义map集合放入参数可以以自定义键名来获取值 4、Mapper接口方法参数是实体类类型,通过属性名来获取参数值。5、使用@Param(“id”),会以两种方法以@Param注解的值为键来获取或者param1,param2...来获取。

接口方法上添加@MapKey(“键”)注解,此时就可以将每条数据转换的map集合作为值,以某个字段作为键。

模糊查询:1、‘%${}%’2、concat(%,#{},%)3、“%”#{}“%”

解决字段名和属性名不一致的情况:1、为字段起别名,保持和属性名一致2、设置全局配置,将_自动映射为驼峰<setting name”mapUnderscoreToCamelCase” value=”true”/>3、通过resultMap设置自定义的映射关系

<reultMap id=””type=””> <id property=””column=””></id>主键映射关系,<result property=”” column=””>普通字段映射关系

处理多对一映射关系:1、级联属性复制 2、通过association处理多对一映射关系,property需要处理多对一的映射关系的属性名,javaType:该属性的类型3、分步查询需要加association 通过property 属性名,select设置分步查询的sql唯一标识,column设置分步查询的条件

分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息;lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载 aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可以通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=”lazy(延迟加载)|eager(立即加载)”

处理一对多的映射关系:1、通过collection集合 ,ofType:表示该属性所对应的集合中存储数据的类型2、通过分步查询

动态SQL:Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串的痛点问题。

1、if:根据标签中test属性所对应的表达式决定标签中的内容是否是需要拼接到SQL中

2、Where:当where标签中有内容时会自动生成where关键字,并且将内容前多余的and和or去掉;当where标签中没有内容时,此时where标签没有任何效果;注意:where标签不能将其中内容后面多余的and和or去掉

3、trim标签:若标签中无内容时,trim标签无效果

Prefix/suffix:将trim标签中内容前面或者后面填加指定内容

suffixOverride|prefixOverrides:将trim标签中内容前面或者后面去掉指定内容。

  1. choose、when、otherwise,相当于if...elseif...else,when至少有一个,otherwise最多只能有一个
  2. foreach:coolection:设置需要循环的数组或集合;item:表示数组或集合中的每一个数据;spearator:循环体之间的分隔符;open:foreach标签所循环的所有内容开始符;close:foreach标签所循环的所有内容结束符
  3. SQL标签:设置sql片段:<sql id=”empColumn”>eid,emp,name</spl>

引用SQL片段:<include refid=”empColums”></include>

Mybatis的一级缓存:一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库中重新访问。

使一级缓存失效的四种情况:1、不同的SqlSession对应不同的一级缓存

  1. 同一个SqlSession但是查询条件不同3、同一个SqlSession两次查询期间执行了任何一次增删改操作4、同一个SQLSession两次查询期间手动清空了缓存

Mybatis的二级缓存:二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的sqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取

二级缓存开启的条件

  1. 在核心配置文件中,设置全局配置属性cacheEnable=”true”默认为true,不需要设置
  2. 在映射文件中设置标签<cache/>
  3. 二级缓存必须在sqlsession关闭或提交之后有效
  4. 查询的数据所转换的实体类型必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

二级缓存相关配置:在Mapper配置文件中添加cache标签可以设置一些属性:

eviction:缓存回收策略

LRU最近最少使用的:移除最长时间不被使用的对象

FIFO 先进先出:按对象进入缓存的顺序来移除他们

SOFT:-软引用:移除基于垃圾回收器状态和软引用规则的对象

WEAK-弱引用:更积极的移除基于垃圾回收器状态和弱引用规则的对象

默认是LUR

flushInerval属性:刷新间隔,单位毫秒默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

Size属性:引用数目,正整数代表缓存最多可以存储多少个对象,太大容易导致内存溢出

readOnly属性:只读,true/flase

True:只读缓存,会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。

False:读写缓存,会返回缓存对象的拷贝,慢一些但是安全,默认false

Mybatis缓存查询的顺序:

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用

如果二级缓存没有命中,再查询一级缓存

如果一级缓存也没有命中,则查询数据库

SQLSession关闭之后,一级缓存中的数据会写入二级缓存

整合第三方缓存: 二级缓存使用EHCACH

Mybatis的逆向工程: 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的

逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:

Java实体类,Mapper接口,Mapper映射文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pjh_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值