为啥mybatis在执行查询时会报SQL语法错误?
Posted
技术标签:
【中文标题】为啥mybatis在执行查询时会报SQL语法错误?【英文标题】:Why does mybatis complain for SQL syntax error while executing query?为什么mybatis在执行查询时会报SQL语法错误? 【发布时间】:2020-04-27 18:36:34 【问题描述】:我有一个 Mybatis 映射器,它应该在数据库表中创建一个条目。映射器定义如下-
<select id="saveUser" parameterType="User" resultMap="UserResultMap">
DROP TEMPORARY TABLE IF EXISTS temp_role_id;
CREATE TEMPORARY TABLE temp_role_id(id int);
INSERT INTO temp_role_id VALUES
<foreach collection="roles" item="role" separator=",">
($role.id)
</foreach>;
call insert_user_sp('$name', '$username', '$email', '$password');
</select>
存储过程定义如下-
DELIMITER //
CREATE PROCEDURE insert_user_sp(
u_name VARCHAR(40),
u_username VARCHAR(20),
u_email VARCHAR(40),
u_password VARCHAR(100)
)
BEGIN
INSERT INTO users(name, username, email, password)
VALUES(u_name, u_username, u_email, u_password);
SET @v_user_id = last_insert_id();
INSERT INTO user_roles(user_id, role_id)
SELECT @v_user_id, id from temp_role_id;
DROP TEMPORARY TABLE IF EXISTS temp_role_id;
SELECT id, name, username, email, password, created_at, modified_at
FROM users where id = @v_user_id;
END //
DELIMITER ;
mybatis给出的错误说明如下-
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'CREATE TEMPORARY TABLE temp_role_id(id int);
INSERT INTO temp_role_id VA' at line 2
### The error may exist in mybatis/mappers/UserMapper.xml
### The error may involve UserMapper.saveUser-Inline
### The error occurred while setting parameters
### SQL: DROP TEMPORARY TABLE IF EXISTS temp_role_id; CREATE TEMPORARY TABLE temp_role_id(id int); INSERT INTO temp_role_id VALUES (4) ; call insert_user_sp('Ujjal Das', 'ujjaldas223', 'ujjaldas223@gmail.com', '$2a$10$JlIb3BRXffYhMV8j9Wy2OuG2Wu53lGrHKexKspErzhi/JGwMhsvoO');
但是当我在mysql中执行同样的查询时,它执行得很愉快。
如果mysql执行同样的查询没有问题,为什么mybatis报同样的问题?
【问题讨论】:
您的连接方式似乎不支持多查询(一条语句中有多个查询)。 【参考方案1】:如果你使用 xml,你必须像这样使用它。
<![CDATA[your_symbol_that_error_came]]>
例如,您想使用<=
符号,代码如下所示,
<![CDATA[<=]]>
【讨论】:
【参考方案2】:糟糕,搜索量太大了。
正如@Akina 指出的那样,jdbc mysql out 不支持多查询。
如果有人遇到同样的问题,请查看solution。
【讨论】:
以上是关于为啥mybatis在执行查询时会报SQL语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
mybatis中查询时会将查询改成select count,这是为啥
SQL 中的 Pivot 语法错误,为啥我得到不正确的结果?