BoundSql 不替换 MyBatis 中 SQL 语句中的参数值
BoundSql does not substitute values of parameter in SQL statement in MyBatis
我需要在 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
}
DAO
public interface TestDAO {
public void insertData(TestPojo p);
}
Mapper.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 配置xml
<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 -> 值。我知道这不是最好的解决方案,但它确实有效..
我需要在 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
}
DAO
public interface TestDAO {
public void insertData(TestPojo p);
}
Mapper.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 配置xml
<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 -> 值。我知道这不是最好的解决方案,但它确实有效..