mybatis 总结

Posted better_hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 总结相关的知识,希望对你有一定的参考价值。

目录

一、jdbc的几个步骤

二、什么是mybatis

三、什么是ORM

四、mybatis优缺点

五、mybatis的分页

六、分页插件的基本原理

七、插件的原理

八、如何编写一个插件

九、动态sql

十、xml映射文件中有哪些标签

十一、mybatis是否支持延迟加载

十二、mapper.xml对应的dao接口原理

十三、#{} 和 ${} 区别

十四、.Mybatis执行批量插入,能返回数据库主键列表吗

十五、不同xml文件 , id是否可以重复

十六、Mybatis中Executor执行器的区别

十七、Mybatis全局配置文件中有哪些标签

十八、实体中属性名与表字段不一致

十九、mybatis编写流程


一、jdbc的几个步骤

1、加载驱动

2、获得一个链接

3、创建一个Statement对象

4、操作数据库

5、获得结果集

6、关闭资源

二、什么是mybatis

1、一款优秀的持久层框架,支持自定义sql、存储过程及高级映射

2、几乎免除了jdbc代码、参数设置、结果集获取转换

3、通过简单的xml 或者 annotation 来配置和映射原始类型、接口和java pojo 为数据库记录

三、什么是ORM

Object Relational Mapping , 对象 — 关系型数据库 — 映射 ,用以实现面向对象编程语言里不同类型系统的数据之间的转换。简单来讲就是将程序中的对象 与 关系型数据库相互映射。

优点:

1、提高开发效率 , 开发人员不用关系数据库相关的逻辑代码

2、ORM提供对数据库的映射 , 可以向操作对象一样 ,操作数据库

缺点:

1、牺牲程序的执行效率和会固定思维模式,降低了开发的灵活性。

从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。

在我们开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确的使用上。

ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。

在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。

四、mybatis优缺点

优点:

1、基于sql语句编程,灵活性高;xml文件接触sql与代码的耦合;支持动态sql

2、相对原生jdbc , 减少50%的代码量,消除jdbc大量冗余代码

3、兼容多种数据库

4、能够很好的与spring集成

5、提供映射标签,支持对象与数据库的关系映射

缺点:

1、sql编写量大

2、sql依赖数据库,移植性差

适用场景:

1、专注于sql ,是一个足够灵活的dao层解决方案

2、对性能要求高或需求变化较多的项目

五、mybatis的分页

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,先把数据都查出来,然后再做分页。

可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

六、分页插件的基本原理

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql(SQL拼接limit),根据dialect方言,添加对应的物理分页语句和物理分页参数,用到了技术JDK动态代理,用到了责任链设计模式。

七、插件的原理

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

八、如何编写一个插件

编写插件:实现Mybatis的Interceptor接口并复写intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。

九、动态sql

mybatis可以在xml文件里,以标签的形式编写动态sql,执行原理是基于ognl表达式完成逻辑判断,并动态调整sql的功能

mybatis提供9中动态sql标签:where / if / trim / foreach / chose / when / otherwise / bind

十、xml映射文件中有哪些标签

insert / update / delete / select

<resultMap>

<parameterMap>

<sql>

<include>

<selectKey>

十一、mybatis是否支持延迟加载

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false

原理:

比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。

十二、mapper.xml对应的dao接口原理

简单说:使用了JDK动态代理和反射,把接口和xml绑定在一起而搞定的。

十三、#{} 和 ${} 区别

${} 字符串替换 取变量的值 ,并完成替换

#{} 预处理 将#{} 替换为 ? , 调用PreparedStatement的set方法赋值

十四、.Mybatis执行批量插入,能返回数据库主键列表吗

1、对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性。

2、不支持生成自增主键的数据库:使用<selectKey>

方式:

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

十五、不同xml文件 , id是否可以重复

不同xml文件 , 如果配置了namespace , id是可以重复的 , 否则不能重复。

原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

十六、Mybatis中Executor执行器的区别

Mybatis有三种基本的Executor执行器,「SimpleExecutor、ReuseExecutor、BatchExecutor。」

img

  1. SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

  2. ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。

  3. BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。

十七、Mybatis全局配置文件中有哪些标签

configuration 配置

properties 属性:可以加载

properties配置文件的信息

settings 设置:可以设置mybatis的全局属性

typeAliases 类型命名

typeHandlers 类型处理器

objectFactory 对象工厂

plugins 插件

environments 环境

environment 环境变量

transactionManager 事务管理器

dataSource 数据源

mappers 映射器

十八、实体中属性名与表字段不一致

1、设置别名

2、<resultMap> 设置映射关系

3、注解设置摄影关系

十九、mybatis编写流程

1、创建sqlSessionFactory

2、通过sqlSessionFactory 创建 sqlSession

3、通过sqlSession 获取一个mapper

4、通过mapper执行操作

5、提交事务 、 关闭连接

以上是关于mybatis 总结的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis——Dao层实现映射文件深入核心配置文件深入

markdown [mybatis参考]关于mybatis #mybatis的一些片段

mybatis学习(39):动态sql片段

python常用代码片段总结

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

BootStrap有用代码片段(持续总结)