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
參考:https://www.cnblogs.com/molao-doing/articles/Maven.html
三、修改日誌等級
建一個我們自己測試的包,修改一下日誌等級。
### 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
源碼了!