Mybatis源码的下载,搭建以及阅读源码的姿势

源码下载

mybatis的源码是在github上开源的,所以直接从github上搜索下载即可。
在这里插入图片描述
如上图,第一个就是mybatis3的源码项目,下面几个也是项目中常用的依赖项目,分页插件pagehelper,SSM项目需要引入的依赖mybatis-spring,mybatis-plus项目等。

当前最新版本是v3.5.5,可以选择合适的版本下载。我本地选择的是v3.5.4版本,小版本之间没有太大差异,点击zip包,下载即可。
在这里插入图片描述

本地环境搭建

此项目是maven项目,下载的zip包解压后,直接用自己的IDE打开,本人用的是IDEA,打开后会自动下载一些依赖,等待一会就会编译完成,目录结构如下图。
在这里插入图片描述

准备阅读源码

在测试test下创建自己的包,编写几个demo测试类,即可开始执行程序。

项目目录结构如下。
在这里插入图片描述

mybatis-config.xml
我最开始用的是xml配置的方式,所以最基本的要有一个config配置文件,此文件后期会被读进内存,存储到Configuration对象中。

<?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>
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
    <property name="username" value="root"/>
    <property name="password" value="root123456"/>
  </properties>

  <!-- 自定义别名 -->
  <typeAliases>
    <typeAlias type="com.binghuazheng.mybatis.xmlconfig.po.UserInfo" alias="userInfo"/>
  </typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mybatis/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

必不可少的是environments节点内容以及mappers节点内容,分别指定连接的数据源以及对应的mapper。其它的比如typeHanler,typeAliases等不重要,看自己是否需要用。properties指定属性变量,可以在上下文配置中使用。

UserMapper.xml
这个就是咱们日常写sql的文件。

<?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.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper">

  <!---->
  <cache/>

  <select id="getSingleUserInfo" resultType="userInfo" >
    SELECT * FROM user_info WHERE id = #{id}
  </select>

  <select id="getAllUserInfo" resultType="userInfo">
    SELECT * FROM user_info
  </select>

  <select id="getUserInfoByDate" resultType="userInfo">
    SELECT * FROM user_info WHERE birthday > #{localDate}
  </select>

  <select id="getUserInfoByLessDate" resultType="userInfo">
    SELECT
      *
    FROM user_info
    <where>
      <if test='localDate != null'>
        birthday <![CDATA[<]]> #{localDate}
      </if>
    </where>
  </select>

</mapper>

log4j.properties
读源码过程中,日志信息非常重要,需要配置日志文件,mybatis项目中自带了log4j.properties文件,将此文件粘到测试resource下即可。

# 全局日志配置
log4j.rootLogger=TRACE, stdout
# MyBatis 日志配置
log4j.logger.org.apache.ibatis=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

配置文件就全部完毕了。下面就是java代码的编写。

UserInfo.java
创建一个po类,用于持久化数据的对象。

package com.binghuazheng.mybatis.xmlconfig.po;

import lombok.Data;

import java.io.Serializable;
import java.time.LocalDate;

/**
 * @ClassName UserInfo
 * @Description TODO
 * @Author Administrator
 * @Date 2020/7/15 21:49
 * @Version 1.0
 */
@Data
public class UserInfo implements Serializable {

  private Long id;

  private String name;

  private LocalDate birthday;

  private String deleteFlag;

}

UserInfoMapper.java
然后就是接口与UserMapper.xml对应上。

package com.binghuazheng.mybatis.xmlconfig.mapper;


import com.binghuazheng.mybatis.xmlconfig.po.UserInfo;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

public interface UserInfoMapper {

  UserInfo getSingleUserInfo(@Param("id") Long id, @Param("name") String name);

  List<UserInfo> getAllUserInfo();

  List<UserInfo> getUserInfoByDate(@Param("localDate") LocalDate date);

