包装异常>>>测试

一个包装异常的小例子.

public Activity updateActivity(Map Mapactivity) {
Long id = Long.valueOf(Mapactivity.get("id").toString());
Activity act = (Activity)this.getHibernateTemplate().get(Activity.class,id);
try {
BeanUtils.populate(act,Mapactivity);
this.getHibernateTemplate().update(act);
}catch(Exception e){
throw new DolphinOperationException(e,CodeCategories.UPDATE_FAILURE); //CodeCategories.UPDATE_FAILURE 常量200或者400
}
return act;
}

1.因为BeanUtils本身就会需要抛出异常,但所有的异常都是Exception
2.这个例子,需求是更新一个拼单,这里使用到了助手类(临时发现,如果是Date类型为空则会出现异常,使用需注意),在更新完拼单后将这个拼单返回,并告知更新成功或者失败.

下面是这个异常包装类

public class DolphinOperationException extends RuntimeException {
private Integer errorCode; //定义一个错误编码

public DolphinOperationException(Integer errorCode) {
this.errorCode = errorCode;
}

public DolphinOperationException(Throwable cause, Integer errorCode) {
super(cause);
this.errorCode = errorCode;
}

public DolphinOperationException(Integer errorCode,String message) {
super(message);
}

public DolphinOperationException(String message, Throwable cause, Integer errorCode) {
super(message, cause);
this.errorCode = errorCode;
}

public Integer getErrorCode() {
return errorCode;
}
}

继承RuntimeException,重写了构造方法

测试类

