Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Coudy Hou
JavaGuide
提交
aa9cef3a
J
JavaGuide
项目概览
Coudy Hou
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
aa9cef3a
编写于
3月 10, 2021
作者:
G
guide
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update mybatis-interview.md
上级
84094168
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
37 addition
and
2 deletion
+37
-2
docs/system-design/framework/mybatis/mybatis-interview.md
docs/system-design/framework/mybatis/mybatis-interview.md
+37
-2
未找到文件。
docs/system-design/framework/mybatis/mybatis-interview.md
浏览文件 @
aa9cef3a
...
@@ -25,11 +25,46 @@ MyBatis 技术内幕系列博客,从原理和源码角度,介绍了其内部
...
@@ -25,11 +25,46 @@ MyBatis 技术内幕系列博客,从原理和源码角度,介绍了其内部
#### 3、最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
#### 3、最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
注:这道题也是京东面试官面试我
时
问的。
注:这道题也是京东面试官面试我
被
问的。
答:Dao 接口,就是人们常说的
`Mapper`
接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中
`MappedStatement`
的 id 值,接口方法内的参数,就是传递给 sql 的参数。
`Mapper`
接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个
`MappedStatement`
,举例:
`com.mybatis3.mappers.StudentDao.findStudentById`
,可以唯一找到 namespace 为
`com.mybatis3.mappers.StudentDao`
下面
`id = findStudentById`
的
`MappedStatement`
。在 MyBatis 中,每一个
`<select>`
、
`<insert>`
、
`<update>`
、
`<delete>`
标签,都会被解析为一个
`MappedStatement`
对象。
答:Dao 接口,就是人们常说的
`Mapper`
接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中
`MappedStatement`
的 id 值,接口方法内的参数,就是传递给 sql 的参数。
`Mapper`
接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个
`MappedStatement`
,举例:
`com.mybatis3.mappers.StudentDao.findStudentById`
,可以唯一找到 namespace 为
`com.mybatis3.mappers.StudentDao`
下面
`id = findStudentById`
的
`MappedStatement`
。在 MyBatis 中,每一个
`<select>`
、
`<insert>`
、
`<update>`
、
`<delete>`
标签,都会被解析为一个
`MappedStatement`
对象。
Dao 接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。
~~Dao 接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。~~
Dao 接口里的方法可以重载,但是Mybatis的XML里面的ID不允许重复。
Mybatis版本3.3.0,亲测如下:
```
java
/**
* Mapper接口里面方法重载
*/
public
interface
StuMapper
{
List
<
Student
>
getAllStu
();
List
<
Student
>
getAllStu
(
@Param
(
"id"
)
Integer
id
);
}
```
然后在
`StuMapper.xml`
中利用Mybatis的动态sql就可以实现。
```
java
<
select
id
=
"getAllStu"
resultType
=
"com.pojo.Student"
>
select
*
from
student
<
where
>
<
if
test
=
"id != null"
>
id
=
#
{
id
}
</
if
>
</
where
>
</
select
>
```
能正常运行,并能得到相应的结果,这样就实现了在Dao接口中写重载方法。
**Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个,否则启动会报错。**
相关 issue :
[
更正:Dao 接口里的方法可以重载,但是Mybatis的XML里面的ID不允许重复!
](
https://github.com/Snailclimb/JavaGuide/issues/1122
)
。
Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行
`MappedStatement`
所代表的 sql,然后将 sql 执行结果返回。
Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行
`MappedStatement`
所代表的 sql,然后将 sql 执行结果返回。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录