MyBatis —— 调试环境搭建

MyBatis  —— 调试环境搭建

1. 依赖工具

  • Maven
  • Git
  • JDK
  • IntelliJ IDEA

2. 源码拉取

从官方仓库 https://github.com/mybatis/mybatis-3 Fork 出属于自己的仓库。为什么要 Fork ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。

使用 IntelliJ IDEA 从 Fork 出来的仓库拉取代码。

本文使用的 MyBatis 版本为 3.5.0-SNAPSHOT 。

3. 调试

MyBatis 想要调试,非常方便,只需要打开 org.apache.ibatis.autoconstructor.AutoConstructorTest 单元测试类,任意一个单元测试方法,右键,开始调试即可。

当然,考虑到让大家更好的理解 AutoConstructorTest 这个类,下面,我们还是详细解析下。AutoConstructorTest 所在在 autoconstructor 包下,整体结构如下:

4. mybatis-config.xml

mybatis-config.xml ,MyBatis 配置文件。XML 如下:

<!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- autoMappingBehavior should be set in each test case -->

    <environments default="development">        <environment id="development">            <!-- 配置事务管理 -->            <transactionManager type="JDBC">                <property name="" value=""/>            </transactionManager>            <!-- 配置数据源  -->            <dataSource type="UNPOOLED">                <property name="driver" value="org.hsqldb.jdbcDriver"/>                <property name="url" value="jdbc:hsqldb:mem:automapping"/>                <property name="username" value="sa"/>            </dataSource>        </environment>    </environments>

    <!-- 扫描 Mapper 文件  -->    <mappers>        <mapper resource="org/apache/ibatis/autoconstructor/AutoConstructorMapper.xml"/>    </mappers>

</configuration>
  • 在 <environments /> 标签中,配置了事务管理和数据源。考虑到减少外部依赖,所以使用了 HSQLDB 。
  • 在 <mappers /> 标签中,配置了需要扫描的 Mapper 文件。目前,仅仅扫描 AutoConstructorMapper.xml 文件。

5. AutoConstructorMapper.xml

AutoConstructorMapper.xml ,Mapper 文件。代码如下:

<!DOCTYPE mapper    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.apache.ibatis.autoconstructor.AutoConstructorMapper"></mapper>
  • 对应的接口为 org.apache.ibatis.autoconstructor.AutoConstructorMapper 。

5.1 AutoConstructorMapper

public interface AutoConstructorMapper {

    // ========== PrimitiveSubject ==========

    @Select("SELECT * FROM subject WHERE id = #{id}")    PrimitiveSubject getSubject(final int id);    @Select("SELECT * FROM subject")    List<PrimitiveSubject> getSubjects();

    // ========== AnnotatedSubject ==========

    @Select("SELECT * FROM subject")    List<AnnotatedSubject> getAnnotatedSubjects();

    // ========== BadSubject ==========

    @Select("SELECT * FROM subject")    List<BadSubject> getBadSubjects();

    // ========== ExtensiveSubject ==========

    @Select("SELECT * FROM extensive_subject")    List<ExtensiveSubject> getExtensiveSubject();

}
  • 使用注解的方法,编写 SQL 。

6. CreateDB.sql

CreateDB.sql 文件,用于单元测试里,初始化数据库的数据。如下:

DROP TABLE subjectIF EXISTS;

DROP TABLE extensive_subjectIF EXISTS;

CREATE TABLE subject (  id     INT NOT NULL,  name   VARCHAR(20),  age    INT NOT NULL,  height INT,  weight INT,  active BIT,  dt     TIMESTAMP);

CREATE TABLE extensive_subject (  aByte      TINYINT,  aShort     SMALLINT,  aChar      CHAR,  anInt      INT,  aLong      BIGINT,  aFloat     FLOAT,  aDouble    DOUBLE,  aBoolean   BIT,  aString    VARCHAR(255),  anEnum     VARCHAR(50),  aClob      LONGVARCHAR,  aBlob      LONGVARBINARY,  aTimestamp TIMESTAMP);

INSERT INTO subject VALUES  (1, ‘a‘, 10, 100, 45, 1, CURRENT_TIMESTAMP),  (2, ‘b‘, 10, NULL, 45, 1, CURRENT_TIMESTAMP),  (2, ‘c‘, 10, NULL, NULL, 0, CURRENT_TIMESTAMP);

INSERT INTO extensive_subjectVALUES  (1, 1, ‘a‘, 1, 1, 1, 1.0, 1, ‘a‘, ‘AVALUE‘, ‘ACLOB‘, ‘aaaaaabbbbbb‘, CURRENT_TIMESTAMP),  (2, 2, ‘b‘, 2, 2, 2, 2.0, 2, ‘b‘, ‘BVALUE‘, ‘BCLOB‘, ‘010101010101‘, CURRENT_TIMESTAMP),  (3, 3, ‘c‘, 3, 3, 3, 3.0, 3, ‘c‘, ‘CVALUE‘, ‘CCLOB‘, ‘777d010078da‘, CURRENT_TIMESTAMP);
  • 创建了 subject 表,并初始化三条数据。
  • 创建了 extensive_subject 表,并初始化三条数据。

