使用 JDBC 的参数化查询

Posted

技术标签:

【中文标题】使用 JDBC 的参数化查询【英文标题】:Parametrized Query Using JDBC 【发布时间】:2014-07-22 04:02:09 【问题描述】:

是否可以创建一个标准方法来使用 JDBC 执行从 Java 到 SQL Server 的参数化查询?

以下是我创建数据库连接池的方法:

    static ConnectionPool pool;
    public static void crearPool()
        try 
            Class c = Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Driver driver = (Driver) c.newInstance();
            DriverManager.registerDriver(driver);
            String url = "jdbc:sqlserver://localhost:1433;database=STAZIONE;";
            pool = new ConnectionPool("local",5, 20, 40, 180, url, "b_lightyear", "BeyondInfinity");
         catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException ex) /*Error Message*/
    

我认为每个 DML 查询 的标准方法如下:

    public static int QueryDML(String consulta,Object []data)
        int result = 0;
        PreparedStatement prpdStm = null;
        try
            Connection cnx = pool.getConnection(clsConexion.espera);
            if(conexion!=null)
                prpdStm = conexion.prepareStatement(consulta,,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                for(int position =1; position<data.length;position++)
                    prpdStm.setObject(position, data[position-1]);
                result = prpdStm.executeUpdate();
             else/*Message*/
         catch (SQLException ex) /*Error Message*/
        return result;
    

我想知道的是 prpdStm.setObject(position, data[position-1]); 是否适用于任何类型的数据 ->(StringIntegerDouble 等...)? p>

【问题讨论】:

你好像有密码...你试过了吗? @Jason 还没有,我做到了,但后来我问自己通过使用 setObject 设置参数值是否有任何问题,现在我知道它没有任何问题,但在此之前,我想对这种执行查询的方式提出一些意见 【参考方案1】:

我想知道的是如果 prpdStm.setObject(position, data[position-1]);将适用于任何类型的数据 ->(字符串、整数、双精度等...)?

简短回答:是的。

PreparedStatement.setObject() JavaDoc 的答案稍长-

JDBC 规范指定了从 Java 对象类型到 SQL 类型的标准映射。给定的参数将在发送到数据库之前转换为相应的 SQL 类型。

【讨论】:

谢谢,您是否从该方法中检查了整个代码?您认为这是一种创建发送查询的方法的好方法(例如“INSERT INTO [TABLE & COLUMNS] VALUES (?,?,?)") 和一个包含每个参数值的数组?还是您认为有更好的方法? 我没有执行完整的codereview,但您可以在那里发帖。像这样默默地吞下 Exception 是一个可怕的想法。我可能会将查询存储在单独的查询 xml 文件中。另外,我可能会注入池。 你说的那些东西是怎么做的,存储查询un xml文件并注入池? 尝试在网络上查找依赖注入,MyBatis 甚至 JdbcTemplate 都可以做到这一点,但由于某种原因,这种类型的问题是题外话。 你能举个例子吗?

以上是关于使用 JDBC 的参数化查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis的sql参数化查询

Jmeter之JDBC请求参数化

Hana 参数化存储过程问题简单 jdbc 模板

jmeter(四十六)参数化与断言实战

Jmeter配置元件——JDBC Connection Configuration参数化

JDBC 参数化的方法