SQL []; 执行未准备SQL语句; nested exception is java.sql.

把项目部署linux上报错:; SQL []; 执行未准备SQL语句; nested exception is java.sql.

xml的sql是:

SELECT <include refid="Base_Column_List" />
		FROM ORGANIZATION where ORG_CODE
		in
		<foreach collection="orgCodes" index="index" item="id" open="(" separator="," close=")">
			${id}
		</foreach>

集合orgCodes的数据为[-1, 01, 0101, 0102]

后台输出的SQL是:

SELECT
        ORG_ID     ,
        ORG_CODE   ,
        ORG_NAME   ,
        PARENT_CODE,
FROM
        ORGANIZATION
where
        ORG_CODE in 
        ( com.aestit:aestit-sso-server-gch:war:1.1.1, 
        com.aestit:aestit-sso-server-gch:war:1.1.1, 
        com.aestit:aestit-sso-server-gch:war:1.1.1, 
        com.aestit:aestit-sso-server-gch:war:1.1.1 
       )

后来查资料说:orgCodes集合中的元素被误解释为Maven的GAV(GroupId, ArtifactId, Version)格式,

解决方式:把  ${id}  改成 #{id}

 

补充 : ${} 和 #{} 去区别

${}:这是一个参数占位符,用于在 SQL 查询中引用变量或参数。${} 允许在查询中直接插入变量值,并且变量值会被直接替换到查询中。这意味着在执行查询之前,变量值会被解析并插入到查询字符串中。

#{}:这是一个预处理器指令,用于在 SQL 查询中引用变量或参数。与 ${} 不同,#{} 会在查询执行之前被预处理器处理,而不是在查询执行时。这意味着变量值在查询执行之前就已经被解析和替换。

区别:

  • ${} 是直接在查询执行时替换变量值,而 #{} 是在查询执行之前进行替换。
  • ${} 的替换是简单的字符串替换,容易受到 SQL 注入攻击,因此在使用时需要格外小心。#{} 由于在预处理器中进行处理,相对更安全一些。
  • 在性能方面,${} 的替换方式可能会更快一些,因为它只在查询执行时进行替换,而 #{} 需要在预处理器中进行处理。但在大多数情况下,这个性能差异是可以忽略不计的。

总之,${}#{} 在 SQL 中用于引用变量或参数,但它们在处理和安全性方面有所不同。通常情况下,建议使用 #{} 来引用变量或参数,因为它更安全且不易受到 SQL 注入攻击。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"could not open jdbc connection for transaction; nested exception is java.sql.exception"这个错误通常是由于数据库连接池中的连接数已满或数据库连接配置错误导致的。以下是解决此问题的一些方法: 1. 检查数据库连接配置是否正确,包括数据库URL、用户名和密码等信息。 2. 检查数据库连接池中的连接数是否已满,如果是,则需要增加连接池的大小。 3. 检查数据库是否正常运行,如果数据库出现故障,则需要修复数据库。 4. 检查应用程序中是否存在数据库连接泄漏,如果是,则需要修复应用程序中的代码。 ```java //以下是一个Java代码示例,用于连接数据库执行查询操作 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcExample { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取数据库连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 创建Statement对象 stmt = conn.createStatement(); // 执行查询语句 rs = stmt.executeQuery("SELECT * FROM user"); // 处理查询结果 while (rs.next()) { System.out.println(rs.getString("name")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值