java
@Select("""
<script>
select u.id,username,realname,usetype,ci1.ConstantName usetypeName,
doctitleId,ci.ConstantName AS docTitle,
isscheduling,deptid,d.DeptName dept,
registLeID,r.RegistName registLe
from
USER u
INNER JOIN constantitem ci1 ON u.usetype = ci1.ID
INNER JOIN constantitem ci ON u.DocTitleID = ci.ID
INNER JOIN department d ON u.DeptID = d.ID
INNER JOIN registlevel r ON u.RegistLeID = r.ID
<where>
and u.DelMark=1
<if test='userType != null and userType!=""' >
and `usetype`=#{userType}
</if>
<if test='dept != null and dept!=""' >
and u.deptid=#{dept}
</if>
<if test='docType != null and docType!=""' >
and u.doctitleId=#{docType}
</if>
<if test='keyword != null and keyword!=""'>
and `username` like CONCAT(CONCAT('%', #{keyword,jdbcType=VARCHAR}), '%')
or `realname` like CONCAT(CONCAT('%', #{keyword,jdbcType=VARCHAR}), '%')
</if>
</where>
</script>
""")
Page<UserVo> selectPage(Page<UserVo> page, String keyword, String userType, String dept, String docType);
jdbcType=VARCHAR 的作用与意义
在 MyBatis 中,jdbcType=VARCHAR 是一种参数类型映射配置,主要用于解决 Java 类型 与 JDBC 类型 之间的转换问题。具体解释如下:
一、为什么需要 jdbcType?
-
Java 与数据库类型不匹配
例如,Java 中的
String类型在数据库中可能对应VARCHAR、CHAR、TEXT等多种类型。MyBatis 需要明确知道如何将 Java 对象转换为 JDBC 类型,以便正确地传递给数据库。 -
处理 NULL 值
当参数为
NULL时,MyBatis 需要知道用哪种 JDBC 类型的NULL来处理。例如,NULL可能是VARCHAR类型的NULL,也可能是INTEGER类型的NULL。
二、jdbcType=VARCHAR 的具体作用
set password=#{newPwd,jdbcType=VARCHAR}
- 明确参数类型 :告诉 MyBatis 将
newPwd参数作为 JDBC 的 VARCHAR 类型 传递给数据库。 - 防止类型转换错误 :确保密码字符串正确地映射到数据库的
VARCHAR字段,避免因类型不匹配导致的 SQL 错误。 - 处理 NULL 值 :如果
newPwd为null,MyBatis 会将其转换为JDBCType.NULL,并标记为VARCHAR类型的NULL。
三、常见的 JDBC 类型映射
MyBatis 支持的部分 jdbcType 取值:
| JDBC 类型 | 对应 Java 类型 |
|---|---|
VARCHAR |
String |
INTEGER |
Integer, int |
DECIMAL |
BigDecimal |
DATE |
java.util.Date |
TIMESTAMP |
java.sql.Timestamp |
NULL |
null 值 |
四、实际应用场景
-
必填字段
对于数据库中不允许为
NULL的字段(如NOT NULL约束),建议显式指定jdbcType,避免因NULL值处理不当导致的 SQL 异常。 -
特殊类型
对于
ENUM、JSON等特殊数据库类型,需要通过jdbcType明确指定,例如:#{jsonData, jdbcType=VARCHAR} <!-- 假设 JSON 存储为 VARCHAR --> -
防止 SQL 注入
虽然 MyBatis 默认使用预编译语句(PreparedStatement),但明确
jdbcType可以进一步确保参数类型安全。
五、在现代 MyBatis 中的使用建议
-
简化配置 :在大多数情况下,MyBatis 可以自动推断参数类型,因此
jdbcType通常可以省略。例如:set password=#{newPwd} <!-- 省略 jdbcType 也可以正常工作 --> -
显式指定的场景:
- 处理
NULL值时(特别是数据库字段不允许为NULL)。 - 与存储过程交互时。
- 使用特殊数据库类型(如
JSON、ARRAY)时。
- 处理