Mybatis源码本地化构建Demo

2020-09-02 16:42:42 浏览数 (1)

绪论

上一篇文章中专门整理了如何构建Mybatis源码,小伙伴们可以在本地写demo跟踪或者注释修改源码等等骚操作。。。本篇就是为小伙伴们介绍一下如何本地化构建demo。

这里分享一下mybatis的中文官方文档,小编构建本地化demo时参考了官方文档。

构建

首先,创建一个package,命名为demo。小编先贴出自己本地化目录。

SQL

数据库中创建blog表,并在model包下生成对应实体类Blog;

代码语言:javascript复制
DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
  `id` int(11) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置文件

mybatis-config.xml文件主要包含对mybatis的全局配置:数据库配置数据源连接、事务管理器和作用域等,并且深深影响 MyBatis 行为的设置和属性信息。具体结构如下:

代码语言:javascript复制
- configuration(配置)
	- properties(属性) 
	- settings(设置)
	- typeAliases(类型别名)
	- typeHandlers(类型处理器)
	- objectFactory(对象工厂)
	- plugins(插件)
	- environments(环境配置)
		- environment(环境变量)
			- transactionManager(事务管理器)
			- dataSource(数据源)
	- databaseIdProvider(数据库厂商标识)
	- mappers(映射器)

说明:1. 从上图中可以看出,configuration 元素是整个 XML 配置文件的根节点,其角色就相当于是 MyBatis 的总管, MyBatis 所有的配置信息都会存放在它里面。 MyBatis 还提供了设置这些配置信息的方法。 Configuration 可从配置文件里获取属性值,也可以通过程序直接设置。Configuration 可供配置的内容如下。

  1. mybatis-config.xml 文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么 XML 文件会报错。为什么会报错呢???这里小编以为是源码执行顺序解析自上向下,所以顺序不能改变。如果想改变顺序,可以对源码进行一波操作。 以下是小编的mybatis-config.xml配置:
代码语言:javascript复制
<?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>
    <typeAliases>
        <typeAlias type="org.apache.ibatis.demo.model.Blog" alias="Blog"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/stream-source"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/apache/ibatis/demo/BlogMapper.xml"/>
        <!--使用全限定类名-->
        <!--<package name="org.apache.ibatis.demo.mapper"/>-->
        <!-- <mapper class="org.apache.ibatis.demo.mapper.BlogMapper"/>-->
    </mappers>
</configuration>

注意点:这里着重提一下引用Mapper.xml文件的四种格式,即标签中内容。(小心面试官突然问到,自己懵逼中)。

再加一个彩蛋,这四种方式,默认引用的优先级是哪一种???有知道的大佬评论区留言哦。(答案请见源码区,后面的文章小编会提到)。

  1. 相对于类路径的资源引用
代码语言:javascript复制
<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
  1. 完全限定资源定位符(包括 file:/// 形式的 URL)
代码语言:javascript复制
<!-- 使用完全限定资源定位符(URL) -->
<mappers>java
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>
  1. 类名
代码语言:javascript复制
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>
  1. 包名
代码语言:javascript复制
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

映射文件

xxxMapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd。

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

代码语言:javascript复制
cache – 该命名空间的缓存配置。
cache-ref – 引用其它命名空间的缓存配置。
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!
sql – 可被其它语句引用的可重用语句块。
insert – 映射插入语句。
update – 映射更新语句。
delete – 映射删除语句。
select – 映射查询语句。

Mapper映射文件是以作为根节点,在根节点中支持9个元素,分别为 cache、cache-ref、resultMap、parameterMap、sql;insert、update、delete、select;

小编映射文件如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.ibatis.demo.mapper.BlogMapper">
    <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

注意:这里小编并未定义出resultMap、SQL等标签,此文只是为了搭建demo示例,后面跟踪源码时,会依次定义。有需要的伙伴自行定义。

Application

进入主启动类:

代码语言:javascript复制
 public static void main(String[] args) throws IOException {
        String resource = "org/apache/ibatis/demo/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //解析XML核心配置、映射文件,sql语句;注册Mapper
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session = sqlSessionFactory.openSession();
        //底层采用JDK动态代理创建Mapper接口对象
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        //jdbc交互
        Blog blog = mapper.selectBlog(1);
        System.out.println(blog.getAuthor());

//        Blog blog = session.selectOne("org.apache.ibatis.demo.mapper.BlogMapper.selectBlog", 1);
//        System.out.println(blog.toString());

    }

总结

准备工作已经完成,后面小编准备死磕源码啦,也会整理出相关跟踪源码的过程。希望大家能够多多支持!!!

0 人点赞