当前位置: 首页 > 面试题库 >

JDBI是否接受UUID参数?

胡禄
2023-03-14
问题内容

当使用SQL Object参数绑定时,JDBI是否可以与UUID参数一起使用?

我有这样的方法:

@SqlQuery("EXECUTE [MyProcedure] :myField")
MyDto myMethod(@Bind("myField") UUID myField);

绑定到接收如下参数的SQL Server存储过程:

@myField uniqueidentifier

执行时,将抛出此异常:

! com.microsoft.sqlserver.jdbc.SQLServerException: The conversion from UNKNOWN to UNKNOWN is unsupported.
! at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
! at com.microsoft.sqlserver.jdbc.DataTypes.throwConversionError(DataTypes.java:1117)
! at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:991)

如果我将JDBI上的参数类型更改为String,然后使用UUID对象中的toString()方法调用它,则它将起作用:

@SqlQuery("EXECUTE [MyProcedure] :myField")
MyDto trash(@Bind("myField") String myField);

有没有办法编写我的DAO方法来接受UUID参数,并在绑定之前将它们转换为字符串?


问题答案:

JDBI仅公开针对JDBC公开的基于类型的显式绑定。JDBC不会公开用于绑定的UUID类型,因此默认情况下会将其设置为Object。不幸的是,JDBC没有提供显式的UUID绑定机制,因此通过String可能是最可移植的方式:-(

如果要在Java中将其绑定为UUID并在内部将其转换为String,则有两条路径。首先,如果您 始终
要将UUID绑定为字符串,则是使用ArgumentFactory,请参见https://github.com/brianm/jdbi/blob/master/src/test/java/org/skife/jdbi/v2/sqlobject
/TestRegisterArgumentFactory.java
为例。

第二个是,如果只想在特定情况下这样做,则可以创建一个自定义的活页夹,例如使用http://jdbi.org/sql_object_api_argument_binding/

使用ArgumentFactory实现从UUID到字符串的全局绑定的示例:

UUIDArgumentFactory.java:

public class UUIDArgumentFactory implements ArgumentFactory<UUID> {

    @Override
    public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
        return value instanceof UUID;
    }

    @Override
    public Argument build(Class<?> expectedType, UUID value, StatementContext ctx) {
        return new UUIDArgument(value);
    }
}

UUIDArgument.java:

public class UUIDArgument implements Argument {
    private final UUID value;

    public UUIDArgument(UUID value) {
        this.value = value;
    }

    @Override
    public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
        statement.setString(position, value.toString());
    }    
}

寄存器:

final DatabaseFactory factory = new DatabaseFactory(environment);
final Database db = factory.build(configuration.getDatabaseConfiguration(), "sqlserver");
db.registerArgumentFactory(new UUIDArgumentFactory());


 类似资料:
  • 问题内容: 我们一直在打开一个共享弹出窗口(通过window.open),其URL为 直到上个月某个未知的点,一切都很好。 现在正在发生的是;会出现弹出对话框,并且正确包含查询字符串参数提供的标题,描述,图像和URL,但是,在提交帖子时,Facebook上生成的墙上帖子缺少标题,描述和图像,尽管它仍链接到正确的网址。 有人知道最近是否有更改可能突然使它停止工作? 抢先一些常见的答复: “ shar

  • valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?

  • 我和这里的用户遇到了同样的问题:log4j类型genericopobjectpool不接受参数,但我一直无法找到这个问题的答案。Log4j2在附加到rollingfile时起作用,但此处列出的方法:https://logging.apache.org/log4j/2.x/manual/appenders.html显示错误“GenericObjectPool不接受参数”

  • 考虑以下陈述: 以上内容被认为是安全的,不会受到SQL注入攻击。知道id属于int类型,下面的也安全吗? 如果没有,会出现什么问题?

  • 我希望为我的2D游戏创造平滑的道路。看着这正是我需要的东西。每一篇文章,甚至在上,都给它一个类型,并用构造函数传递所有控制点和一个。这似乎是过时的,不再接受任何类型参数,没有它,它只能与路径工作。构造函数也不接受控制点列表。 这会产生以下错误:

  • 问题内容: 我想对数据库中的敏感数据使用加密安全的主密钥-这是无法猜测/可预测的,并且不能由数据库生成(在持久存储对象之前,我需要密钥)。 我了解Java使用带有加密安全随机数生成器的4型UUID,但是我知道UUID并不是完全随机的,所以我的问题是,假设无法从一组现有的uuid中预测uuid,这有多安全? 问题答案: 好吧,如果您想知道UUID的随机性,则必须查看源。 以下代码部分摘自OpenJD