  List<UserInfo> getUserInfoByLessDate(@Param("localDate") LocalDate date);
}

MybatisTest.java
最后就是测试类。

package com.binghuazheng.mybatis.xmlconfig.test;

import com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper;
import lombok.extern.slf4j.Slf4j;
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.time.LocalDate;

/**
 * @ClassName MybatisTest
 * @Description TODO
 * @Author Administrator
 * @Date 2020/7/15 22:00
 * @Version 1.0
 */
@Slf4j
public class MybatisTest {

  public static void main(String[] args) throws IOException {
    // mybatis加载
    init();
  }

  private static void init() throws IOException {
    SqlSessionFactory sqlSessionFactory = createSqlSessionFactory();
    // 创建一个默认DefaultSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 通过JDK的动态代理创建一个代理类。
    UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);
    userInfoMapper.getUserInfoByLessDate(LocalDate.now());
  }
  
  /**
   * 获取SqlSessionFactory
   *
   * @return
   */
  private static SqlSessionFactory createSqlSessionFactory() throws IOException {
    String resource = "mybatis/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    return new SqlSessionFactoryBuilder().build(inputStream);
  }
}

SqlSessionFactoryBuilder对象主要用于读取配置文件,解析配置文件和mapper文件的每个节点,然后创建SqlSessionFactory对象。
SqlSessionFactory是一个工厂类,主要用于创建SqlSession对象。
UserInfoMapper对象是个代理类对象,通过sqlSession获得。然后就可以通过此代理对象执行mybatis流程查询sql。

