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
数据源实现:
UnPooledDataSource
、PooledDataSource
、JndiDataSource
(仅UnPooledDataSource
经充分测试)。事务管理:
JdbcTransaction
(支持 JDBC 事务),ManagedTransaction
(留待完善)。核心流程:
SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession
,配合MappedStatement
完成 SQL 执行。
三、配置核心
在项目类路径(src/main/resources
)下,创建 sanguibatis-config.xml
:
<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
:
<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 提出宝贵建议!
- 微信
- 赶快加我聊天吧
- 赶快加我聊天吧