基础
问答
你对MyBatis的理解?
是什么?
- Mybatis本是apache的一个开源项目iBatis。
- 是java编写的优秀的持久层框架,它支持定制化 sql、存储过程以及高级映射,实现了结果集的封装。
- mybatis避免了几乎所有的 jdbc代码和手动设置参数以及获取结果集。
- 是一个半ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建Statement等繁琐的过程;
- MyBatis可以使用简单的 XML 或注解来配置和映射原生类型、接口,将Java 的 pojo(plain old Java objects,普通老式 Java 对象)映射成数据库中的记录。
通过XML文件 或 注释的方式,将要执行的各种Statemet配置起来,并通过java对象和Statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射为java对象返回。(从执行SQL到返回Result的过程)。
MyBatis的优缺点有哪些?
优点
对于JDBC,减少了50%的代码量;
最简单的持久化框架,小巧且简单易学;
SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理,可重用;
提供XML标签,支持编写动态SQL语句(XML中使用if, else)。
提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
缺点
SQL语句的编写工作量较大,尤其是字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
MyBatis与Hibernate有哪些不同?
区别 | MyBatis | Hibernate |
---|---|---|
自动性 | 只有基本的字段映射,需要通过手写sql来实现和管理 | 完全可以自动生成sql |
数据库移植性 | 移植性差,由于需要手写sql | 移植性好,依赖于强大的映射结构和hql语言,降低了对象与数据库的耦合性。 |
日志系统 | 基本记录功能 | 较为健全 |
关心细节 | 更多关注技术细节,由于其使用简单 | 配置较为复杂,学习成本高 |
sql直接优化 | 较为方便 | sql是自动生成的,无法直接维护sql |
MyBatis中的#{} 和 ${} 有什么不同?*
动态sql是Mybatis的主要特性之一。
Mybatis提供了两种支持动态sql的语法:#{} 和 ${}
区别 | #{} | ${} |
---|---|---|
符号类型 | 参数占位符,即预编译 | 字符串替换符,即SQL拼接 |
处理 | 处理#{}会将#{}替换为?号,调用PreparedStatement的set方法来赋值 | 把${} 替换成变量的值 |
防注入问题 | 很大程度上能防止sql注入 | 不能防止sql注入 |
参数替换位置 | 在DBMS中 | 在DBMS外 |
参数解析 | 将传入的数据都当做一个字符串, 会对传入的变量自动加一个单引号 | 将传入的参数直接显示生成在sql中, 不加任何引号 |
用$的情况 | – | MyBatis排序使用order by,动态参数时使用$而不是# 一般用于传入数据库对象(比如表名) |
sql执行过程 | 编译好SQL语句后再去取值 | 取值以后再去编译SQL语句 |
流程 | 动态解析→预编译→执行 | 动态解析→编译→执行 |
一般情况 | 一般可以用#就别用$ | – |
MyBatis是如何进行分页的?分页插件的原理是什么?
MyBatis有哪几种分页方式?
MyBatis逻辑分页和物理分页的区别是什么?
MyBatis是否支持延时加载?如果支持,它的实现原理是什么?
说一下MyBatis的一级缓存和二级缓存?
MyBatis有哪些执行器(Excetor)?
MyBatis动态SQL是做什么的?都有哪些动态SQL?简述一下动态SQL的执行原理?
实战
问题1:mybatis+mysql 实现数据读取
参考博客;https://blog.csdn.net/qq_39746820/article/details/124571053
已经实现;
参考博客:https://blog.csdn.net/huangxiaoben/article/details/130683023
该博客中mapper继承的是BaseMapper,该类中以及存在数据库的增删改查等操作;
思考1:mybatis实现数据持久化
在springboot项目中会涉及到entity、mapper、controller、service四个文件夹
entity = 存储与数据库中某个数据表对应的实例对象的类;
通过@TableName("table name") 将数据库中的表映射到该类上;
通过resource文件夹中的与mapper同目录的.xml文件,编写sql语句实现映射;
mapper = 接口,创建要执行的抽象方法,具体的实现在resource中的同文件夹索引目录下;注解是@mapper
demo\src\main\java\com\example\testxhj1\demo\mapper\TestClass1Mapper.java
demo\src\main\resources\com\example\testxhj1\demo\mapper\TestClass1Mapper.xml
可以看出 两个文件夹只有java 以及 resources的区别;
.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace= "com.example.testxhj1.demo.mapper.TestClass1Mapper">
<select id="selectTestClass1ById" resultType="com.example.testxhj1.demo.entity.TestClass1">
select id,str1,str2 from table1 where id = #{id}
</select>
// 其中id的内容需要与mapper接口的抽象方法名称一致;
</mapper>
service = 与mapper接口相同,但是注解不同 @Service 同样也是接口
serviceImpl service接口的实现;使用mapper接口实现,自动装载@Autowired;
controller = 类,自动装载service接口;
整体调用流程是:controller类--service接口实现-mapper接口
问题2:mybatis+mysql 导入csv数据
参考博客:
https://blog.51cto.com/u_16213374/7691073
https://cloud.tencent.com/developer/article/2106459
扩展
ORM
ORM = 对象关系映射。
ORM = Object Relational Mapping对象关系映射,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就可以实现操作数据库表;
封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动、建立连接等复杂过程。
hql语言
hql语言 = hibernate query language的缩写,提供更加丰富灵活、更为强大的查询能力。sql查询的是表和表中的列;hql查询的是对象与对象中的属性。