sanguibatis:我的简易版 MyBatis 从源码到发布

sanguibatis:一个轻量级 MyBatis 仿制框架

为了深入理解 MyBatis 的运行原理,我手写了一个简易版的 ORM 框架——sanguibatis。它实现了最基本的配置、数据源、事务管理、SQLSessionFactory 和 Mapper 映射,核心功能包括 selectOne()insert()。下面带你快速上手。


一、下载 JAR

最新的 sanguibatis-1.0-SNAPSHOT.jar 可在 GitHub Release 下载:

https://github.com/WuSangui571/sanguibatis

下载jar包后,将其放到项目的 lib/ 目录,或安装到本地 Maven 仓库:

# 安装到本地仓库
mvn install:install-file \
 -Dfile=path/to/sanguibatis-1.0-SNAPSHOT.jar \
 -DgroupId=com.sangui \
 -DartifactId=sanguibatis \
 -Dversion=1.0-SNAPSHOT \
 -Dpackaging=jar

然后在 pom.xml 中添加依赖:

<dependency>
 <groupId>com.sanguigroupId>
 <artifactId>sanguibatisartifactId>
 <version>1.0-SNAPSHOTversion>
dependency>

二、框架结构一览

主要包和类:

META-INF/MANIFEST.MF
sanguibatis-config.xml     # 默认示例配置
sqlMapper.xml               # 默认示例 Mapper

com.sangui.pojo.Car         # 示例实体
com.sangui.pojo.TestEntity # 示例实体

com.sangui.sanguibatis.core.Const
com.sangui.sanguibatis.core.datasource.impl.UnPooledDataSource
com.sangui.sanguibatis.core.datasource.impl.PooledDataSource
com.sangui.sanguibatis.core.datasource.impl.JndiDataSource
com.sangui.sanguibatis.core.pojo.MappedStatement
com.sangui.sanguibatis.core.sqlsession.SqlSession
com.sangui.sanguibatis.core.sqlsession.SqlSessionFactory
com.sangui.sanguibatis.core.sqlsession.SqlSessionFactoryBuilder
com.sangui.sanguibatis.core.transaction.impl.JdbcTransaction
com.sangui.sanguibatis.core.transaction.impl.ManagedTransaction
com.sangui.sanguibatis.utils.Resources
  • 数据源实现UnPooledDataSourcePooledDataSourceJndiDataSource(仅 UnPooledDataSource 经充分测试)。

  • 事务管理JdbcTransaction(支持 JDBC 事务),ManagedTransaction(留待完善)。

  • 核心流程SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession,配合 MappedStatement 完成 SQL 执行。


三、配置核心

在项目类路径(src/main/resources)下,创建 sanguibatis-config.xml

 version="1.0" encoding="UTF-8"?>
<configuration>
 <environments default="development">
   <environment id="development">
     <transactionManager type="JDBC"/>
     <dataSource type="UNPOOLED">
       <property name="driver"   value="com.mysql.cj.jdbc.Driver"/>
       <property name="url"      value="jdbc:mysql://localhost:3306/xxx"/>
       <property name="username" value="root"/>
       <property name="password" value="xxx"/>
     dataSource>
   environment>
   <environment id="test">
     <transactionManager type="JDBC"/>
     <dataSource type="POOLED">
       <property name="driver"   value="com.mysql.cj.jdbc.Driver"/>
       <property name="url"      value="jdbc:mysql://localhost:3306/xxx"/>
       <property name="username" value="root"/>
       <property name="password" value="xxx"/>
     dataSource>
   environment>
 environments>
 <mappers>
   <mapper resource="sqlMapper.xml"/>
 mappers>
configuration>

然后在同目录下放入 sqlMapper.xml

 version="1.0" encoding="UTF-8"?>
<mapper namespace="Test">
 <insert id="insertOne">
  INSERT INTO t_test(id, name, age)
  VALUES (#{id}, #{name}, #{age})
 insert>
 <select id="selectOne" resultType="com.sangui.pojo.TestEntity">
  SELECT * FROM t_test WHERE id = #{id}
 select>
mapper>

四、代码示例

// 1. 构建 SqlSessionFactory
InputStream config = Resources.getResourceAsStream("sanguibatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);

// 2. 执行查询
try (SqlSession session = factory.openSession()) {
   TestEntity entity = session.selectOne("Test.selectOne", "1004");
   System.out.println("查询结果 → " + entity);
}

// 3. 执行插入
try (SqlSession session = factory.openSession()) {
   TestEntity newEntity = new TestEntity("1007", "yes", "21");
   int rows = session.insert("Test.insertOne", newEntity);
   System.out.printf("影响行数 → %d%n", rows);
   session.commit();
}

也可以像下面这样查看 SqlSessionFactory 对象:

System.out.println(factory);

五、使用限制 & 未来规划

  • 字段类型:当前仅推荐所有表字段使用 VARCHAR,否则可能映射异常。

  • 已实现方法selectOne()insert()

  • 未实现/待完善

    • 更多操作(update()delete()selectList() 等);

    • 完善 ManagedTransaction

    • 支持多种类型转换和复杂映射;

    • JNDI 数据源的测试与优化;

    • 性能优化、日志功能等。


总结

通过把自己的代码打包成一个可发布的 JAR,并编写完整的配置与示例,你不仅加深了对 MyBatis 核心模块的理解,也练习了 Java 库的发布流程。欢迎大家下载试用,对 sanguibatis 提出宝贵建议!

— 2025-05-18,三桂

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录