WHERE user_id LIKE '%#{userId}%'用mybatis语法进行优化
时间: 2023-12-10 18:39:46 浏览: 29
假设你的SQL语句类似于这样:
```
SELECT * FROM user WHERE user_id LIKE '%#{userId}%'
```
那么你可以将其优化为:
```
SELECT * FROM user WHERE user_id LIKE CONCAT('%', #{userId}, '%')
```
这样可以避免使用字符串拼接符号,更加直观和安全。在MyBatis中,使用`CONCAT`函数可以将多个字符串连接起来,而`#{}`则是占位符,可以防止SQL注入。
相关问题
AND stu_name like '%#{stu_name}%'
在 SQL 语句中使用变量时,应该使用占位符,而不是直接将变量嵌入到 SQL 语句中。这是为了防止 SQL 注入攻击,并提高 SQL 的执行效率。如果在使用 MyBatis 等 ORM 框架时,可以使用 #{} 来表示占位符,例如:
```
AND stu_name like '%${stu_name}%'
```
需要改为:
```
AND stu_name like concat('%', #{stu_name}, '%')
```
这样,在执行 SQL 语句时,MyBatis 会自动将 stu_name 的值替换到占位符 #{stu_name} 的位置上,从而避免了 SQL 注入攻击的风险。
<insert id="insertOrder" parameterType="Integer" useGeneratedKeys="true" keyProperty="order_id"> insert into orders(user_id, total) select user_id, sum(total) from cart where user_id = #{userId} </insert> <insert id="insertOrderDetail" parameterType="Integer"> insert into order_detail(order_id, book_id, num, total) select #{order_id}, c.book_id, c.num, c.total from cart c where c.user_id = #{userId} </insert> 在mapper中的两个标签里,如何设置能让insertOrder执行完之后自动执行insertOrderDetail
可以在mapper文件中使用MyBatis的<selectKey>标签来实现该需求。具体操作如下:
1. 在insertOrder标签中使用<selectKey>标签,声明order_id为生成的主键,并将其返回给order_id参数。
```
<insert id="insertOrder" parameterType="Integer" useGeneratedKeys="true" keyProperty="order_id">
<selectKey keyProperty="order_id" orderType="BEFORE" resultType="java.lang.Integer">
SELECT nextval('order_seq')
</selectKey>
insert into orders(user_id, total)
select user_id, sum(total) from cart where user_id = #{userId}
</insert>
```
2. 在insertOrderDetail标签中使用order_id参数。
```
<insert id="insertOrderDetail" parameterType="Integer">
insert into order_detail(order_id, book_id, num, total)
select #{order_id}, c.book_id, c.num, c.total
from cart c
where c.user_id = #{userId}
</insert>
```
这样,当执行insertOrder时,会先生成order_id并返回给order_id参数,然后在执行insertOrderDetail时,使用该参数插入对应的order_detail记录。