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源码了!

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