说说什么是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接口有两个不同的实现,分别为CglibProxyFactoryJavassistProxyFactory

如果不使用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处理。

By xbingo

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注