MyBatis源码实现之环境准备

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39723544/article/details/84026023

一、引言

  • 作为一名Java高级开发人员,阅读源码的功底是其重要的基础技能。除了Spring系列的源码之外,就是MyBatis的源码阅读,好了,废话不多说直接开干。
  • 声明:这里我使用的3.4.6版本。不同版本之间代码略有差异

二、搭建

1.创建源码阅读项目(Maven方式)

1.1 以Maven方式创建项目

在这里我使用的idea创建的(过程略)。效果如下:
在这里插入图片描述

2.导入MyBatis相关源码

2.1 下载官方源代码

2.2 将源代码导入项目中

  • 将解压后的src\main\java里面的:从org开始,把源文件拷贝到第一步中创建的项目中(以java为根文件),拷贝完毕后如下:
    在这里插入图片描述
  • 将mybatis-3-mybatis-3.4.6源码包中pom.xml中的依赖拷贝到源码项目的pom.xml中去,并添加上MySql连接的相关依赖。拷贝后代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.gyoomi</groupId>
    <artifactId>Learning-MyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.1.16</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.22.0-GA</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <optional>true</optional>
        </dependency>
        <!-- Don't upgrade to 2.4+ until mybatis switches to java 7 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
            <optional>true</optional>
        </dependency>

        <!-- Test dependencies -->
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>4.12.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.3.5</version> <!-- Version 2.4.0 required jdk8 -->
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.12.1.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.12.0</version>
            <scope>test</scope>
        </dependency>
        <!-- Do not go to 2.x until we are on jdk7 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            <version>1.0.1.Final</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
            <scope>test</scope>
        </dependency>
        <!-- postgresql driver is required to run the refcursor tests -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.1.4.jre6</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>1.7.1</version> <!-- Stay on 1.7.1 to support Java 6 -->
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>eu.codearte.catch-exception</groupId>
            <artifactId>catch-exception</artifactId>
            <version>1.4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ru.yandex.qatools.embed</groupId>
            <artifactId>postgresql-embedded</artifactId>
            <version>2.5</version>
            <scope>test</scope>
        </dependency>

        <!-- mysql connector jar-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3.创建测试用例

3.1 创建User表

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `deptment` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

3.2 创建UserMapper接口和实现类

  • UserMapper接口
public interface UserMapper {
	
    User save(User user);

}

  • UserMapper接口实现类
public class UserMapperImpl implements UserMapper {

    private static final String NAME_SPACE = "UserMapper.";
    private static SqlSessionFactory ssf;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            ssf = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public User save(User user) {
        SqlSession sqlSession = ssf.openSession();
        int rows = sqlSession.insert(NAME_SPACE + "save", user);
        sqlSession.commit();
        if (rows > 0) {
            return user;
        } else {
            return null;
        }
    }
}

3.3 创建MyBatis-config.xml和UserMapper.xml文件

MyBatis-config.xml:

<?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>

    <settings>
        <setting name="cacheEnabled" value="true" />
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="useGeneratedKeys" value="true"/>
    </settings>

    <typeAliases>
        <typeAlias type="com.gyoomi.entity.User" alias="User"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

UserMapper.xml:

<?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="UserMapper">

    <insert id="save" parameterType="User">
        <selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
            SELECT LAST_INSERT_ID();
        </selectKey>
        INSERT INTO t_user
            (id, user_name, password, deptment, phone, email, status, create_date, remark)
        VALUES
            (null, #{userName}, #{password}, #{deptment}, #{phone}, #{email}, #{status}, #{createDate}, #{remark})
    </insert>
</mapper>

3.4 创建测试的Main方法

创建Main.java(其实这里是不规范的,一般是要写JUnit单元测试的。)

public class Main {
    public static void main(String[] args) {
        UserMapper userMapper = new UserMapperImpl();
        User user = new User();
        user.setPassword("123");
        user.setCreateDate(new Date());
        user.setDeptment("研发部门");
        user.setEmail("[email protected]");
        user.setStatus(1);
        user.setUserName("张三");
        user.setPhone("13888888888");
        user.setRemark("系统默认用户");
        User userToReturn = userMapper.save(user);
        System.out.println(userToReturn);
    }
}

4.测试环境

执行完上述3步后,整体的代码结构如下:
在这里插入图片描述
执行Main方法后,打开数据看到t_user表新增了一条记录。
在这里插入图片描述
支持MyBatis的源码阅读的环境搭建并测试完毕。下面就让我们开始畅快地阅读源码吧!

Github地址MyBatis源码

猜你喜欢

转载自blog.csdn.net/weixin_39723544/article/details/84026023