如何使用注解配置的 MyBatis 指定 IN param 类型

2024-04-12

如果我希望能够传递空值,我似乎需要明确告诉 MyBatis java.util.Date IN 参数使用什么数据库类型。但我找不到办法做到这一点。

我尝试了以下不同的变体,但没有成功:

@Select("<script>SELECT ... WHERE ... " +
    "<if test='#{dateFrom,jdbcType=TIMESTAMP} != null'>" +
    "  AND date &gt; #{dateFrom,jdbcType=TIMESTAMP}" + 
    "</if></script>")
List<MyType> getRecords(@Param("dateFrom") dateFrom)

使用注解时如何指定参数类型?


其他开发人员已经对此类问题发表了评论。

  • 如果我在参数中指定 JdbcType,MyBatis 不会覆盖 JdbcType #139 https://github.com/mybatis/mybatis-3/issues/139

我引用GitHub的评论:

@nglsatheesh MyBatis 无法强制转换/转换这些类型,除非你告诉它如何操作。 您所需要的只是一个简单的自定义类型处理程序。

public class StrToIntTypeHandler implements TypeHandler<String> {
  @Override
  public void setParameter(PreparedStatement ps, int i,
      String parameter, JdbcType jdbcType) throws SQLException {
    ps.setInt(i, Integer.parseInt(parameter));
  }
  // other methods are for binding query results.
}

select * from table_name where id = #{value,typeHandler=StrToIntTypeHandler}

现在,如果您要创建这样一个自定义类型处理程序:

public class Null2DateTypeHandler implements TypeHandler<Date> {

    @Override
    public void setParameter(PreparedStatement ps, int i, java.util.Date parameter, JdbcType jdbcType) throws SQLException {
        System.err.println(String.format("ps: %s, i: %d, param: %s, type: %s", ps.toString(), i, parameter, jdbcType.toString()));

        if (parameter == null) {
            ps.setDate(i, null); // ??? I'm not sure. But it works.
        } else {
            ps.setDate(i, new java.sql.Date(parameter.getTime()));
        }
    }
}

并且,映射器方面:

@Select({
    "<script>"
    , "SELECT * FROM `employees` WHERE `hire_date` "
    , "  BETWEEN
    , "  #{dateFrom,typeHandler=*.*.*.Null2DateTypeHandler}"
    , "  AND"
    , "  #{dateTo,typeHandler=*.*.*.Null2DateTypeHandler}"      
    ,"</script>"
})
@Results({
      @Result(property = "empNo", column = "emp_no"),
      @Result(property = "birthDate", column = "birth_date"),
      @Result(property = "firstName", column = "first_name"),
      @Result(property = "lastName",  column = "last_name"),
      @Result(property = "gender",    column = "gender"),
      @Result(property = "hireDate",  column = "hire_date")          
})  
List<Employees> selectBetweenTypeHandler(@Param("dateFrom") Date dateFrom, @Param("dateTo") Date dateTo);

我的记录,看起来工作正常。

DEBUG [main] - ==>  Preparing: SELECT * FROM `employees` WHERE `hire_date` BETWEEN ? AND ? 
ps: org.apache.ibatis.logging.jdbc.PreparedStatementLogger@369f73a2, i: 1, param: null, type: OTHER
DEBUG [main] - ==> Parameters: null, null
ps: org.apache.ibatis.logging.jdbc.PreparedStatementLogger@369f73a2, i: 2, param: null, type: OTHER
DEBUG [main] - <==      Total: 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用注解配置的 MyBatis 指定 IN param 类型 的相关文章

