目录
二 .Mybatis 结果集的映射方式有几种,并分别解释每种映射方式如何使用。
三 .简述MyBatis的单个参数、多个参数如何传递及如何取值。
五. 简述Mybatis的动态SQL,列出常用的6个标签及作用
六 . Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
七 . Mybatis 如何完成MySQL的批量操作,举例说明
九 .简述如何在myBatis中的增删改操作获取到对数据库的影响条数
十一 .简述Mybatis中使用Mapper接口开发,如何完成Mapper接口与SQL映射文件、方法与SQL语句的绑定
十二 .JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
十四.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
二 .MyBatis 是如何进行分页的?分页插件的原理是什么?
四 .ResultType 和 ResultMap 的区别?
七 .在 mybatis 中,${} 和 #{} 的区别是什么?(必会)
九 .在 mybatis 中,resultType 和 ResultMap 的区别是什么?(必会)
十 .在 Mybatis 中你知道的动态 SQL 的标签有哪些?作用分别是什么?(必会)
十一 .谈一下你对 mybatis 缓存机制的理解?(了解)
四 .简述MyBatis的单个参数、多个参数如何传递及如何取值。
七 .Mybatis 如何完成MySQL的批量操作,举例说明
十 .Mybatis是如何进行分页的?分页插件的原理是什么?
#{}是预编译处理,${}是字符串替换;
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值;
使用#{}可以有效的防止SQL注入,提高系统安全性。
自动映射 ,通过resultType来指定要映射的类型即可。
自定义映射 通过resultMap来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。
MyBatis传递单个参数,如果是普通类型(String+8个基本)的,取值时在#{}中可以任意指定,如果是对象类型的,则在#{}中使用对象的属性名来取值
MyBatis传递多个参数,默认情况下,MyBatis会对多个参数进行封装Map,取值时在#{}可以使用0 1 2 .. 或者是param1 param2..
MyBatis传递多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用
@Param() 来指定封装Map时用的key. 取值时在#{}中使用@Param指定的key
在
示例:

动态SQL是MyBatis的强大特性之一 基于功能强大的OGNL表达式。
动态SQL主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询
常用的标签:
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复。
MyBatis完成MySQL的批量操作主要是通过

(1)MyBatis的缓存分为一级缓存和 二级缓存。
一级缓存是SqlSession级别的缓存,默认开启。
二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。
(2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库
直接在Mapper接口的方法中声明返回值即可
通过该注解来指定Mybatis底层在处理参数时封装Map使用的key,方便在SQL映射文件中取参数。
Mapper接口与SQL映射文件绑定:SQL映射文件中的namespace的值指定成Mapper接口的全类名
接口中方法与SQL语句的绑定:SQL语句的id 指定成接口中的方法名。
1) 数据库连接的创建、释放频繁造成系统资源浪费从而影响了性能,如果使用数据库连接池就可以解决这个问题。当然JDBC同样能够使用数据源。
解决:在SQLMapConfig.xml中配置数据连接池,使用数据库连接池管理数据库连接。
2) SQL语句在写代码中不容易维护,事件需求中SQL变化的可能性很大,SQL变动需要改变JAVA代码。解决:将SQL语句配置在mapper.xml文件中与java代码分离。
3) 向SQL语句传递参数麻烦,因为SQL语句的where条件不一定,可能多,也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射到sql语句。
4) 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mbatis自动将SQL执行结果映射到java对象。
Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

Mybatis+xml:
MyBatis是一个半ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。通过直接编写原生态SQL,可以严格控制SQL语句的执行性能,灵活度高(支持动态SQL语句)。
MyBatis 使用XML或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了JDBC代码手动设置参数以及获取结果集的繁琐步骤。
MyBatis通过xml文件或注解的方式将要执行的各种 statement 配置起来,并通过Java对象和 statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL语句,并将结果映射为Java对象并返回。
每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。首先用字节流通过Resource将配置文件读入,然后通过SqlSessionFactoryBuilder().build方法创建SqlSessionFactory,然后再通过SqlSessionFactory.openSession()方法创建一个SqlSession为每一个数据库事务服务。
经历了Mybatis初始化 –>创建SqlSession –>运行SQL语句,返回结果三个过程
- id:sql语句唯一标识
- parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼 接在sql中。
- resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
- resultMap:resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo 和list实现一对一查询和一对多查询。
- #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。一般能用#的就别用$.
- ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进 行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
MyBatis传递单个参数,如果是普通类型(String+8个基本)的,取值时在#{}中可以任意指定,如果是对象类型的,则在#{}中使用对象的属性名来取值
MyBatis传递多个参数,默认情况下,MyBatis会对多个参数进行封装Map. 取值时在#{}可以使用0 1 2 .. 或者是param1 param2..
通常Mybatis开发Dao方法有两种。即原始Dao开发方法和Mapper接口开发方法。
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径相同。
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名.
Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行MappedStatement所代表的 sql,然后将 sql 执行结果返回。
动态 SQL 是指可以根据不同的参数信息来动态拼接的不确定的SQL叫做动态 SQL。
MyBatis 动态SQL 的主要元素有:if、choose/when/otherwise、trim、where、set、foreach 等。
通过mybatis提供的各种标签方法实现动态拼接sql
foreach标签:循环传入的集合参数
collection:传入的集合的变量名称
item:每次循环将循环出的数据放入这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
where标签作用:会自动向sql语句中添加where关键字,会去掉第一个条件的and关键字。
include标签:调用sql条件
MyBatis完成MySQL的批量操作主要是通过
标签来拼装相应的SQL语句. 例如:
insert into tbl_employee(last_name,email,gender,d_id) values
(#{curr_emp.lastName},#{curr_emp.email},#{curr_emp.gender},#{curr_emp.dept.id})
mybatis是自动开启一级缓存的,sqlsession级别
mybatis的二级缓存需要手动开启的,mapper级别(application应用),
通常项目中,对于字典表(大量查询,很少修改)的数据,可以使用mybatis的二级缓存机制,
提高查询效率。比如省市县、汽车品牌、配件类别、企业信息等
只需要在 mybatis-config.xml 设置即可打开延迟缓存功能
逻辑分页,使用MyBatis自带的RowBounds进行分页,它是一次性查询很多数据,然后在数据中再进行检索;
物理分页,手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据形式。
1)Mybatis使用RowBounds对象进行分页,可以直接编写sql实现分页,也可以使用Mybatis的分页插件PageHelper。
2)分页插件的原理:实现Mybatis提供的接口Interceptor,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。
举例:
select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10