- 谈谈你对 mybatis 框架的理解
- Mybatis是一个优秀的持久层框架
- 我们通常可以基于mybatis实现数据持久化操作
- 因为mybatis在数据持久化的过程当中简单高效且灵活
- 说说 mybatis 持久化对象(数据)流程
- Mybatis底层实现了一个对jdbc的封装
- 我们从一个SQLSessionFactory一个sql会话工厂的创建到我们会话的开启
- 在会话过程中如何基于相关API实现数据持久化的过程
- 比如 我们在使用SQLSession对象实现与数据库会话时,我们要先创建一个执行器execute对象
- 之后通过execute对象去创建statementHandler对象通过他来处理我们的statement对象,使用parameterHandler完成参数映射
- 类型装换typeHandler Java类型到数据库jdbc类型的一个转换
- 数据结果集的映射 我们从数据库查询出一条数据要把它映射到内存中的一个对象
谈谈你对 mybatis 中的动态 sql 的理解?
- 动态sql能够灵活性利用我们的sql语句
- 他是mybatis中一种特有的sql应用
- 这些语句的构建是依托于动态sql中提供的一些标签元素基于数据的变化数据的不同来构建我们不同的语句来实现与数据库更加灵活的通讯
谈谈你对 mybatis 中#和$的异同点?(共性,特性)
- 可以把他们看成是mybatis中的一种表达式
- #一把用在一些条件表达式中来获取参数的值 就是我们sql元素所对应的参数中的值
- $一般用在order by ,group by,from用于替换具体的表名 列名
- $底层只是一个字符串的替换,也许会存在SQL注入的风险
Mybatis 中的批处理操作如何实现?(性能)
- 一般更新用的比较多
- 首先我们要把想要持久化的数据存到缓存中,然后在一起提交这个数据
- 我们在使用sql会话工厂创建sql会话时会用到openSession()可以指定executer的类型我们可以基于不同的executer比如批处理的executer(BatchExecuter)来执行批处理的操作
Mybatis 中可以自定义插件吗,如何实现?(扩展)
- 当然可以
- Mybatis中定义了一个Interceptor拦截器
- 如何理解 mybatis 中的自定义类型转换器?(扩展)
- 比如将java数据类型转换成jdbc数据类型
- 比如map类型就需要自定义一个转换类型
- 说一说通用mapper
通用mapper底层就是用的mybatis的拦截器,一般小公司用的较多,但是层层封装会导致mybatis的性能下降,所以大公司不会考虑
从配置文件中读取信息build(config)---->创建sqlsessionfactory-->用sqlsessionfactory的openSession()创建SQLSession--->之后再和数据库互动
Sqlsessionfactory是个接口的默认实现类DefaultSQLSessionFactory
SQLSession也是个接口他的默认实现类是DefaultSQLSession
- Mybatis基本工作流程
1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用mapper.xml文件中配置的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
- 将返回的结果通过映射,包装成java对象。
- Mybatis的mapper文件中resultType和resultMap的区别
使用resultType进行输出映射,只有查询出来的列名和pojo中的属
性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属
性名不一致,通过定义一个resultMap对列名和pojo属性名之间作
一个映射关系。