mybatis xml 配置中,jdbcType=VARCHAR 的作用

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

  1. Java 与数据库类型不匹配

    例如,Java 中的 String 类型在数据库中可能对应 VARCHARCHARTEXT 等多种类型。MyBatis 需要明确知道如何将 Java 对象转换为 JDBC 类型,以便正确地传递给数据库。

  2. 处理 NULL 值

    当参数为 NULL 时,MyBatis 需要知道用哪种 JDBC 类型的 NULL 来处理。例如,NULL 可能是 VARCHAR 类型的 NULL,也可能是 INTEGER 类型的 NULL

二、jdbcType=VARCHAR 的具体作用

复制代码
set password=#{newPwd,jdbcType=VARCHAR}
  • 明确参数类型 :告诉 MyBatis 将 newPwd 参数作为 JDBC 的 VARCHAR 类型 传递给数据库。
  • 防止类型转换错误 :确保密码字符串正确地映射到数据库的 VARCHAR 字段,避免因类型不匹配导致的 SQL 错误。
  • 处理 NULL 值 :如果 newPwdnull,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

四、实际应用场景

  1. 必填字段

    对于数据库中不允许为 NULL 的字段(如 NOT NULL 约束),建议显式指定 jdbcType,避免因 NULL 值处理不当导致的 SQL 异常。

  2. 特殊类型

    对于 ENUMJSON 等特殊数据库类型,需要通过 jdbcType 明确指定,例如:

    复制代码
    #{jsonData, jdbcType=VARCHAR}  <!-- 假设 JSON 存储为 VARCHAR -->
  3. 防止 SQL 注入

    虽然 MyBatis 默认使用预编译语句(PreparedStatement),但明确 jdbcType 可以进一步确保参数类型安全。

五、在现代 MyBatis 中的使用建议

  • 简化配置 :在大多数情况下,MyBatis 可以自动推断参数类型,因此 jdbcType 通常可以省略。例如:

    复制代码
    set password=#{newPwd}  <!-- 省略 jdbcType 也可以正常工作 -->
  • 显式指定的场景

    • 处理 NULL 值时(特别是数据库字段不允许为 NULL)。
    • 与存储过程交互时。
    • 使用特殊数据库类型(如 JSONARRAY)时。
相关推荐
吃糖的小孩8 小时前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3501 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3501 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3501 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB2 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶2 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵2 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils2 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
Databend3 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent