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)时。
相关推荐
倔强的石头_5 小时前
连接数失控排查:从数据库会话、应用线程池到连接池泄漏
数据库
hzxpaipai5 小时前
企业官网技术架构拆解:前端、后台、数据库、服务器如何协同
前端·数据库·架构
爱吃火鸡面呀6 小时前
MySQL DQL 子查询详解:从标量、列、行到表子查询的完整实战
大数据·数据库·mysql
harmony&6 小时前
OpenStack 云平台管理实战:从 Keystone 认证到 Nova 计算调度
数据库·openstack
betazhou7 小时前
Apache Seatunnel 抽取Oracle数据库测试
数据库·oracle·apache·seatunnel
devilnumber9 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle
—Miss. Z—9 小时前
计算机等级考试三级数据库技术—选择题
数据库·mysql
www_aiyuanma_vip9 小时前
PC 手机电商(MySQL 版)
数据库·mysql·智能手机
Databend9 小时前
AI 时代的数据工程挑战:从复杂链路走向统一数据底座
大数据·数据库·云计算