随机推荐

  • str在 data.frame 中按行分割并按列分配结果

    所以我有数据框 dat data frame x c Sir Lancelot the Brave King Arthur The Black Knight The Rabbit stringsAsFactors F gt dat x 1
  • Java 8 Streams:将对象列表转换为一组对象

    我正在尝试将对象列表转换为一组对象 以确保集合中是否不存在重复项 我正在尝试使用 Streams 我有一个类产品如下 class Product int id String name float price public Product i
  • 模拟通过实例使用的类方法

    我正在尝试使用模拟修补类方法 如所述在文档中 http www voidspace org uk python mock patch html patch Mock 对象本身工作正常 但它的方法却不能 例如 它们的属性如下call coun
  • 从 Delphi 将列表导出到 OpenOffice Calc

    我正在使用 Delphi 7 我想使用自动化而不是使用文件将列表内容从我的程序导出到 OpenOffice Calc 任务很简单 创建新文档 迭代行 列并更改单元格数据 我找到了一些代码 但它并不完整 我希望有人有一些示例代码可以完成这个非
  • 将 Python 安装到自托管 Windows 构建代理

    我已经安装了 Windows 代理 并且需要能够运行 Python 脚本 我知道我需要安装Python 但我不知道如何安装 我将标准安装中的 Python 文件添加到 AGENT TOOLSDIRECTORY Python 3 8 2 x6
  • Swift 的 Facebook 登录按钮

    在 Xcode 中 如果我创建一个UIView然后将自定义类添加为FBSDKLoginButton 当我单击时 它会引导我完成 Facebook 登录 然后返回到与FBSDKLoginButton但不是说登录按钮 而是说现在注销 当单击登录
  • 使用装饰器恢复生成器

    让我们有一个类 它的功能有时会失败 但经过一些操作后它就可以完美地工作 现实生活中的例子是 Mysql 查询 它会引发 mysql exceptions OperationalError 2006 MySQL server has gone
  • 终止递归调用

    据我所知 terminate 当异常处理出现问题时被调用 通常只是没有被捕获 我得到的只是一个错误行terminate called recursively 经过一段时间的谷歌搜索后 我发现了很多例子 terminate called af
  • 如何在 Visual Studio 中将 .NET Framework 更改为 .NET Standard/Core?

    我在 Visual Studio 中有一个 C 解决方案 它最初是在 NET Framework 中创建的 我想将项目转换为 NET Standard Core 如果我进入项目 gt 属性 我会看到附加的屏幕 其中目标框架是 NET Fra
  • 我应该如何解释 ghc 堆分析器的输出?

    我有一个在 haskell 中实现的服务器进程 它充当一个简单的内存数据库 客户端进程可以连接然后添加和检索数据 该服务使用的内存比我预期的要多 我正在尝试找出原因 我拥有的最粗略的指标是linux top 当我启动该过程时 我看到一个大小
  • SeekBar minHeight 和 maxHeight 通过代码

    有谁知道如何设置最小值和最大值SeekBar代码的高度 我想重现与以下 XML 摘录相同的行为
  • 在地图上显示线串的方向 - 自动缩放地图

    我有这段代码 它在地图上绘制一个线串 它是用户提供的 2 个坐标点的轨迹 public class Quickstart public static void main String args throws Exception displa
  • 使用 std 算法将容器分区/批量/分块为大小相等的块

    我遇到过一种情况 我必须将一组记录批量处理到数据库中 我想知道如何才能做到这一点标准算法 给定 10002 条记录 我希望将其划分为 100 条记录的 bin 进行处理 其余为 2 条记录的 bin 希望下面的代码能够更好地说明我想要完成的
  • 强制浏览器将下载的文件保存在特定位置

    我的项目是一个Asp Net MVC4Web应用程序 目前它有一个方法来生成文本文件并将其发送到客户端的浏览器进行下载 我需要修改它以强制浏览器将文件保存在客户端计算机上的自定义 预定义 位置 这是不可能的 因为这会带来严重的安全问题 用户
  • 根据 URL 参数选择下拉菜单 - PHP 还是 jQuery?

    根据 URL 参数为我的表单选择输出 选定 的最佳方法是什么 在我的 URL 中 我可能有这个参数 term retail 我如何告诉下面的代码选择零售选项
  • 从 HDFS 到 Amazon S3 的 Hadoop distcp 问题

    我正在尝试使用以下方法将数据从 HDFS 移动到 S3distcp The distcp作业似乎成功了 但在 S3 上 文件未正确创建 有两个问题 文件名和路径不会被复制 所有文件最终都为block
  • 启用和禁用延迟扩展,它有什么作用?

    我见过SETLOCAL ENABLEDELAYEDEXPANSION SETLOCAL DISABLEDELAYEDEXPANSION在许多批处理文件中 但命令实际上是做什么的 enabledelayeexpansion指示cmd识别语法
  • 使用 Github API 是否可以确定某个分支是否位于默认分支之前?

    使用 Github API 无本地 git 命令 是否可以比较分支以查看它在默认分支之前是否有任何更改 我正在构建一个审核工具 并希望确定要关闭的候选分支 因为它们的所有更改都存在于默认分支中 I want the same informa
  • JavaFX 2 中的组合框键值对

    我刚刚开始学习 JavaFX 2 现在我正在尝试构建一个示例应用程序 然后我就陷入了组合框 我在 JavaFX 中没有找到任何对组合框键值对的引用 组合框 javadoc 位于http docs oracle com javafx 2 ap
  • 如何使用注解配置的 MyBatis 指定 IN param 类型

    如果我希望能够传递空值 我似乎需要明确告诉 MyBatis java util Date IN 参数使用什么数据库类型 但我找不到办法做到这一点 我尝试了以下不同的变体 但没有成功 Select List