Mapper.xml方法重载-解决方案
121 Mapper.xml不可以重载2 解决方案:提出思路2.1 全部参数签名的方法+动态SQL2.2 HashMap来包裹参数+动态SQL3. default 关键字3.1 Switch中的default3.2 default修饰的方法耳熟能详,我们都知道,在java中重载的条件就是方法名相同情况下参数列表长度相同,参数类型不通过参数列表不同满足以上条件,在java中就是重载的具体表现但是在数
12
耳熟能详,我们都知道,在java中重载的条件就是
方法名相同情况下
- 参数列表长度相同,参数类型不通过
- 参数列表不同
满足以上条件,在java中就是重载的具体表现
但是在数据层,却不是这样,java的接口我们可以编写重载方法,但是mapper.xml却不能进行重载
1 Mapper.xml不可以重载
场景: 更新用户项目表
需求: 允许批量更新、单个更新
- java处的接口
在java的接口处,这样写是完全没有问题的
- mapper.xml处
mapper.xml处报错了
根据id的属性,id = mapper全类名 + “.” + 方法名, 重载的话, 肯定会存在id相同的情况
所以这就注定了,mapper.xml是无法重载的,但是我们只能做的就是让java接口重载,尽可能的去编一个能包含全部的全部参数签名的方法,让其他重载方法去调用它
2 解决方案:
提出思路
JDK1.8提供的default关键字,好像能解决接口层的重载问题
怎么说呢,像是一种逃避mapper.xml中id重复的思路,但是好像确实是一种好办法
沿着刚刚的思路,那就将解决方法扩大(这里就体现了动态SQL的强大)
1. 提供全部参数签名的方法,结合动态SQL实现
2. 使用HashMap来包裹参数,结合动态SQL
2.1 全部参数签名的方法+动态SQL
- java接口处
// 这是一个全部参数签名的方法
List<User> getUser(@Param("id")Long id,@Param("name")String name); # 根据id和姓名,查找指定用户
// 部分参数签名的方法
// 1. 根据id查找用户
List<User> getUser(@Param("id")Long id);
// 2. 根据姓名查找用户
List<User> getUser(@Param("name")String name);
// 3. 查找全部用户
List<User> getUser();
- mapper.xml处
<!-- 只需要编写全部参数签名的方法的 SQL -->
<select id="getUser" resultType="User">
select * from USER
<where>
<!-- 如果id存在就按条件查找,如果id不存在,就不对id进行查找的限制 -->
<if test="id != null">
id = #{id}
</if>
<!-- 如果name存在就按条件查找,如果name不存在,就不对name进行查找的限制 -->
<if test="name != null">
and name = #{name}
</if>
</where>
</select>
优化java接口
List<User> getUser(@Param("id")Long id,@Param("name")String name);
default List<User> getUser(@Param("id")Long id){
return getUser(id,null);
}
default List<User> getUser(@Param("name")String name){
return getUser(null,name);
}
default List<User> getUser(){
return getUser(null,null);
}
缺点:
每次都要显式传递null来判断是否有值,
调用方法丑陋
2.2 HashMap来包裹参数+动态SQL
- java接口处
// 这是一个全部参数签名的方法
List<User> getUser(Map<String,Object> args);
// 部分参数签名的方法
List<User> getUser(@Param("id")Long id);
List<User> getUser(@Param("name")String name);
List<User> getUser();
- mapper.xml处
<select id="getUser" resultType="User">
select * from USER
<where>
<if test="id != null">
id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
</where>
</select>
优化
List<User> getUser(Map<String,Object> args);
List<User> getUser(@Param("id")Long id);
List<User> getUser(@Param("name")String name);
List<User> getUser();
缺点:
使用Map包裹:调用者无法知道有所有可选参数以及参数的名字,
调用参数不清晰
3. default 关键字
java中 default 只有两种用法
- swithc 语句中使用default
- 定义接口的时候使用default来修饰具体的方法
3.1 Switch中的default
int day = 6;
String dayString = "";
swithc(day){
case 1: dayString = "周一";break;
case 2: dayString = "周二";break;
case 3: dayString = "周三";break;
case 4: dayString = "周四";break;
case 5: dayString = "周五";break;
default: dayString = "周末";break;
}
使用比较简单,就是当case里的值与switch里的key没有匹配的时候,执行default里的方法
3.2 default修饰的方法
public interface Demo{
public void fun();
default void test(){
System.out.println("this is default method");
}
}
JDK1.8中为了加强接口的能力,使得接口可以存在具体的方法,前提是方法需要被default或static关键字所修饰
default修饰的目的是让接口可以拥有具体的方法,让接口内部包含了一些默认的方法实现

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)