目录
一、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。」
-
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
-
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
-
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、提交事务 、 关闭连接