JDBC中的命名参数

JDBC中的命名参数

是否有一个名为JDBC中,而不是那些位置参数,比如@name@city在下面的ADO.NET查询?

select * from customers where name=@name and city = @city


呼如林
浏览 877回答 3
3回答

Helenr

JDBC不支持命名参数。除非你一定要使用普通的JDBC(这会导致痛苦,让我告诉你),我建议使用Springs Excellent JDBCTemplate,它可以在没有整个IoC容器的情况下使用。NamedParameterJDBCTemplate支持命名参数,您可以像这样使用它们: NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);  MapSqlParameterSource paramSource = new MapSqlParameterSource();  paramSource.addValue("name", name);  paramSource.addValue("city", city);  jdbcTemplate.queryForRowSet("SELECT * FROM customers WHERE name = :name AND city = :city", paramSource);

炎炎设计

为了避免包含大型框架,我认为一个简单的自制类可以做到这一点。处理命名参数的类示例:public&nbsp;class&nbsp;NamedParamStatement&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;NamedParamStatement(Connection&nbsp;conn,&nbsp;String&nbsp;sql)&nbsp;throws&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;pos; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((pos&nbsp;=&nbsp;sql.indexOf(":"))&nbsp;!=&nbsp;-1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;end&nbsp;=&nbsp;sql.substring(pos).indexOf("&nbsp;"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(end&nbsp;==&nbsp;-1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;sql.length(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;+=&nbsp;pos; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields.add(sql.substring(pos+1,end)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;sql.substring(0,&nbsp;pos)&nbsp;+&nbsp;"?"&nbsp;+&nbsp;sql.substring(end); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepStmt&nbsp;=&nbsp;conn.prepareStatement(sql); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;PreparedStatement&nbsp;getPreparedStatement()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;prepStmt; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResultSet&nbsp;executeQuery()&nbsp;throws&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;prepStmt.executeQuery(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;close()&nbsp;throws&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepStmt.close(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setInt(String&nbsp;name,&nbsp;int&nbsp;value)&nbsp;throws&nbsp;SQLException&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepStmt.setInt(getIndex(name),&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;getIndex(String&nbsp;name)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fields.indexOf(name)+1; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;PreparedStatement&nbsp;prepStmt; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List<String>&nbsp;fields&nbsp;=&nbsp;new&nbsp;ArrayList<String>();}调用类的示例:String&nbsp;sql;sql&nbsp;=&nbsp;"SELECT&nbsp;id,&nbsp;Name,&nbsp;Age,&nbsp;TS&nbsp;FROM&nbsp;TestTable&nbsp;WHERE&nbsp;Age&nbsp;<&nbsp;:age&nbsp;OR&nbsp;id&nbsp;=&nbsp;:id";NamedParamStatement&nbsp;stmt&nbsp;=&nbsp;new&nbsp;NamedParamStatement(conn,&nbsp;sql);stmt.setInt("age",&nbsp;35);stmt.setInt("id",&nbsp;2);ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery();请注意,上面的简单示例不会处理两次使用命名参数。它也不处理使用:引号内的符号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java