Mybatis源碼分析之準備工作

Mybatis源碼分析之準備工作

一、下載源碼

我們從github很慢,國內的碼雲可以將github項目導入到碼雲的自己倉庫;然後就可以在碼雲上克隆項目,這樣就方便很多了。

吐槽一下:mybatis項目是maven,不像spring源碼那樣太麻煩,ideagradle的支持又不很好用,配置起來很麻煩。

然後把githubmybatis的倉庫鏈接複製。

導入之後我們的碼雲倉庫就是這樣:

最後克隆下載就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的類型。mybatismysql的驅動原來的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-apitomcat中已經提供了,我們只需要的是編譯期提供而已。總結說來,在POM中,<dependency>中還引入了<scope>,它主要管理依賴的部署。大致有compileprovidedruntimetestsystem等幾個。

  • 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源碼了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章