Mybatis
源码分析之准备工作
一、下载源码
我们从github
很慢,国内的码云可以将github
项目导入到码云的自己仓库;然后就可以在码云上克隆项目,这样就方便很多了。
吐槽一下:mybatis
项目是maven
,不像spring
源码那样太麻烦,idea
对gradle
的支持又不很好用,配置起来很麻烦。
然后把github
的mybatis
的仓库链接复制。
导入之后我们的码云仓库就是这样:
最后克隆下载就OK了。
二、添加一些依赖
在项目的src
目录下创建一个resources
目录,标识为resources
,里面将添加mybatis
的配置文件和映射文件。
接着我们需要修改一个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>
然后编译,运行一下,看看是不是可以使用!
还需要修改一个数据库驱动的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
配置文件的节点
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>
最后我们生成的项目结构是这样的:
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
源码了!