最近出去面试,在简历中写了些关于Mybatis的技术点,于是面试官就开始对我不断询问,本文特意记录下面试中遇到的一些问题。
说说什么是Mybatis
Mybatis是一款对于Sql进行了一定封装的持久化sql框架,将常用的crud接口进行了一定的封装,减轻了开发人员对于SQL操作的繁琐性。
在工作中为什么会选择使用这款框架?
- 简化了sql的相关操作复杂度
- 自动处理好了链接的创建,释放,sql的参数组装
- 可以引入一些第三方缓存的插件
- 提供了对于Spring容器的集成功能
- 学习成本低,市面上也有比较多的资料信息
说一下正常的JDBC执行规范?
首先需要通过DriverManager建立链接,然后获取到Statement对象。
public class JdbcApplication { static String driverName = "com.mysql.jdbc.Driver"; static String username = "root"; static String password = "test"; static String url = "jdbc:mysql://cloud.db.com:3306/db_user"; public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection(url,username,password); String sql = "select * from t_user"; PreparedStatement preparedStatement = connection.prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(); while(resultSet.next()){ int id = resultSet.getInt("id"); System.out.println(id); } resultSet.close(); preparedStatement.close(); connection.close(); } } 复制代码
建立一个数据源的大致步骤:
1.构建数据源
2.创建数据库链接,一般是可以通过DriverManager.getConnection()来获取
3.创建sql并且执行,例如调用Statement接口执行,JDBC的api中定义的executeQuery()
方法执行查询操作,executeUpdate()方法执行更新操作
4.结果集的处理,一般都是对resultSet进行getint,getString之类的操作。
5.链接的释放,例如说.close相关操作。
你说自己看过MyBatis的源码,列举些内部比较核心的类说说?
Configuration
管理 mysql-config.xml 全局配置关系类
SqlSessionFactory
SqlSession 管理工厂接口
SqlSession
是一个面向用户(程序员)的接口。SqlSession 中提 供了很多操作数据库的方法
Executor
执行器是一个接口(基本执行器、缓存执行器)
作用:SqlSession 内部通过执行器操作数据库
MappedStatement
底层封装对象
作用:对操作数据库存储封装,包括 sql 语句、输入输出参数
StatementHandler
具体操作数据库相关的 handler 接口
ResultSetHandler
具体操作数据库返回结果的 handler 接口
SQL对象
mybatis内部拼接sql语句信息的封装对象
ScriptRunner
mybatis内部一个能接收链接参数信息的脚本运行器。
SqlRunner
使用SqlRunner可以简化我们的jdbc执行操作,代码如下:
public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection(url,username,password); SqlRunner sqlRunner = new SqlRunner(connection); String querySql = new SQL(){{ SELECT("*"); FROM("t_user"); WHERE("1=1"); }}.toString(); List<Map<String,Object>> resultMap = sqlRunner.selectAll(querySql); for (Map<String, Object> stringObjectMap : resultMap) { System.out.println(stringObjectMap.toString()); } } 复制代码
MetaObject
一个比较常用的反射工具类,在mybatis源码里面经常会看到。
MetaClass
这里面包含了一个org.apache.ibatis.reflection.Reflector 对象,这个对象内部似乎包含了比较多的关于反射获取的属性值,例如说方法信息,字段属性等。
ObjectFactory
这是一个创建对象的工厂设计,在创建某些对象之前会先又一层包装的warrper,可以适当地调整入参信息。
ObjectFactory objectFactory = new DefaultObjectFactory(); List<Object> strs = new ArrayList<Object>(); List<Class<?>> classList = new ArrayList<>(); String str = objectFactory.create(String.class,classList,strs); 复制代码
ProxyFactory
是一个代理工厂,主要适配了mybatis里面的几种代理机制。ProxyFactory接口有两个不同的实现,分别为CglibProxyFactory和JavassistProxyFactory
如果不使用Spring框架,Mybatis框架该如何使用?
原生mybatis1的执行流程:
public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //核心点在这 SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.selectAll(); System.out.println(userList.toString()); } 复制代码
首先通过sqlsessionfactory结合配置文件的数据(可以是io流信息),创建出一个sqlsession,然后根据sqlsession获取到通过MapperProxy创建的jdk代理,当执行对应的sql语句的时候会调用invocationhandler里面的invoke语句。接下来就是一系列的crud封装的handler处理。