@Test
@Rollback(false)
public void updateActivity(){
Address ads = new Address();
ads.setAddress("22222");

User user = new User();
user.setId(15l);

Activity act = new Activity();
act.setId(2l);
act.setAddress(ads);
act.setStartTime(new Date());
act.setTitle("光棍节写测试1");
Activity activity=am.updateActivity(act);
assertNotNull(activity);
}
<think>好的,我现在要解决用户关于MyBatis中<choose>标签用法及其条件未执行的问题。用户之前已经得到了一个详细的回答,现在需要结合新的引用内容来补充或调整回答。首先,我需要仔细阅读用户提供的三个引用,并看看这些信息如何整合到现有的知识中。 首先,引用[1]提到<choose>类似于Java的switch-case,用于多个互斥条件选择,每个<when>条件为真时执行对应的SQL片段,并忽略后续的<when>和<otherwise>。这说明<choose>的结构和逻辑,需要确保条件互斥。引用[2]则说明在业务层未处理条件时,使用<choose>实现类似if-else的逻辑,替换<if>标签的情况。引用[3]指出当变量为int类型时可能导致条件总是执行,需改为Integer,并重写getter/setter方法。这涉及到类型处理和MyBatis对基本类型与包装类型的处理差异。 接下来,用户的问题是关于<choose>的用法和条件不执行的原因。之前的回答已经涵盖了参数传递错误、类型不匹配、空值处理等问题,但需要结合新的引用补充。比如,引用[3]提到的int类型问题需要作为单独的一点原因进行分析,因为基本类型无法为null,可能导致条件判断出错。同时,引用[2]提到的业务层未处理条件,可能需要强调在动态SQL中如何替代业务逻辑。 现在,我需要将新的引用信息整合到原有回答的结构中。原有的核心原因分析包括参数路径错误、类型不匹配、空值处理。根据引用[3],应该添加基本类型与包装类型的问题作为第四点,说明使用int而不是Integer可能导致条件判断错误,因为int无法为null,而MyBatis可能无法正确解析。例如,当参数是int类型时,如果未传值,可能默认为0,导致条件被错误触发。 此外,在解决方案部分,需要强调在条件判断中使用包装类型,并检查实体类中的字段类型是否正确。例如,将int改为Integer,并确保有正确的getter和setter方法。在示例中,可以添加一个关于类型转换的案例,说明如何修复因类型导致的问题。 在预防性编程规范中,可以加入关于使用包装类型而非基本类型的建议,避免因默认值问题导致的条件错误。同时,在高级调试技巧中,提醒用户检查实体类中的字段类型,并查看生成的SQL日志,确认参数是否正确传递和类型是否匹配。 还需要检查之前的回答是否遗漏了关于<choose>标签必须包含<when>和<otherwise>的结构要点,根据引用[1],需要强调<choose>的结构和逻辑,确保标签的正确嵌套和使用。例如,<otherwise>是可选的,但建议包含默认分支以避免未命中任何条件的情况。 最后,在相关问题部分,可以添加关于基本类型与包装类型在MyBatis中的处理差异,以及如何避免条件判断错误的问题。确保用户理解类型选择对动态SQL的影响。 总结,需要将引用中的新信息整合到原有回答的结构中,补充关于类型处理、<choose>结构、业务层与SQL层分工的内容,并确保回答逻辑清晰,覆盖所有可能的原因和解决方案。</think>### MyBatis `<choose>` 标签用法与条件未执行原因分析 --- #### 一、`<choose>` 标签核心用法 1. **逻辑结构** `<choose>` 类似于 Java 的 `switch-case` 语句,用于实现 **互斥条件选择**: ```xml <choose> <when test="条件1">SQL片段1</when> <when test="条件2">SQL片段2</when> <otherwise>默认SQL片段</otherwise> </choose> ``` - **执行规则**:从上到下匹配第一个满足的 `<when>`,后续条件忽略;若无匹配则执行 `<otherwise>`(若存在)[^1]。 2. **与 `<if>` 的区别** - `<if>`:独立条件判断,可同时满足多个条件 - `<choose>`:多条件互斥,仅执行第一个匹配的分支 *适用场景:替代业务层未处理的 `if-else` 逻辑*[^2]。 --- #### 二、条件未执行的 **5 大原因**及解决方案 ##### 1. **参数路径错误** **表现**:条件表达式未正确引用参数名或对象属性。 **示例**: ```xml <!-- 错误:参数名为 userDTO 却直接引用属性 --> <when test="age > 18">...</when> <!-- 正确:明确参数对象 --> <when test="userDTO.age > 18">...</when> ``` *原理:MyBatis 使用 OGNL 表达式解析参数,需完整路径*[^1]。 ##### 2. **类型不匹配** **表现**:字段类型与参数类型不一致(如数据库为 `INT`,参数用字符串判断)。 ```xml <!-- 错误:status 是 INT 类型却用字符串比较 --> <when test="status == '1'">...</when> <!-- 正确:直接比较数字 --> <when test="status == 1">...</when> ``` *扩展:字符串比较建议显式转换*[^3]: ```xml <when test="status.toString() == '1'">...</when> ``` ##### 3. **基本类型陷阱** **表现**:使用 `int` 等基本类型导致条件误判。 ```xml <!-- 错误:基本类型无法为 null,未传参数时默认为 0 --> <when test="isVIP == true">...</when> <!-- 正确:改用包装类型 Integer --> <when test="isVIP != null and isVIP">...</when> ``` *修复步骤*: 1. 将实体类字段从 `int` 改为 `Integer` 2. 重写 `getter/setter` 方法[^3]。 ##### 4. **空值未处理** **表现**:未校验空值导致条件异常。 ```xml <!-- 错误:未处理空字符串 --> <when test="keyword != null">...</when> <!-- 正确:防御性空值检查 --> <when test="keyword != null and keyword.trim() != ''">...</when> ``` ##### 5. **OGNL 表达式限制** **表现**:特殊符号或语法错误导致条件失效。 ```xml <!-- 错误:使用 && 符号 --> <when test="startTime != null && endTime != null">...</when> <!-- 正确:使用 and 代替 --> <when test="startTime != null and endTime != null">...</when> ``` --- #### 三、验证与调试方法 1. **SQL 日志分析** ```properties # 开启完整 SQL 日志 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` *观察预处理 SQL 中是否包含预期条件*。 2. **参数值注入验证** ```xml <!-- 临时添加参数输出 --> <bind name="debugParam" value="'参数值=' + (param != null ? param : 'null')"/> SELECT ${debugParam} AS debug_info FROM table ``` 3. **单元测试覆盖** ```java @Test void testChooseCondition() { Map<String, Object> params = new HashMap<>(); params.put("status", 1); List<Data> result = mapper.selectByCondition(params); assertThat(result).allMatch(d -> d.getStatus() == 1); } ``` --- #### 四、最佳实践 1. **参数规范** - 使用 `@Param` 明确别名 - 优先使用包装类型(如 `Integer` 而非 `int`) 2. **防御性编程** ```xml <when test="param != null and param.toString().trim().length() > 0"> AND column = #{param} </when> ``` 3. **类型转换工具** ```xml <!-- 使用工具类处理空值 --> <when test="@org.apache.commons.lang3.StringUtils@isNotBlank(name)"> AND name = #{name} </when> ``` --- #### 典型案例修复 **问题代码**: ```xml <choose> <when test="type == 1">AND category = 'A'</when> </choose> ``` **修复后**: ```xml <choose> <when test="type != null and type == 1">AND category = 'A'</when> <otherwise>AND category IS NOT NULL</otherwise> </choose> ``` --- ### 相关问题 1. MyBatis 中如何正确处理 `Boolean` 类型的条件判断? 2. 动态 SQL 中 `<where>` 标签和 `WHERE 1=1` 哪种方式更优? 3. 为什么 MyBatis 建议使用包装类型而非基本类型? 4. 如何处理动态 SQL 中的多表联合查询条件拼接?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值