zoukankan      html  css  js  c++  java
  • mybatis基础及原理

    IDEA创建mybatis配置文件模板

    IDEA提供了spring框架的配置模板,但是未提供mybatis配置文件模板,因此需要自己创建模板,创建步骤如下:

    settings -> Editor -> File and Code template -> Files 然后点击加号,文件后缀名为xml,文件名为mybatis-config,文件内容如下(mybatis配置基础版,根据个人需求添加)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        <!--环境配置,连接的数据库,这里使用的是MySQL-->
        <environments default="mysql">
            <environment id="mysql">
                <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
                <transactionManager type="JDBC"></transactionManager>
                <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"></property>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybbs"></property>
                    <property name="username" value="root"></property>
                    <property name="password" value="root"></property>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--这是告诉Mybatis区哪找持久化类的映射文件,对于在src下的文件直接写文件名,
                如果在某包下,则要写明路径,如:com/mybatistest/config/User.xml-->
            <mapper resource="User.xml"></mapper>
        </mappers>
    </configuration>

    这样在新建文件的菜单中就能够看到mybatis配置文件的模板了

    mybatis基础工程

    1、连接数据库,创建table,通过EasyCode插件创建entity类、mapper接口、mapper映射文件(前面说过,不细说)

    2、创建mybatis配置文件

    3、main方法如下:

    public static void main(String[] args) throws IOException {
        String config = "mybatis-config.xml";
    
        Reader reader = Resources.getResourceAsReader(config);
    
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
    
        TableStudentDao mapper = sqlSession.getMapper(TableStudentDao.class);
    
        TableStudent tableStudent = mapper.queryById("bale");
        System.out.println(tableStudent);
    }
    
    

    4、执行结果如下:

    mybatis主要构件及层次结构

    mybatis运行解析基本原理 

    1、构造SqlSessionFactory

    通过解析mybatis配置文件以及mapper映射文件,构造了SqlSessionFactory,很重要的一点,这一步构造了一个很重要的Configuration对象;

    Configuration对象包含了所有的配置解析信息

    2、SqlSession

    通过SqlSessionFactory以及配置的数据源,可以得到一个SqlSession对象,SqlSession作为sql会话访问的顶层API接口,提供完整的CRUD方法

    带着问题来了解SqlSession;

    问题1:怎么获取到SqlSession?

    默认情况下,SqlSessionFactory的实现类为DefaultSqlSessionFactory

    DefaultSqlSessionFactory提供了如下方法来获取SqlSession:

    其中入参有如下几个:是否自动提交、ExecutorType、事务隔离级别、数据库连接对象;例子中使用的是:自动提交

    问题2:getMapper方法获取的mapper对象到底是什么?

    DefaultSqlSession通过Configuration对象获取mapper,而Configuration类通过mapperRegistry获取mapper

    进一步跟踪源码,可以看到:mapperRegistry先从knownMappers中获取到MapperProxyFactory,然后调用MapperProxyFactory的newInstance方法获取到mapper;

    再进一步看,MapperProxyFactory的newInstance方法创建了一个MapperProxy对象,而MapperProxy类继承了InvocationHandler接口,到这里能够清晰知道,mapper实际上是一个JDK动态代理对象

    问题3:获取到mapper对象后,为什么指定mapper接口中定义的方法就能操作数据库?

    前面说到,mapper对象的实质是JDK动态代理对象,对应的InvocationHandler接口实现类为MapperProxy,所以调用mapper接口中的任意方法实质是调用MapperProxy的invoke方法;MapperProxy的invoke方法如下:

    前面的判断主要是为了保证toString等方法也能正常调用;实际的数据库操作要看else分支;

    由于java8增加了default方法,因此cachedInvoker方法兼容了default方法的处理:

    非default方法调用逻辑见PlainMethodInvoker类的invoke方法,PlainMethodInvoker为MapperProxy的一个静态内部类

    PlainMethodInvoker的invoke方法的实质是调用了MapperMethod的execute方法:

    以insert操作为例,一路跟进(调用过程很简单,不一一列出),最终定格到了SimpleStatementHandler类的update方法:

    这里调用了MySql驱动类的execute方法,到此找到了数据库操作的代码;

    问题4:mapper接口类和xml文件如何形成映射关系?

    Configuration对象存有一个Map对象,key为方法名,value为MappedStatement;MappedStatement存有xml文件的解析信息,在指行数据库操作的方法中调用获取;

    问题5:我们知道JDBC操作离不开Connection对象,那么在mybatis中,Connection对象体现在哪里呢?

    BaseExecutor类的getConnection方法中通过Transaction对象获取;

  • 相关阅读:
    day03—JavaScript中DOM的Event事件方法
    day02-Javascript之document.write()方法
    day01-JavaScript中"Uncaught TypeError: Cannot set property 'innerHTML' of null"错误
    Linux安装Tomcat8
    CentOS7安装jdk8及环境变量配置
    Linux命令之lsof
    java如何停止一个运行的线程?
    大数据技术之Hadoop(HDFS)
    大数据技术之Hadoop入门
    用word2013 把word 文档发送到博客园
  • 原文地址:https://www.cnblogs.com/sniffs/p/13472417.html
Copyright © 2011-2022 走看看