Java 如何使用动态参数替换将sql语句外部化?
我想为数据库操作提供RESTWebService。SQL语句应该在本地文件中外部化(而不是在代码中) 还可以在外部文件中定义参数类型 通常情况下,一份声明应写成:Java 如何使用动态参数替换将sql语句外部化?,java,sql,spring,Java,Sql,Spring,我想为数据库操作提供RESTWebService。SQL语句应该在本地文件中外部化(而不是在代码中) 还可以在外部文件中定义参数类型 通常情况下,一份声明应写成: String sql = "SELECT * from user_table WHERE id=?"; PreparedStatement stm = c.prepareStatement(sql); stm.setInt(1, 345); //stm.setString(2, "username"); stm.executeUpda
String sql = "SELECT * from user_table WHERE id=?";
PreparedStatement stm = c.prepareStatement(sql);
stm.setInt(1, 345);
//stm.setString(2, "username");
stm.executeUpdate();
问题:如果我只是从文件导入sql语句
,我必须事先知道参数类型(以及参数的数量)。因此,必须或多或少地对获取语句进行硬编码
但是我希望能够在运行时替换sql语句(例如添加或删除参数),而不必接触java代码。因此,我可以在不重新启动服务的情况下更改sql
Like(伪代码):
从id=?的用户_表中选择*?名称=?
然后只需向sql语句提供映射中的参数
问:是否有任何现有框架提供了这样一种机制,用于在外部文件中模板化sql。并向sql语句提供来自HashMap
的参数(例如可以通过POST
动态地从Web服务接收)
旁注:文件中的sql必须是本机sql。我不能使用如HSQL或类似的。
旁注2:我不是在寻找ORM,我知道数据库和JavaBean之间有hibernate映射。但我对将sql结果映射到bean不感兴趣。我的重点是能够在无需重新编译的情况下动态交换sql语句。我不确定是否在跟踪您。你好像在说ORM。特别是如果您的问题是“是否有任何现有框架提供了这样一种在外部文件中模板化sql的机制”。但在之前,当您讨论参数类型时,会让它听起来有些不同。请澄清一下,我想把sql放在一个外部文件中,例如xml文件。该文件中的sql语句应该在运行时可以更改,这样我就可以执行修改后的sql,而无需重新部署或重新启动。要输入sql的参数来自JSON POST请求。因此,应该动态地将其设置到该sql中(从xml文件读取)。因此,我可以引入一个附加的
,其中name=?
,通过webservice提供一个附加参数,然后可以直接运行sql.NamedParameterSJDBCTemplate?否。在本例中,您可以看到它们对SELECT*
语句使用显式类型,例如Integer.valueOf(empid)
。我的意图是独立于类型,否则我无法在运行时更改sql语句。
<definition>
<sql id="getUsers">
<statement>SELECT * from user_table WHERE id=? and name=?</statement>
<param idx="1" type="Integer"/>
<param idx="2" type="String"/>
</sql>
</definition>