本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. mapper 文件未编译
如果mapper文件未编译,会报绑定异常。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2. statementType
使用 statementType 标记操作 SQL 的对象取值说明。注意:如果只为STATEMENT,那么 SQL 就是直接进行的字符串拼接,如果是字符串则需要【自行加上引号】如果为PREPARED,是使用的参数替换,也就是索引占位符, # 会转换为 ? 再设置对应的参数的值。
【STATEMENT】直接操作SQL,不进行预编译,使用($)获取数据。
<update id="xxx" statementType="STATEMENT">
update car set price=${price} where id=${id}
</update>
【PREPARED】【不传递 statementType 值时的默认值】预处理参数,进行预编译,使用(#)获取数据。
<update id="xxx" statementType="PREPARED">
update car set car_number=#{carNumber} where id=#{id}
</update>
【CALLABLE】执行存储过程。
<select id="xxx" statementType="CALLABLE">
{call PROCEDURE_NAME()}
</select>
$ 与 # 混用时会有报错,具体原因暂未探究。
3. 返回map时,key与select的字段顺序不一致
将 Hashmap 换成 LinkedHashMap 即可【顺序是否有意义要看业务是否需要了】
<select id="xxx" resultType="java.util.HashMap">
<select id="xxx" resultType="java.util.LinkedHashMap">
4. 获取自增ID
我们可以自己获取当前的自增ID,这个显然是有并发问题的:
SELECT
auto_increment
FROM
information_schema.`TABLES`
WHERE
table_name = 'tableName'
AND TABLE_SCHEMA = 'schemaName'
5. 一个update标签中执行多条update语句
MySql默认是不支持的,但是并不代表不能实现,只需要在jdbc的配置文件中添加 allowMultiQueries=true 这个配置即可:
url: jdbc:mysql://localhost:3306/test?allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
然后在映射文件中的标签下将多条sql用;隔开即可,示例代码:
<update id="updateBatchSingle" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close=";" separator=";">
update user
<set>
status = #{item.status}
</set>
where id = #{item.id}
</foreach>
</update>