Mybatis源码解析(一)------打开Mybatis的大门

89 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 @TOC

Mybatis是什么?

mybatis是一个ORM(object relation mapping)框架。

对比手写JDBC和使用Mybatis

手写JDBC

Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<UserInfo> res = null;
        try {
            connection = DriverManager.getConnection("url","username","password");
            statement = connection.createStatement();
            resultSet = statement.executeQuery("sql");
            res  = new ArrayList<>();
            while (resultSet.next()){
                UserInfo userInfo = new UserInfo();
                userInfo.setId(resultSet.getInt(1));
                userInfo.setUsername(resultSet.getString("2"));
                res.add(userInfo);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

使用Mybatis(方式很多,这里以非xml方式为例)

DataSource dataSource = new PooledDataSource("com.mysql.cj.jdbc.Driver"
                ,"url"
                ,"username"
                ,"password");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("develoment",transactionFactory,dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(UserMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<UserInfo> userInfoList = mapper.selectUserList(1,"lwl");

可以看到,用mybatis之后确实更加方便,并且不用写一大堆try cath和记得使用后要关闭连接。

开始研究

从上面的代码可以看到,抛开数据源等设置,mybatis需要先定义mapper接口,然后把放到configuration中,然后在需要使用的时候直接通过session去渠道mapper的实例,执行即可得到结果。那一系列过程中mybati做了什么呢?mybatis如何获取到sql,如何将参数注入,又如何将数据库返回的结果映射成我们需要的对象? 下面这张图是我根据上面的代码结合源码画的一个大致流程图。 在这里插入图片描述 对于数据源配置,事务工厂什么的配置环节比较简单,只是做了一些初始化操作,这里调重点讲:mapper的注册、Mapper的实例化、方法的执行和结果集映射。

传送门

Mybatis源码解析(二)------Mapper注册