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)时。
相关推荐
我是一颗柠檬7 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
凯瑟琳.奥古斯特8 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
身如柳絮随风扬8 小时前
数据库读写分离:从原理到实战,构建高并发系统
数据库·mysql
提笔了无痕9 小时前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag
陳土9 小时前
DuckDB精读——基于Getting started with DuckDB
数据库·oracle
凯瑟琳.奥古斯特10 小时前
数据库原理选择题精选
数据库·python·职场和发展
曹牧10 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
朝阳58111 小时前
MongoDB 副本集从零搭建到生产可用
数据库·mongodb
雨辰AI11 小时前
SpringBoot3 整合达梦 DM9 超详细入门实战|从零搭建可直接上线
数据库·微服务·架构·政务