7. POJO

在 AutoConstructorMapper 中,我们可以看到有四个 POJO 类。但是,从 CreateDB.sql 中,实际只有两个表。这个是为什么呢?继续往下看噢。

7.1 AnnotatedSubject

package org.apache.ibatis.autoconstructor;

import org.apache.ibatis.annotations.AutomapConstructor;

public class AnnotatedSubject {

    private final int id;    private final String name;    private final int age;    private final int height;    private final int weight;

    public AnnotatedSubject(final int id, final String name, final int age, final int height, final int weight) {        this.id = id;        this.name = name;        this.age = age;        this.height = height;        this.weight = weight;    }

    @AutomapConstructor    public AnnotatedSubject(final int id, final String name, final int age, final Integer height, final Integer weight) {        this.id = id;        this.name = name;        this.age = age;        this.height = height == null ? 0 : height;        this.weight = weight == null ? 0 : weight;    }

}
  • 对应 subject 表。
  • @AutomapConstructor 注解,表示 MyBatis 查询后,在创建 AnnotatedSubject 对象,使用该构造方法。

7.1.1 PrimitiveSubject

package org.apache.ibatis.autoconstructor;

import java.util.Date;

public class PrimitiveSubject {

    private final int id;    private final String name;    private final int age;    private final int height;    private final int weight;    private final boolean active;    private final Date dt;

    public PrimitiveSubject(final int id, final String name, final int age, final int height, final int weight, final boolean active, final Date dt) {        this.id = id;        this.name = name;        this.age = age;        this.height = height;        this.weight = weight;        this.active = active;        this.dt = dt;    }

}
  • 对应的也是 subject 表。
  • 和 AnnotatedSubject 不同,在其构造方法上,weight 和 height 方法参数的类型是 int ,而不是 Integer 。那么,如果 subject 表中的记录,这两个字段为 NULL 时,会创建 PrimitiveSubject 对象报错。

7.1.2 BadSubject

package org.apache.ibatis.autoconstructor;

public class BadSubject {

    private final int id;    private final String name;    private final int age;    private final Height height;    private final Double weight;

    public BadSubject(final int id, final String name, final int age, final Height height, final Double weight) {        this.id = id;        this.name = name;        this.age = age;        this.height = height;        this.weight = weight == null ? 0 : weight;    }

    private class Height {

    }

}
  • 对应的也是 subject 表。
  • 和 AnnotatedSubject 不同,在其构造方法上,height 方法参数的类型是 Height ,而不是 Integer 。因为 MyBatis 无法识别 Height 类,所以会创建 BadSubject 对象报错。

7.2 ExtensiveSubject

package org.apache.ibatis.autoconstructor;

public class ExtensiveSubject {    private final byte aByte;    private final short aShort;    private final char aChar;    private final int anInt;    private final long aLong;    private final float aFloat;    private final double aDouble;    private final boolean aBoolean;    private final String aString;

    // enum types    private final TestEnum anEnum;

    // array types

    // string to lob types:    private final String aClob;    private final String aBlob;

    public ExtensiveSubject(final byte aByte,                            final short aShort,                            final char aChar,                            final int anInt,                            final long aLong,                            final float aFloat,                            final double aDouble,                            final boolean aBoolean,                            final String aString,                            final TestEnum anEnum,                            final String aClob,                            final String aBlob) {        this.aByte = aByte;        this.aShort = aShort;        this.aChar = aChar;        this.anInt = anInt;        this.aLong = aLong;        this.aFloat = aFloat;        this.aDouble = aDouble;        this.aBoolean = aBoolean;        this.aString = aString;        this.anEnum = anEnum;        this.aClob = aClob;        this.aBlob = aBlob;    }

    public enum TestEnum {        AVALUE, BVALUE, CVALUE;    }

}
  • 对应的也是 extensive_subject 表。
  • 这是个复杂对象,基本涵盖了各种类型的数据。

8. AutoConstructorTest

org.apache.ibatis.autoconstructor.AutoConstructorTest ,单元测试类。

8.1 setUp

private static SqlSessionFactory sqlSessionFactory;

