​Mybatis​​源码分析之准备工作

一、下载源码

我们从​​github​​​很慢,国内的码云可以将​​github​​项目导入到码云的自己仓库;然后就可以在码云上克隆项目,这样就方便很多了。

吐槽一下:mybatis项目是​maven​,不像​spring​源码那样太麻烦,​idea​​gradle​的支持又不很好用,配置起来很麻烦。

Mybatis源码分析之准备工作_List

然后把​​github​​​的​​mybatis​​的仓库链接复制。

Mybatis源码分析之准备工作_List_02

导入之后我们的码云仓库就是这样:

Mybatis源码分析之准备工作_maven_03

最后克隆下载就OK了。

二、添加一些依赖

在项目的​​src​​​目录下创建一个​​resources​​​目录,标识为​​resources​​​,里面将添加​​mybatis​​的配置文件和映射文件。

Mybatis源码分析之准备工作_apache_04


接着我们需要修改一个​​pom​​​文件,让​​mybatis​​​项目可以识别​​resources​​​目录中的​​xml​​​配置文件。不然我们测试类就会无法识别​​xml​​文件。

<build>
......
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
......
</build>

我们需要分析源码,我们需要添加一写必要的依赖进去

<!--添加lombok依赖-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
<scope>test</scope>
</dependency>

然后编译,运行一下,看看是不是可以使用!

Mybatis源码分析之准备工作_maven_05

还需要修改一个数据库驱动的​​scope​​​的类型。​​mybatis​​​的​​mysql​​​的驱动原来的​​test​​的,不然会出现驱动无法找到。

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<!-- <scope>test</scope>-->
<scope>runtime</scope>
</dependency>
补充一下:​​maven scope​​的依赖范围

Maven的生命周期存在编译、测试、运行这些过程,那么显然有些依赖只用于测试,比如​​junit​​​;有些依赖编译用不到,只有运行的时候才能用到,比如​​mysql​​​的驱动包在编译期就用不到(编译期用的是​​JDBC​​​接口),而是在运行时用到的;还有些依赖,编译期要用到,而运行期不需要提供,因为有些容器已经提供了,比如​​servlet-api​​​在​​tomcat​​​中已经提供了,我们只需要的是编译期提供而已。总结说来,在​​POM​​​中,​​<dependency>​​​中还引入了​​<scope>​​​,它主要管理依赖的部署。大致有​​compile​​​、​​provided​​​、​​runtime​​​、​​test​​​、​​system​​等几个。

  • ​compile​​​:默认的​​scope​​,运行时有效,需要打入包中。
  • ​provided​​:编译时有效,运行期不需要提供,不会打入包中。
  • ​runtime​​:编译不需要,在运行期有效,需要导入包中。
  • ​test​​:编译需要,不会打入包中。
  • ​system​​​:非本地仓库引入,存在系统的某个路径下的​​jar​


三、修改日志等级

建一个我们自己测试的包,修改一下日志等级。

### Global logging configuration
log4j.rootLogger=ERROR, stdout

### Uncomment for MyBatis logging 默认是 ERROR
log4j.logger.org.apache.ibatis=INFO
log4j.logger.com.mly.learn=DEBUG

log4j.logger.org.apache.ibatis.session.AutoMappingUnknownColumnBehavior=WARN, lastEventSavedAppender

### Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

log4j.appender.lastEventSavedAppender=org.apache.ibatis.session.AutoMappingUnknownColumnBehaviorTest$LastEventSavedAppender

四、添加​​mybatis​​的基础文件

​mybatis-config​​配置文件的节点

Mybatis源码分析之准备工作_maven_06

4.1. ​​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>
<!-- <properties resource="jdbc.properties" />-->
<!--环境配置,连接的数据库,这里使用的是MySQL-->
<environments default="development">
<environment id="development">
<!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
<transactionManager type="JDBC"/>
<!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.252.139:3306/mybatis-test?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射器 -->
<mappers>
<mapper resource="mappers/BlogMapper.xml"/>
</mappers>
</configuration>

添加一个​​blog​​的数据表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for blog
-- ----------------------------
DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
`id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`brief` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` int(1) NULL DEFAULT NULL,
`age` int(2) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of blog
-- ----------------------------
INSERT INTO `blog` VALUES ('1231231', 'zhangsan', '1231231', 1, 12);

SET FOREIGN_KEY_CHECKS = 1;
4.2. 添加实体和​​mapper​​接口和映射文件
@Data
public class Blog implements Serializable {

private String id;

private String name;

private String brief;

private Integer sex;

private Integer age;

}
public interface BlogMapper {

/**
* 获取列表
* @return List<Blog>
*/
List<Blog> getList();

}
<?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="com.mly.learn.mapper.BlogMapper">
<resultMap id="blogResultMap" type="com.mly.learn.entity.Blog">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="brief" property="brief" />
<result column="sex" property="sex" />
<result column="age" property="age" />
</resultMap>

<sql id="Base_Column_List">
id, name, brief, sex, age
</sql>

<select id="getList" resultType="com.mly.learn.entity.Blog">
select <include refid="Base_Column_List" /> from blog
</select>
</mapper>

最后我们生成的项目结构是这样的:

Mybatis源码分析之准备工作_IDEA_07

4.3. 编写测试类
import com.mly.learn.entity.Blog;
import com.mly.learn.mapper.BlogMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
* @author 墨龙吟
* @version 1.0.0
* @ClassName Test.java
* @Description TODO
* @createTime 2020年05月20日 - 15:34
*/
public class Test {

public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
BlogMapper mapper = session.getMapper(BlogMapper.class);
List<Blog> list = mapper.getList();
System.out.println(list);
System.out.println(list.size());
}

}
4.4. 结果

Mybatis源码分析之准备工作_IDEA_08

下面我们就可以开始研究mybatis源码了!