MyBatis源码-手写测试类-阅读

本文介绍了如何准备MyBatis源码,使用Idea搭建聚合项目,逐步编写测试代码,包括创建数据库、实体类、Mapper接口等,并解决配置文件和依赖问题,以实现源码调试和阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:准备-下载MyBatis源码:

https://github.com/tuguangquan/mybatis
https://github.com/mybatis/parent

2:idea搭建聚合项目

		mybatis继承parent项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导入两个项目,等待两个项目的pom中的依赖加载完成。

3:写测试代码

在这里插入图片描述

创建数据库mybatis与数据库表role

-- ----------------------------
-- Table structure for role
-- ----------------------------
create database mybatis;
use mybayis;
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` int(11) DEFAULT NULL,
  `role_name` varchar(255) DEFAULT NULL,
  `note` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES ('1', '张三', '张三的备注');

数据库表role对应的java实体类role

/*
 * @author gethin
 * 角色的实体类
 */
public class Role {
    private long id;
    private String roleName;
    private String note;
    ...
    getter setter省略
}

java RoleMapper接口

/*
 * @author gethin
 */
public interface RoleMapper {
    public Role getRole(Long id);
    public Role findRole(String roleName);
    public int deleteRole(Long id);
    public int insertRole(Role role);
}

RoleMapper

<?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.gethin.mapper.RoleMapper">
    <resultMap type="role" id="roleMap">
        <id column="id" property="id" javaType="long" jdbcType="BIGINT" />
        <result column="role_name" property="roleName" javaType="string"
            jdbcType="VARCHAR" />
        <result column="note" property="note"
            typeHandler="com.gethin.handler.MyStringHandler" />
    </resultMap>
    <select id="getRole" parameterType="long" resultMap="roleMap">
        select
        id,role_name as roleName,note from role where id=#{id}
    </select>
    <select id="findRole" parameterType="long" resultMap="roleMap">
        select
        id,role_name,note from role where role_name like CONCAT('%',#{roleName
        javaType=string,
        jdbcType=VARCHAR,typeHandler=com.gethin.handler.MyStringHandler},'%')
    </select>
    <insert id="insertRole" parameterType="role">
        insert into
        role(role_name,note) value(#{roleName},#{note})
    </insert>
    <delete id="deleteRole" parameterType="long">
        delete from role where
        id=#{id}
    </delete>
</mapper>

MyStringHandler

@MappedTypes({String.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringHandler implements TypeHandler<String> {
    private Logger log=Logger.getLogger(MyStringHandler.class);
    
    @Override
    public String getResult(ResultSet rs, String colName) throws SQLException {
        log.info("使用我的TypeHandler,ResultSet列名获取字符串");
        return rs.getString(colName);
    }

    @Override
    public String getResult(ResultSet rs, int index) throws SQLException {
        log.info("使用我的TypeHandler,ResultSet下标获取字符串");
        return rs.getString(index);
    }

    @Override
    public String getResult(CallableStatement cs, int index) throws SQLException {
        log.info("使用我的TypeHandler,CallableStatement下标获取字符串");
        return cs.getString(index);
    }

    @Override
    public void setParameter(PreparedStatement ps, int index, String value, JdbcType arg3) throws SQLException {
        log.info("使用我的TypeHandler");
        ps.setString(index, value);
    }

}

log4j.properties

log4j.rootLogger=DEBUG,stdout
log4j.logger.org.mybatis=DUBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = %5p %d %C:%m%n

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="lazyLoadingEnabled" value="true"/>
    <!-- <setting name="aggressiveLazyLoading" value="false"/> -->
    </settings>
    <typeAliases>
    <typeAlias alias="role" type="com.gethin.po.Role"/>
    </typeAliases>
    <typeHandlers>
     <typeHandler jdbcType="VARCHAR" javaType="string" handler="com.gethin.handler.MyStringHandler"/>
    </typeHandlers>
    <!-- 定义数据库的信息,默认使用development数据库构建环境 -->
    <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/mybatis" />
                <property name="username" value="dbuser" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <!-- 定义映射器 -->
    <mappers>
        <package name="com.gethin.mapper"/>
    </mappers>
</configuration>

测试题Main

public class Main {
    public static void main(String[] args) {
        String resource="mybatis-config.xml";
        InputStream inputStream=null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory=null;
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=null;
        try {
            sqlSession=sqlSessionFactory.openSession();
            RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
            Role role=roleMapper.getRole(1L);
            System.out.println(role.getId()+":"+role.getRoleName()+":"+role.getNote());
            sqlSession.commit();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            sqlSession.rollback();
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }   
    }
}

通过执行Main类,并设立断点,就可以一步一步进行源码的调试以及阅读了。

4:遇到的问题

java.io.IOException: Could not find resource mybatis.xml 

因为这个配置文件是我在手动建立的包里,需要将这个包定义为资源文件。
在这里插入图片描述

java.lang.ClassNotFoundException: Cannot find class: com.mysql.cj.jdbc.Driver

出现这个文件,首先看自己的mysql的jar包是否导入。
如果不在,则在mybatis中加入这个依赖

<dependency>
    <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.44</version>
 </dependency>

参考:https://www.jianshu.com/p/e739afb8fe31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值