Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis 3-从映射器获取SQL字符串_Java_Sql_Mybatis - Fatal编程技术网

Java MyBatis 3-从映射器获取SQL字符串

Java MyBatis 3-从映射器获取SQL字符串,java,sql,mybatis,Java,Sql,Mybatis,我只想使用MyBatis3生成SQL字符串 使用xml映射,但获取的SQL无效 例如,我获取sql字符串: SELECT * FROM USER WHERE NAME = john 在此sql中,不存在字符串值“char”或“john” 在mybatis.xml中: 在此SQL中,字符串john不包含在'char'中 所以它不是有效的SQL,我的目的只是使用myBatis生成有效的SQL字符串。 我想要: SELECT * FROM USERS WHERE name LIKE 'john'

我只想使用MyBatis3生成SQL字符串 使用xml映射,但获取的SQL无效

例如,我获取sql字符串:

SELECT * FROM USER WHERE NAME = john
在此sql中,不存在字符串值“char”或“john”

在mybatis.xml中:

在此SQL中,字符串john不包含在'char'中 所以它不是有效的SQL,我的目的只是使用myBatis生成有效的SQL字符串。 我想要:

SELECT * FROM USERS
WHERE 
name LIKE 'john' AND num = 12345
谢谢

您应该使用{name}而不是${name}

下面的示例将生成一个有效的SQL

<mapper namespace="sql1">
    <select id="select1" parameterType="map" resultType="String" >
        SELECT * FROM USERS
        WHERE 
        name LIKE #{name} AND num = #{number}
    </select>
</mapper>
相反,您将获得sql查询模板,该模板已准备好进行参数绑定

SELECT * FROM USERS
    WHERE 
    name LIKE ? AND num = ?
将参数添加到sql字符串中允许sql注入。安全的方法是使用SQL驱动程序提供的参数绑定方法,MyBatis总是使用参数绑定

假设您手动将sql命令创建为字符串,并假设我是试图访问您的数据的恶意用户。我会写字

john' or ''='
因此,这将生成下面的sql命令:

SELECT * FROM USERS
WHERE 
name LIKE 'john' or ''='' AND num = 12345
参数绑定的其他好处 参数绑定的第二个好处是它允许准备语句。假设您需要使用不同的参数执行相同的sql 1000次

如果生成绑定了参数的sql字符串

SELECT * FROM USERS WHERE name LIKE 'john' AND num = 12345;
SELECT * FROM USERS WHERE name LIKE 'foo' AND num = 67890;
数据库服务器需要逐个解析每个sql命令,然后执行它们

使用参数化sql查询

SELECT * FROM USERS WHERE name LIKE ? AND num = ?
SQL驱动程序缓存查询,以便只进行一次解析,然后将不同的参数绑定到同一个SQL命令

更新:在MyBatis之外使用BoundSql 您仍然可以将参数化sql boundSql与另一个库或Java的Java.sql.Connection一起使用。以下是一个例子:

Connection myConnection;
PreparedStatement preparedStatement = myConnection.prepareStatement(boundSql);
preparedStatement.setString(1, "john"); //First parameter starts with 1 not 0!
preparedStatement.setInt(2, 12345);
ResultSet results = preparedStatement.executeQuery();

您可以使用它,并且必须在“%”和{}

之间放置一个空格uuu。谢谢您的回复,我刚刚尝试用{name}替换${name},但结果是:从name喜欢的用户中选择*?和num=?@Lof我已经扩展了我的答案以涵盖您的评论。您好,再次感谢。我的目的是仅将MyBatis用于sql字符串生成,因为在xml文件中编写sql的好处是。如果不在mybatis中执行sql,可能无法在sql中绑定PAR,因此我不能仅将其用于sql字符串。@Lof假设您将使用java.sql.Connection,我已更新了答案。在这种情况下,您可以不带参数地调用getBoundSql,即ms.GetBoundSqlNull谢谢您的完整回复,非常有用这不是直接可能的。你想解决什么问题?也许还有另一个解决办法,那就是缺少引用。它应该是MappedStatement ms=configuration.getMappedStatementsql1.select1;
<!--Solution One-->
<select id="select1" parameterType="map" resultType="String" >
    SELECT name FROM USERS
        WHERE 
        name LIKE #{name} AND num = #{number}
</select>

<!--Solution Two-->
<select id="select1" parameterType="map" resultType="java.util.LinkedHashMap" >
    SELECT * FROM USERS
        WHERE 
        name LIKE #{name} AND num = #{number}
</select>
List<Map<?, ?>> resultSet = sessionFactory.openSession().selectList("sql1.select1", pars);
SELECT * FROM USERS
WHERE 
name LIKE 'john' AND num = 12345
SELECT * FROM USERS
    WHERE 
    name LIKE ? AND num = ?
john' or ''='
SELECT * FROM USERS
WHERE 
name LIKE 'john' or ''='' AND num = 12345
SELECT * FROM USERS WHERE name LIKE 'john' AND num = 12345;
SELECT * FROM USERS WHERE name LIKE 'foo' AND num = 67890;
SELECT * FROM USERS WHERE name LIKE ? AND num = ?
Connection myConnection;
PreparedStatement preparedStatement = myConnection.prepareStatement(boundSql);
preparedStatement.setString(1, "john"); //First parameter starts with 1 not 0!
preparedStatement.setInt(2, 12345);
ResultSet results = preparedStatement.executeQuery();
            SELECT(" * ");
            FROM(" student ");
            WHERE(" ten LIKE '%' #{ten} '%' ");