mybatis单个字符与整数判断

本文解决MyBatis中if标签使用时,由于OGNL表达式的特性导致的字符串比较错误问题。通过将单引号内的数字或字符转换为双引号包裹或使用.toString()方法,确保了条件判断的正确执行。

把<if test="takeWay == '1' and workday != null ">
改为<if test='takeWay == "1" and workday != null '>
或改为<if test="takeWay == '1'.toString() and workday != null ">即可。

原因是:mybatis是用OGNL表达式来解析的,在OGNL的表达式中,’1’会被解析成字符,java是强类型的,char 和 一个string 会导致不等,所以if标签中的sql不会被解析。
总结下使用方法:单个的字符要写到双引号里面或者使用.toString()才行!
整数判断

<if test="nDay!=0">
and enddate > sysdate + #{nDay}
</if>
<if test="nDay==0">
and to_char(enddate, 'yyyymm')=to_char(sysdate, 'yyyymm')
</if>

转载于:https://www.cnblogs.com/atwanli/articles/8288436.html

MyBatis 中,动态参数传递是实现灵活 SQL 查询和操作的重要方式,尤其适用于需要根据运行时条件构造 SQL 语句的场景。以下是几种常用的方法和最佳实践: ### 动态传递单个参数 当需要传递一个简单类型的参数(如字符串、整数等)时,可以直接在 SQL 中使用 `#{}` 语法进行占位。例如,插入一个用户名的操作可以这样实现: ```java @Insert("INSERT INTO users (name) VALUES (#{name})") void insertSingleParam(String name); ``` 这种方法适用于参数较少的场景,代码简洁且易于维护。 ### 动态传递多个参数 当需要传递多个参数时,可以采用以下几种方式: #### 使用 `@Param` 注解 通过在接口方法中为每个参数添加 `@Param` 注解并指定参数名,可以在 SQL 映射文件中引用这些参数名。例如: ```java @Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})") void insertMultipleParams(@Param("name") String name, @Param("email") String email); ``` #### 使用 Map 将多个参数封装成一个 `Map` 对象传入,适用于参数数量不确定或动态变化的情况。例如: ```java Map<String, Object> params = new HashMap<>(); params.put("name", "John Doe"); params.put("email", "john@example.com"); sqlSession.insert("insertUser", params); ``` 对应的 SQL 映射文件中可以这样写: ```xml <insert id="insertUser"> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> ``` #### 使用 JavaBean/POJO 将多个参数封装成一个 JavaBean 对象传入,适用于参数结构较为复杂的情况。例如,定义一个 `User` 类: ```java public class User { private String name; private String email; // getters and setters } ``` 然后在接口方法中使用该类作为参数: ```java @Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})") void insertUser(User user); ``` ### 动态传递对象类型的数据 当需要传递一个对象类型的数据时,可以直接传递整个对象。在 SQL 映射文件中,可以直接写对象的属性进行传递,MyBatis 会自动映射到数据库的字段名。前提是表的字段名和对象的属性名除了驼峰命名不一致外,其他都相同。例如: ```xml <insert id="save" parameterType="com.lxb.entity.Saywords" useGeneratedKeys="true" keyProperty="id"> INSERT INTO s_contents (`con_name`,`con_type`,`con_publish_time`,`user_id`,`secrecy_level`,`con_desc`,`img_path`) VALUES (#{con_name},#{con_type},#{con_publish_time},#{user_id},#{secrecy_level},#{con_desc},#{img_path}); </insert> ``` ### 动态传递表名 有时需要动态传递表名,这可以通过 `${}` 语法实现。需要注意的是,这种方式存在 SQL 注入的风险,因此应确保传入的表名是可信的。例如: ```xml <select id="selectFromTable" resultType="map"> SELECT * FROM ${tableName} WHERE cycle = #{cycle} </select> ``` 对应的 Java 调用示例: ```java Map<String, Object> params = new HashMap<>(); params.put("tableName", "user"); params.put("cycle", "2022"); List<Map<String, Object>> result = sqlSession.selectList("selectFromTable", params); ``` ### 最佳实践 1. **安全性**:尽量避免使用 `${}` 语法,尤其是在处理用户输入时,以防止 SQL 注入攻击。如果必须使用,确保对输入进行严格的验证和过滤。 2. **可读性和可维护性**:对于复杂的参数结构,建议使用 JavaBean 或 POJO,这样可以使代码更加清晰和易于维护。 3. **性能优化**:合理使用缓存机制,减少不必要的数据库查询,提高系统性能。 4. **异常处理**:在实际开发中,应添加适当的异常处理逻辑,确保程序的健壮性和稳定性。 通过以上方法,可以在 MyBatis 中灵活地实现动态参数传递,满足各种业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值