绪论
上一篇文章中专门整理了如何构建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 可供配置的内容如下。
- mybatis-config.xml 文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么 XML 文件会报错。为什么会报错呢???这里小编以为是源码执行顺序解析自上向下,所以顺序不能改变。如果想改变顺序,可以对源码进行一波操作。 以下是小编的mybatis-config.xml配置:
<?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文件的四种格式,即标签中内容。(小心面试官突然问到,自己懵逼中)。
再加一个彩蛋,这四种方式,默认引用的优先级是哪一种???有知道的大佬评论区留言哦。(答案请见源码区,后面的文章小编会提到)。
- 相对于类路径的资源引用
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>
- 完全限定资源定位符(包括 file:/// 形式的 URL)
<!-- 使用完全限定资源定位符(URL) -->
<mappers>java
<mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>
- 类名
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.BlogMapper"/>
</mappers>
- 包名
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<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());
}
总结
准备工作已经完成,后面小编准备死磕源码啦,也会整理出相关跟踪源码的过程。希望大家能够多多支持!!!