Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
一鹿由妳
small-mybatis
提交
652eec22
small-mybatis
项目概览
一鹿由妳
/
small-mybatis
与 Fork 源项目一致
Fork自
小傅哥 / small-mybatis
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
small-mybatis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
652eec22
编写于
5月 05, 2022
作者:
小傅哥
⛹
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
小傅哥,feat:《Mybatis 手撸专栏》第3章:实现映射器的注册和使用
上级
21b987d5
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
386 addition
and
0 deletion
+386
-0
mybatis-step-02/pom.xml
mybatis-step-02/pom.xml
+75
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperProxy.java
...rc/main/java/cn/bugstack/mybatis/binding/MapperProxy.java
+38
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperProxyFactory.java
.../java/cn/bugstack/mybatis/binding/MapperProxyFactory.java
+28
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperRegistry.java
...main/java/cn/bugstack/mybatis/binding/MapperRegistry.java
+59
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/SqlSession.java
...src/main/java/cn/bugstack/mybatis/session/SqlSession.java
+45
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/SqlSessionFactory.java
...n/java/cn/bugstack/mybatis/session/SqlSessionFactory.java
+18
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/defaults/DefaultSqlSession.java
.../bugstack/mybatis/session/defaults/DefaultSqlSession.java
+39
-0
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/defaults/DefaultSqlSessionFactory.java
...ck/mybatis/session/defaults/DefaultSqlSessionFactory.java
+27
-0
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/ApiTest.java
...ep-02/src/test/java/cn/bugstack/mybatis/test/ApiTest.java
+41
-0
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/dao/ISchoolDao.java
...rc/test/java/cn/bugstack/mybatis/test/dao/ISchoolDao.java
+7
-0
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/dao/IUserDao.java
.../src/test/java/cn/bugstack/mybatis/test/dao/IUserDao.java
+9
-0
未找到文件。
mybatis-step-02/pom.xml
0 → 100644
浏览文件 @
652eec22
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
cn.bugstack.mybatis
</groupId>
<artifactId>
mybatis-step-02
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.75
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>
org.dom4j
</groupId>
<artifactId>
dom4j
</artifactId>
<version>
2.1.3
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
<version>
4.7
</version>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.5.0
</version>
</dependency>
<!-- LOGGING begin -->
<dependency>
<groupId>
org.slf4j
</groupId>
<artifactId>
slf4j-api
</artifactId>
<version>
1.7.5
</version>
</dependency>
<dependency>
<groupId>
org.slf4j
</groupId>
<artifactId>
jcl-over-slf4j
</artifactId>
<version>
1.7.5
</version>
</dependency>
<dependency>
<groupId>
ch.qos.logback
</groupId>
<artifactId>
logback-classic
</artifactId>
<version>
1.0.9
</version>
<exclusions>
<exclusion>
<artifactId>
slf4j-api
</artifactId>
<groupId>
org.slf4j
</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- LOGGING end -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-compiler-plugin
</artifactId>
<configuration>
<compilerVersion>
1.8
</compilerVersion>
<source>
1.8
</source>
<target>
1.8
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperProxy.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.binding
;
import
cn.bugstack.mybatis.session.SqlSession
;
import
java.io.Serializable
;
import
java.lang.reflect.InvocationHandler
;
import
java.lang.reflect.Method
;
import
java.util.Map
;
/**
* @author 小傅哥,微信:fustack
* @description 映射器代理类
* @date 2022/3/26
* @github https://github.com/fuzhengwei
* @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
MapperProxy
<
T
>
implements
InvocationHandler
,
Serializable
{
private
static
final
long
serialVersionUID
=
-
6424540398559729838L
;
private
SqlSession
sqlSession
;
private
final
Class
<
T
>
mapperInterface
;
public
MapperProxy
(
SqlSession
sqlSession
,
Class
<
T
>
mapperInterface
)
{
this
.
sqlSession
=
sqlSession
;
this
.
mapperInterface
=
mapperInterface
;
}
@Override
public
Object
invoke
(
Object
proxy
,
Method
method
,
Object
[]
args
)
throws
Throwable
{
if
(
Object
.
class
.
equals
(
method
.
getDeclaringClass
()))
{
return
method
.
invoke
(
this
,
args
);
}
else
{
return
sqlSession
.
selectOne
(
method
.
getName
(),
args
);
}
}
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperProxyFactory.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.binding
;
import
cn.bugstack.mybatis.session.SqlSession
;
import
java.lang.reflect.Proxy
;
/**
* @author 小傅哥,微信:fustack
* @description 映射器代理工厂
* @date 2022/3/26
* @github https://github.com/fuzhengwei/CodeDesignTutorials
* @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
MapperProxyFactory
<
T
>
{
private
final
Class
<
T
>
mapperInterface
;
public
MapperProxyFactory
(
Class
<
T
>
mapperInterface
)
{
this
.
mapperInterface
=
mapperInterface
;
}
@SuppressWarnings
(
"unchecked"
)
public
T
newInstance
(
SqlSession
sqlSession
)
{
final
MapperProxy
<
T
>
mapperProxy
=
new
MapperProxy
<>(
sqlSession
,
mapperInterface
);
return
(
T
)
Proxy
.
newProxyInstance
(
mapperInterface
.
getClassLoader
(),
new
Class
[]{
mapperInterface
},
mapperProxy
);
}
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/binding/MapperRegistry.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.binding
;
import
cn.bugstack.mybatis.session.SqlSession
;
import
cn.hutool.core.lang.ClassScanner
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Set
;
/**
* @author 小傅哥,微信:fustack
* @description 映射器注册机
* @date 2022/04/01
* @github https://github.com/fuzhengwei
* @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
MapperRegistry
{
/**
* 将已添加的映射器代理加入到 HashMap
*/
private
final
Map
<
Class
<?>,
MapperProxyFactory
<?>>
knownMappers
=
new
HashMap
<>();
public
<
T
>
T
getMapper
(
Class
<
T
>
type
,
SqlSession
sqlSession
)
{
final
MapperProxyFactory
<
T
>
mapperProxyFactory
=
(
MapperProxyFactory
<
T
>)
knownMappers
.
get
(
type
);
if
(
mapperProxyFactory
==
null
)
{
throw
new
RuntimeException
(
"Type "
+
type
+
" is not known to the MapperRegistry."
);
}
try
{
return
mapperProxyFactory
.
newInstance
(
sqlSession
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"Error getting mapper instance. Cause: "
+
e
,
e
);
}
}
public
<
T
>
void
addMapper
(
Class
<
T
>
type
)
{
/* Mapper 必须是接口才会注册 */
if
(
type
.
isInterface
())
{
if
(
hasMapper
(
type
))
{
// 如果重复添加了,报错
throw
new
RuntimeException
(
"Type "
+
type
+
" is already known to the MapperRegistry."
);
}
// 注册映射器代理工厂
knownMappers
.
put
(
type
,
new
MapperProxyFactory
<>(
type
));
}
}
public
<
T
>
boolean
hasMapper
(
Class
<
T
>
type
)
{
return
knownMappers
.
containsKey
(
type
);
}
public
void
addMappers
(
String
packageName
)
{
Set
<
Class
<?>>
mapperSet
=
ClassScanner
.
scanPackage
(
packageName
);
for
(
Class
<?>
mapperClass
:
mapperSet
)
{
addMapper
(
mapperClass
);
}
}
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/SqlSession.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.session
;
/**
* @author 小傅哥,微信:fustack
* @description SqlSession 用来执行SQL,获取映射器,管理事务。
* PS:通常情况下,我们在应用程序中使用的Mybatis的API就是这个接口定义的方法。
* @date 2022/04/01
* @github https://github.com/fuzhengwei
* @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
interface
SqlSession
{
/**
* Retrieve a single row mapped from the statement key
* 根据指定的SqlID获取一条记录的封装对象
*
* @param <T> the returned object type 封装之后的对象类型
* @param statement sqlID
* @return Mapped object 封装之后的对象
*/
<
T
>
T
selectOne
(
String
statement
);
/**
* Retrieve a single row mapped from the statement key and parameter.
* 根据指定的SqlID获取一条记录的封装对象,只不过这个方法容许我们可以给sql传递一些参数
* 一般在实际使用中,这个参数传递的是pojo,或者Map或者ImmutableMap
*
* @param <T> the returned object type
* @param statement Unique identifier matching the statement to use.
* @param parameter A parameter object to pass to the statement.
* @return Mapped object
*/
<
T
>
T
selectOne
(
String
statement
,
Object
parameter
);
/**
* Retrieves a mapper.
* 得到映射器,这个巧妙的使用了泛型,使得类型安全
*
* @param <T> the mapper type
* @param type Mapper interface class
* @return a mapper bound to this SqlSession
*/
<
T
>
T
getMapper
(
Class
<
T
>
type
);
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/SqlSessionFactory.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.session
;
/**
* @author 小傅哥,微信:fustack
* @description 工厂模式接口,构建SqlSession的工厂
* @date 2022/04/01
* @github https://github.com/fuzhengwei
* @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
interface
SqlSessionFactory
{
/**
* 打开一个 session
* @return SqlSession
*/
SqlSession
openSession
();
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/defaults/DefaultSqlSession.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.session.defaults
;
import
cn.bugstack.mybatis.binding.MapperRegistry
;
import
cn.bugstack.mybatis.session.SqlSession
;
/**
* @author 小傅哥,微信:fustack
* @description 默认SqlSession实现类
* @date 2022/04/01
* @github https://github.com/fuzhengwei
* @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
DefaultSqlSession
implements
SqlSession
{
/**
* 映射器注册机
*/
private
MapperRegistry
mapperRegistry
;
public
DefaultSqlSession
(
MapperRegistry
mapperRegistry
)
{
this
.
mapperRegistry
=
mapperRegistry
;
}
@Override
public
<
T
>
T
selectOne
(
String
statement
)
{
return
(
T
)
(
"你被代理了!"
+
statement
);
}
@Override
public
<
T
>
T
selectOne
(
String
statement
,
Object
parameter
)
{
return
(
T
)
(
"你被代理了!"
+
"方法:"
+
statement
+
" 入参:"
+
parameter
);
}
@Override
public
<
T
>
T
getMapper
(
Class
<
T
>
type
)
{
return
mapperRegistry
.
getMapper
(
type
,
this
);
}
}
mybatis-step-02/src/main/java/cn/bugstack/mybatis/session/defaults/DefaultSqlSessionFactory.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.session.defaults
;
import
cn.bugstack.mybatis.binding.MapperRegistry
;
import
cn.bugstack.mybatis.session.SqlSession
;
import
cn.bugstack.mybatis.session.SqlSessionFactory
;
/**
* @author 小傅哥,微信:fustack
* @description 默认的 DefaultSqlSessionFactory
* @date 2022/04/01
* @github https://github.com/fuzhengwei
* @copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
DefaultSqlSessionFactory
implements
SqlSessionFactory
{
private
final
MapperRegistry
mapperRegistry
;
public
DefaultSqlSessionFactory
(
MapperRegistry
mapperRegistry
)
{
this
.
mapperRegistry
=
mapperRegistry
;
}
@Override
public
SqlSession
openSession
()
{
return
new
DefaultSqlSession
(
mapperRegistry
);
}
}
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/ApiTest.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.test
;
import
cn.bugstack.mybatis.binding.MapperRegistry
;
import
cn.bugstack.mybatis.session.SqlSession
;
import
cn.bugstack.mybatis.session.SqlSessionFactory
;
import
cn.bugstack.mybatis.session.defaults.DefaultSqlSessionFactory
;
import
cn.bugstack.mybatis.test.dao.IUserDao
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
/**
* @author 小傅哥,微信:fustack
* @description 单元测试
* @date 2022/3/26
* @github https://github.com/fuzhengwei
* @Copyright 公众号:bugstack虫洞栈 | 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
*/
public
class
ApiTest
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
ApiTest
.
class
);
@Test
public
void
test_MapperProxyFactory
()
{
// 1. 注册 Mapper
MapperRegistry
registry
=
new
MapperRegistry
();
registry
.
addMappers
(
"cn.bugstack.mybatis.test.dao"
);
// 2. 从 SqlSession 工厂获取 Session
SqlSessionFactory
sqlSessionFactory
=
new
DefaultSqlSessionFactory
(
registry
);
SqlSession
sqlSession
=
sqlSessionFactory
.
openSession
();
// 3. 获取映射器对象
IUserDao
userDao
=
sqlSession
.
getMapper
(
IUserDao
.
class
);
// 4. 测试验证
String
res
=
userDao
.
queryUserName
(
"10001"
);
logger
.
info
(
"测试结果:{}"
,
res
);
}
}
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/dao/ISchoolDao.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.test.dao
;
public
interface
ISchoolDao
{
String
querySchoolName
(
String
uId
);
}
mybatis-step-02/src/test/java/cn/bugstack/mybatis/test/dao/IUserDao.java
0 → 100644
浏览文件 @
652eec22
package
cn.bugstack.mybatis.test.dao
;
public
interface
IUserDao
{
String
queryUserName
(
String
uId
);
Integer
queryUserAge
(
String
uId
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录