八股文面经之Mybatis笔记(上)

简介: 八股文面经之Mybatis笔记(上)

最近出去面试,在简历中写了些关于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处理。

目录
相关文章
|
9天前
|
Java 关系型数据库 数据库连接
MyBatis-Plus全套笔记一
MyBatis-Plus全套笔记一
|
6月前
|
SQL Java 数据库连接
[推荐] MyBatis框架初学笔记-为之后拾遗
[推荐] MyBatis框架初学笔记-为之后拾遗
40 0
|
9月前
|
SQL 存储 缓存
MyBatis 学习心得笔记
MyBatis 学习心得笔记
65 0
|
11月前
|
SQL 存储 缓存
|
11月前
|
SQL 存储 Java
|
11月前
|
SQL Java 关系型数据库
|
SQL XML Java
MyBatis知识点笔记
MyBatis知识点笔记
156 0
MyBatis知识点笔记
|
SQL XML Java
(一)Mybatis-plus(MP)中CRUD操作保姆级笔记
🍅 Java学习路线:搬砖工的Java学习路线 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
334 0
(一)Mybatis-plus(MP)中CRUD操作保姆级笔记
|
SQL XML Java
Mybatis基础笔记五
Mybatis基础笔记五
|
SQL XML Oracle
Mybatis基础笔记四
Mybatis基础笔记四