gpt4 book ai didi

java - BoundSql 不替换 MyBatis 中 SQL 语句中的参数值

转载 作者:行者123 更新时间:2023-11-29 00:01:59 24 4
gpt4 key购买 nike

我需要在 MyBatis 中打印生成的 SQL 但不执行它。我已经尝试过主题中的程序:Can I use MyBatis to generate Dynamic SQL without executing it? .它的工作原理除了一件事。有 '?'符号而不是打印 SQL 中的数据。所以它看起来就像这样:

insert into testTable (name, data) values (?,?)

这是我使用的代码:

波乔

public class TestPojo {
Integer id;
String name;
String data;
//Ommitted getters and setters
}

public interface TestDAO {
public void insertData(TestPojo p);
}

映射器.xml

<mapper namespace="package.TestDAO">

<resultMap id="testResult" type="TestPojo" >
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="data" property="data" jdbcType="VARCHAR"/>
</resultMap>

<insert id="insertData" parameterType="TestPojo">
insert into testTable (name, data) values (#{name},#{data})
</insert>

</mapper>

MyBatis 配置文件

<configuration>
<!--misc settings -->
<settings>
<setting name="lazyLoadingEnabled" value="false" />
</settings>

<typeAliases>
<typeAlias type="package.TestPojo" alias="TestPojo" />
</typeAliases>
<!--XML mappers -->
<mappers>
<mapper resource="database/TestMapper.xml" />
</mappers>
</configuration>

最后,我使用以下代码获取了 SQL:

Configuration configuration = sqlSessionFactory.getConfiguration();
MappedStatement ms = configuration.getMappedStatement("insertData");
BoundSql boundSql = ms.getBoundSql(new TestPojo("Jeff", "The funny guy"));
System.out.println("SQL: \n" + boundSql.getSql());

我做错了什么?

最佳答案

好吧,仍然不知道为什么它不起作用。所以我编写了可以完成这项工作的简单方法。

public void createSQLReportItem(MappedStatement ms) {
BoundSql boundSql = ms.getBoundSql(originalRec);
List<ParameterMapping> params = boundSql.getParameterMappings();

finalSql = boundSql.getSql();
finalSql = finalSql.replaceAll("\\s", " ");
finalSql = finalSql.replaceAll("[ ]{2,}", " ");

for (ParameterMapping pm : params) {
if (paramMapping.containsKey(pm.getProperty())) {
finalSql = finalSql.replaceFirst("\\?", paramMapping.get(pm.getProperty()));
}
}
}

其中 originalRec 是语句的参数,paramMapping 是我自己的包含映射的映射 - param_name -> value。我知道这不是最好的解决方案,但它确实有效..

关于java - BoundSql 不替换 MyBatis 中 SQL 语句中的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29366501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com