- 1、MyBatis 是什么框架?
2、MyBatis 和 ORM 的区别?
3、MyBatis 为什么是半自动 ORM 映射?
4、MyBatis 框架的应用场景?
5、MyBatis 有哪些优点?
6、MyBatis 有哪些缺点?
7、MyBatis 和 Hibernate 的区别?
8、MyBatis 和 JPA 的区别?
9、MyBatis 有哪几种 SQL 编写形式?
10、MyBatis 支持哪些传参数的方法?
11、MyBatis 的 $ 和 # 传参的区别?
12、MyBatis 可以映射到枚举类吗?
13、MyBatis 怎么封装动态 SQL?
14、Mybatis trim 标签有什么用?
15、MyBatis 怎么实现分页?
16、MyBatis 流式查询有什么用?
17、MyBatis 模糊查询 like 语句该怎么写?
18、MyBatis 配置文件中的 SQL id 是否能重复?
19、MyBatis 如何防止 SQL 注入?
20、MyBatis 如何获取自动生成的主键id?
21、MyBatis 使用了哪些设计模式?
22、MyBatis 中的缓存机制有啥用?
23、MyBatis 一级缓存和二级缓存的区别?
24、MyBatis-Plus 是什么框架?
1、MyBatis 是什么框架?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
2、MyBatis 和 ORM 的区别?
mybatis属于半orm,因为sql语句需要自己写。
与其他比较标准的 ORM 框架(比如 Hibernate )不同, mybatis 并没有将 java 对象与数据库关联起来,而是将 java 方法与 sql 语句关联起来,mybatis 允许用户充分利用数据库的各种功能,例如存储、视图、各种复杂的查询以及某些数据库的专有特性。
自己写 sql 语句的好处是,可以根据自己的需求,写出最优的 sql 语句。灵活性高。但是,由于是自己写 sql 语句,导致平台可移植性不高。MySQL 语句和 Oracle 语句不同
3、MyBatis 为什么是半自动 ORM 映射?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。
4、MyBatis 框架的应用场景?
可以说MyBatis是一个半映射的框架,它也支持缓存,级联等操作,缺点就在于需要你提供映射规则和SQL,工作量比Hibernate要大。MyBatis虽然开发不如Hibernate效率高,但是其灵活,可SQL优化的特点很吸引人,正因为此,在于大数据,高并发移动互联网项目中较为常用。
5、MyBatis 有哪些优点?
1. 与JDBC相比,减少了50%以上的代码量。
2. MyBatis是最简单的持久化框架,小巧并且简单易学。
3. MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
4. 提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
5. 提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
6、MyBatis 有哪些缺点?
- SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
1)Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过mybatis 可以通过XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的sql,最后将 sql 执行的结果再映射生成 java 对象。
7、MyBatis 和 Hibernate 的区别?
2)Mybatis 学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制 sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。
3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 hibernate开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
1.ORM映射不同:
8、MyBatis 和 JPA 的区别?
Mybatis是半自动的ORM框架,提供数据库与结果集的映射;
JPA(Hibernate)是全自动的ORM框架,提供对象与数据库的映射;
2.可移植性不同:
JPA(Hibernate)通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性
Mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
3.日志系统的完整性不同:
JPA(Hibernate)日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而Mybatis则除了基本记录功能外,功能薄弱很多。
4.SQL优化上的区别:
由于Mybatis的sql都是写在xml里,因此优化sql比Hibernate方便很多。而Hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上Hibernate不及Mybatis。
5.学习成本上的区别:
如果用Hibernate学习起来比较费时间,而Mybatis相对来说比较简单,也可以用springdata,但个人觉得springdata只适合单表。
9、MyBatis 有哪几种 SQL 编写形式?
第一种情形,传入单个参数 userId.
10、MyBatis 支持哪些传参数的方法?
第二种情况,传入多个参数 userId,sex 使用索引对应值
第三种情形,传入多个参数 userId,sex 使用注解@Param.
第四种情形,传入多个参数 使用User实体类传入
第五种情形,传入多个参数, 使用Map类传入
11、MyBatis 的 $ 和 # 传参的区别?
Mybatis 可以映射枚举类。
12、MyBatis 可以映射到枚举类吗?
不单可以映射枚举类,Mybatis 可以映射任何对象到表的一列上。映射方式为自定义一个 TypeHandler ,实现 TypeHandler 的 setParameter() 和 getResult() 接口方法。
TypeHandler 有两个作用,一是完成从 javaType 至 jdbcType 的转换,二是完成 jdbcType 至 javaType 的转换,体现为 setParameter() 和 getResult() 两个方法,分别代表设置 sql 问号占位符参数和获取列查询结果。
13、MyBatis 怎么封装动态 SQL?
14、Mybatis trim 标签有什么用?
trim 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides;正因为 trim 有这样的功能,所以我们也可以非常简单的利用 trim 来代替 where 元素的功能。https://www.yiibai.com/mybatis/mybaits_trim.html
15、MyBatis 怎么实现分页?
PageHelper.startPage 本质是limit m,n
16、MyBatis 流式查询有什么用?
流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。 流式查询的好处是能够降低内存使用。
17、MyBatis 模糊查询 like 语句该怎么写?
select * from table where name like concat(“%str%”)
18、MyBatis 配置文件中的 SQL id 是否能重复?
19、MyBatis 如何防止 SQL 注入?
20、MyBatis 如何获取自动生成的主键id?
<selectKey keyProperty="id" resultType="int" order="BEFORE"><br /> select unix_timestamp(now())<br /> </selectKey><br /><insert id="addUserList"<br /> parameterType="com.example.mybatis.entity.User"<br /> useGeneratedKeys="true"<br /> keyProperty="id">
21、MyBatis 使用了哪些设计模式?
https://zhuanlan.zhihu.com/p/97269702
builder模式 sqlSessionFactoryBuilder
工厂模式 SqlSessionFactory
单例 logFactory
代理模式 MapperProxy
9种
22、MyBatis 中的缓存机制有啥用?
23、MyBatis 一级缓存和二级缓存的区别?
(1)一级缓存 基于sqlSession的缓存【默认开启】
一级缓存:也称为本地缓存,用于保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个sqlSession,一级缓存是自动开启的,不允许关闭。
注意:查询语句最后都是关闭资源,如果不关闭资源数据会出现闪动
1、查询第一次时,获取到数据写入一级缓存,再次查询时从缓存获取,不再执行sql语句 2、若当前SqlSession发生修改、增加、删除动作时,就会立即把当前缓存的所有数据清空 3、对于查询操作,只要SqlSession没有调用flush或者close方法,它就一直存在
(2)二级缓存:基于mapper的缓存(基于指定实体类的缓存)(末默认不开启)
二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。(也可以说是,在同一namespace下,共享一块缓存空间,如果多个mapper (dao.xml)共享同一namesapce 则也共享一块缓存,二级缓存是跨sqlsession,多个sqlsession可以去二级缓存获取数据。即可以针对同一个dao接口或者同一个命名空间(namespace)创建多个SqlSession )
1、只要发生增删改,就会将·同一命名空间(namespace)下的缓存清空 2、使用二级缓存实体类必须实现序列化,否则报错 3、使用查询语句,默认只写入一级缓存,只有调用close(),commit()方法, 才会将数据提交到二级缓存,其他的sqlsession才能拿到,不再执行sql语句
24、MyBatis-Plus 是什么框架?
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作