执行test文件试试。

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2018.2.6\lib\idea_rt.jar=4193:D:\IntelliJ IDEA 2018.2.6\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;H:\IdeaProjects\mybatis-training\mybatis-3-mybatis-3.5.4\target\test-classes;H:\IdeaProjects\mybatis-training\mybatis-3-mybatis-3.5.4\target\classes;C:\Users\Administrator\.m2\repository\ognl\ognl\3.2.12\ognl-3.2.12.jar;C:\Users\Administrator\.m2\repository\org\javassist\javassist\3.26.0-GA\javassist-3.26.0-GA.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.30\slf4j-log4j12-1.7.30.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-core\2.13.0\log4j-core-2.13.0.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.0\log4j-api-2.13.0.jar;C:\Users\Administrator\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\Administrator\.m2\repository\cglib\cglib\3.3.0\cglib-3.3.0.jar;C:\Users\Administrator\.m2\repository\org\ow2\asm\asm\7.1\asm-7.1.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.6.0\junit-jupiter-engine-5.6.0.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.6.0\junit-platform-engine-1.6.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.6.0\junit-platform-commons-1.6.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.6.0\junit-jupiter-api-5.6.0.jar;C:\Users\Administrator\.m2\repository\org\hsqldb\hsqldb\2.5.0\hsqldb-2.5.0.jar;C:\Users\Administrator\.m2\repository\org\apache\derby\derby\10.14.2.0\derby-10.14.2.0.jar;C:\Users\Administrator\.m2\repository\org\mockito\mockito-core\3.2.4\mockito-core-3.2.4.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy\1.10.5\byte-buddy-1.10.5.jar;C:\Users\Administrator\.m2\repository\net\bytebuddy\byte-buddy-agent\1.10.5\byte-buddy-agent-1.10.5.jar;C:\Users\Administrator\.m2\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar;C:\Users\Administrator\.m2\repository\org\mockito\mockito-junit-jupiter\3.2.4\mockito-junit-jupiter-3.2.4.jar;C:\Users\Administrator\.m2\repository\org\apache\velocity\velocity-engine-core\2.1\velocity-engine-core-2.1.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;C:\Users\Administrator\.m2\repository\org\postgresql\postgresql\42.2.9\postgresql-42.2.9.jar;C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\8.0.19\mysql-connector-java-8.0.19.jar;C:\Users\Administrator\.m2\repository\com\google\protobuf\protobuf-java\3.6.1\protobuf-java-3.6.1.jar;C:\Users\Administrator\.m2\repository\org\assertj\assertj-core\3.15.0\assertj-core-3.15.0.jar;C:\Users\Administrator\.m2\repository\eu\codearte\catch-exception\catch-exception\2.0\catch-exception-2.0.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\junit-jupiter\1.12.5\junit-jupiter-1.12.5.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\testcontainers\1.12.5\testcontainers-1.12.5.jar;C:\Users\Administrator\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Administrator\.m2\repository\org\jetbrains\annotations\17.0.0\annotations-17.0.0.jar;C:\Users\Administrator\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Administrator\.m2\repository\org\apache\commons\commons-compress\1.19\commons-compress-1.19.jar;C:\Users\Administrator\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\Administrator\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\rnorth\duct-tape\duct-tape\1.0.8\duct-tape-1.0.8.jar;C:\Users\Administrator\.m2\repository\org\rnorth\visible-assertions\visible-assertions\2.1.2\visible-assertions-2.1.2.jar;C:\Users\Administrator\.m2\repository\org\rnorth\tcp-unix-socket-proxy\1.0.2\tcp-unix-socket-proxy-1.0.2.jar;C:\Users\Administrator\.m2\repository\com\kohlschutter\junixsocket\junixsocket-native-common\2.0.4\junixsocket-native-common-2.0.4.jar;C:\Users\Administrator\.m2\repository\org\scijava\native-lib-loader\2.0.2\native-lib-loader-2.0.2.jar;C:\Users\Administrator\.m2\repository\com\kohlschutter\junixsocket\junixsocket-common\2.0.4\junixsocket-common-2.0.4.jar;C:\Users\Administrator\.m2\repository\net\java\dev\jna\jna-platform\5.5.0\jna-platform-5.5.0.jar;C:\Users\Administrator\.m2\repository\net\java\dev\jna\jna\5.5.0\jna-5.5.0.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\postgresql\1.12.5\postgresql-1.12.5.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\jdbc\1.12.5\jdbc-1.12.5.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\database-commons\1.12.5\database-commons-1.12.5.jar;C:\Users\Administrator\.m2\repository\org\testcontainers\mysql\1.12.5\mysql-1.12.5.jar;C:\Users\Administrator\.m2\repository\org\projectlombok\lombok\1.18.10\lombok-1.18.10.jar" com.binghuazheng.mybatis.xmlconfig.test.MybatisTest
2020-08-11 22:39:21,996 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2020-08-11 22:39:22,090 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2020-08-11 22:39:22,090 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2020-08-11 22:39:22,090 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2020-08-11 22:39:22,090 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2020-08-11 22:39:22,682 [main] DEBUG com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper - Cache Hit Ratio [com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper]: 0.0
2020-08-11 22:39:22,706 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
2020-08-11 22:39:22,940 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1024429571.
2020-08-11 22:39:22,941 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d0f8e03]
2020-08-11 22:39:22,948 [main] DEBUG com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - ==>  Preparing: SELECT * FROM user_info WHERE birthday < ? 
2020-08-11 22:39:22,992 [main] DEBUG com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - ==> Parameters: 2020-08-11(LocalDate)
2020-08-11 22:39:23,032 [main] TRACE com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - <==    Columns: id, name, birthday, deleteFlag
2020-08-11 22:39:23,035 [main] TRACE com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - <==        Row: 1, 张三, 2020-07-11, 0
2020-08-11 22:39:23,041 [main] TRACE com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - <==        Row: 2, 李四, 2020-07-10, 0
2020-08-11 22:39:23,042 [main] DEBUG com.binghuazheng.mybatis.xmlconfig.mapper.UserInfoMapper.getUserInfoByLessDate - <==      Total: 2

Process finished with exit code 0

至此环境就搭建完成了,准备阅读源码吧。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值