使用 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]);
是否适用于任何类型的数据 ->(String
、Integer
、Double
等...)? 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 的参数化查询的主要内容,如果未能解决你的问题,请参考以下文章