@BeforeClasspublic static void setUp() throws Exception {    // create a SqlSessionFactory    // 创建 SqlSessionFactory 对象,基于 mybatis-config.xml 配置文件。    try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/autoconstructor/mybatis-config.xml")) {        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);    }

    // populate in-memory database    // 初始化数据到内存数据库,基于 CreateDB.sql SQL 文件。    BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),            "org/apache/ibatis/autoconstructor/CreateDB.sql");}
  • 创建 SqlSessionFactory 对象,基于 mybatis-config.xml 配置文件。
  • 初始化数据到内存数据库,基于 CreateDB.sql SQL 文件。

原文地址:https://www.cnblogs.com/siye1989/p/11619153.html

时间: 2024-10-13 17:01:13

MyBatis —— 调试环境搭建的相关文章

EAS客户端调试环境搭建

客户端调试环境搭建说明 适用场景:在现场跟踪问题或者在研发内部跟踪定位测试环境的问题时,开发人员需要快速搭建一个可供调试的环境以供分析问题,以下说明可供开发人员在需要时使用,注意该方式只支持客户端调试,服务端调试配置方式类似(链接远程jvm调试端口即可),但由于服务器不能随便启动停止,在现场应用客户端调试更为普遍一些. 环境要求 在进行以下工作前需要安装一个eclipse反编译插件,可以从网上下载. 安装完毕后注意配置以下参数设置: 详细配置 安装完毕接下来按照以下步骤配置环境即可 新建一个ja

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以只能在Eclipse 搭建Solr的环境,折腾了一小时终于完成了. 1. JDPA远程调试 搭建换完成Solr环境后,对${TOMCAT_HOME}/bin/startup.sh 最后一行进行修改,如下所示: 1 set JPDA_ADDRESS=7070 2 exec "$PRGDIR"

MyBatis的环境搭建

第一节 MyBatis的环境搭建 2016年3月1日 星期二 13:01 1.找到所需要的Jar 在这个里面需要注意的是对所有的jar要进行 Bulid path操作 2.根据帮助文档完成 www.github.com 找找到对应Mybatis的官方帮助文档 搭建的过程如下: A.引用包 B.需要建立核心配置文件,文档类型 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http:

MyBatis基本环境搭建与MyBatisUtil

本文将介绍MyBatis的环境搭建,本例使用的MyBatis的版本为mybatis-3.2.8.jar.下载地址为:http://download.csdn.net/detail/ma_hoking/8380541.本例使用的数据库为MySQL数据.具体的安装操作请参考:http://blog.csdn.net/mahoking/article/details/42921511. [转载使用,请注明出处:http://blog.csdn.net/mahoking] 首先创建Java项目MyBat

HI3518E平台ISP调试环境搭建

海思的SDK提供了ISP调试的相关工具,降低了IPC的ISP调试的难度.初次搭建ISP调试环境,记录一下. SDK版本:Hi3518_MPP_V1.0.A.0 硬件平台:HI3518E_OV9732 工具包:PQ_TOOL     (Hi3518E_V100R001C01SPC0A0\01.software\pc\PQ_TOOL) 文件说明:Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz 设备端工具 : PQTools_V3.7.5.zip PC端工具 环境搭建步骤: (1

mybatis学习:mybatis的环境搭建

一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想实现了结果集的封装 ORM: Object  Relational  Mappging 对象关系映射 简单来说: 就是把数据库表和实体类及实体类的属性对应起来 让我们可以操作实体类就实现操作数据库表 二.mybatis的环境搭建 第一步:创建maven工程并导入坐标 1 <packaging>ja

rocketmq那些事儿之本地调试环境搭建

上一篇文章中我们已经介绍过rocketmq的集群环境搭建,然而在源码的学习中我们还需要进行本地的调试和问题的定位查找,毕竟还是在本地方便些,今天就说一说如何进行源码的本地调试 下载编译 对于rocketmq源码部分的学习,我们当然要先去官网将源码下载到本地,这里笔者使用的是4.5.2版本,从github上官网上下载: https://github.com/apache/rocketmq rocketmq版本:4.5.2 使用clean install编译,这里最好跳过test,要不太慢了 编译完

VT 调试环境搭建

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html VT 调试环境搭建 调试方法: VmWare + win7x64 + windbg + IDA64位 一.虚拟机配置 1.打开win7的虚拟机文件,找到一个 .vmx 文件,在后面加上下面几句话,之后保存,启动虚拟机. debugStub.listen.guest64.remote = "TRUE" monitor.debugOnStartGuest64

hbase本地调试环境搭建

1,前言 想要深入的了解hbase,看hbase源码是必须的.以下描述了搭建hbase本地调试环境的经历 2,安装步骤 2.1,启动hbase 1,安装java和IDE IntelliJ,下载源码等.步骤这里不再描述. 2,从HMaster以standalone模式启动hbase,配置如下: 主要是程序参数start,VM options(-Dlog4j.configuration=file:/Users/aaa/work/dev/hbase/hbase-1.1.3/conf/log4j.pro