Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
JavaGuide
提交
6f20b1d4
J
JavaGuide
项目概览
wushizhenking
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
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,体验更适合开发者的 AI 搜索 >>
提交
6f20b1d4
编写于
4月 23, 2021
作者:
Z
zhangkai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: Dao接口中方法重载的补充
上级
639a9a74
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
75 addition
and
0 deletion
+75
-0
docs/system-design/framework/mybatis/mybatis-interview.md
docs/system-design/framework/mybatis/mybatis-interview.md
+75
-0
未找到文件。
docs/system-design/framework/mybatis/mybatis-interview.md
浏览文件 @
6f20b1d4
...
...
@@ -68,6 +68,81 @@ public interface StuMapper {
Dao 接口的工作原理是 JDK 动态代理,MyBatis 运行时会使用 JDK 动态代理为 Dao 接口生成代理 proxy 对象,代理对象 proxy 会拦截接口方法,转而执行
`MappedStatement`
所代表的 sql,然后将 sql 执行结果返回。
##### ==补充:==
Dao接口方法可以重载,但是需要满足以下条件:
1.
仅有一个无参方法和一个有参方法
2.
多个有参方法时,参数数量必须一致。且使用相同的
`@Param`
,或者使用
`param1`
这种
测试如下:
`PersonDao.java`
```
java
Person
queryById
();
Person
queryById
(
@Param
(
"id"
)
Long
id
);
Person
queryById
(
@Param
(
"id"
)
Long
id
,
@Param
(
"name"
)
String
name
);
```
`PersonMapper.xml`
```
xml
<select
id=
"queryById"
resultMap=
"PersonMap"
>
select
id, name, age, address
from person
<where>
<if
test=
"id != null"
>
id = #{id}
</if>
<if
test=
"name != null and name != ''"
>
name = #{name}
</if>
</where>
limit 1
</select>
```
`org.apache.ibatis.scripting.xmltags.DynamicContext.ContextAccessor#getProperty`
方法用于获取
`<if>`
标签中的条件值
```
java
public
Object
getProperty
(
Map
context
,
Object
target
,
Object
name
)
{
Map
map
=
(
Map
)
target
;
Object
result
=
map
.
get
(
name
);
if
(
map
.
containsKey
(
name
)
||
result
!=
null
)
{
return
result
;
}
Object
parameterObject
=
map
.
get
(
PARAMETER_OBJECT_KEY
);
if
(
parameterObject
instanceof
Map
)
{
return
((
Map
)
parameterObject
).
get
(
name
);
}
return
null
;
}
```
`parameterObject`
为map,存放的是Dao接口中参数相关信息。
`((Map)parameterObject).get(name)`
方法如下
```
java
public
V
get
(
Object
key
)
{
if
(!
super
.
containsKey
(
key
))
{
throw
new
BindingException
(
"Parameter '"
+
key
+
"' not found. Available parameters are "
+
keySet
());
}
return
super
.
get
(
key
);
}
```
1.
`queryById()`
方法执行时,
`parameterObject`
为null,
`getProperty`
方法返回null值,
`<if>`
标签获取的所有条件值都为null,所有条件不成立,动态sql可以正常执行。
2.
`queryById(1L)`
方法执行时,
`parameterObject`
为map,包含了
`id`
和
`param1`
两个key值。当获取
`<if>`
标签中
`name`
的属性值时,进入
`((Map)parameterObject).get(name)`
方法中,map中key不包含
`name`
,所以抛出异常。
3.
`queryById(1L,"1")`
方法执行时,
`parameterObject`
中包含
`id`
,
`param1`
,
`name`
,
`param2`
四个key值,
`id`
和
`name`
属性都可以获取到,动态sql正常执行。
#### 4、MyBatis 是如何进行分页的?分页插件的原理是什么?
注:我出的。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录