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
)时。
- 处理