MyBatis - 增删改、动态 SQL
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
动态 SQL
动态 SQL 参考文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
以下标签都是在 mapper 中使用,实现动态 SQL
if 标签
<select id="dynamicSQL" parameterType="Map" resultType="com.mj.bean.Skill">
SELECT * FROM contact WHERE 1 = 1
<if test="keyword != null">
AND name LIKE #{keyword}
</if>
<if test="beginDay != null">
AND created_time > #{beginDay}
</if>
<if test="endDay != null">
AND created_time < #{endDay}
</if>
</select>
where 标签
<select id="dynamicSQL" parameterType="Map" resultType="com.mj.bean.Skill">
SELECT * FROM contact
<where>
<if test="keyword != null">
AND name LIKE #{keyword}
</if>
<if test="beginDay != null">
AND created_time > #{beginDay}
</if>
<if test="endDay != null">
AND created_time < #{endDay}
</if>
</where>
</select>
sql 标签
sql 标签用于抽取公共的 sql 语句
<sql id="sqlListAll">
SELECT * FROM skill
</sql>
<select id="list" resultType="com.mj.bean.Skill">
<include refid="sqlListAll">
</select>
<select id="get" parameterType="int" resultType="com.mj.bean.Skill">
<include refid="sqlListAll" /> WHERE id = #{id}
</select>
foreach 标签
可见下面的批量添加、批量删除
添加
<insert id="insert" parameterType="com.mj.bean.Skill">
INSERT INTO skill(name, level) VALUES(#{name}, #{level})
</insert>
注意:openSession 的参数默认值是 false,不自动提交事务
Skill skill = new Skill();
skill.setLevel(3);
skill.setName("打架");
session.insert("skill.insert", skill);
session.commit();
主键设置
设置新插入记录的主键 (id) 到参数对象中:
<insert id="insert" parameterType="com.mj.bean.Skill">
INSERT INTO skill(name, level) VALUES (#{name}, #{level})
<selectKey resultType="int" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
还有一种方法:使用 useGeneratedKeys、keyProperty 属性
- 需要数据库驱动支持,比如可以适用于 MySQL,不适用于 Oracle
<insert id="insert"
useGeneratedKeys="true"
keyProperty ="id"
parameterType="com.mj.bean.Skill">
INSERT INTO skill(name, level) VALUES (#{name}, #{level})
</insert>
批量添加 - 利用 foreach 标签
<insert id="batchInsert"
useGeneratedKeys="true"
keyProperty="id"
parameterType="List">
INSERT INTO skill(name, level) VALUES
<foreach collection="list" item="skill" separator=",">
(#{skill.name}, #{skill.level})
</foreach>
</insert>
List<Skill> skills = new ArrayList<>();
skills.add(new Skill("Java1", 111));
skills.add(new Skill("Java2", 222));
session.insert("skill.batchInsert", skills);
批量添加的效率比【多次单个添加】要高,但是它无法使用 <selectedKey>
获取新插入记录的主键
- 可以使用 useGeneratedKeys 获取主键
批量操作生成的 SQL 语句可能会比较长,有可能会超过数据库的限制
如果传进来的参数是 List,collection 属性值为 list 就可以遍历这个 List
如果传进来的参数是数组,collection 属性值为 array 就可以遍历这个数组
更新
<update id="update" parameterType="com.mj.bean.Skill">
UPDATE skill SET name = #{name}, level = #{level} WHERE id = #{id}
</update>
Skill skill = new Skill("Java", 666);
skill.setId(21);
session.update("skill.update", skill);
删除
<delete id="delete" parameterType="int">
DELETE FROM skill WHERE id = #{id}
</delete>
session.delete("skill.delete", 10;
批量删除 - 利用 foreach 标签
利用 foreach 和 collection=":list"
批量删除:Java 代码中传入 List
<delete id="batchDelete" parameterType="List">
DELETE FROM skill WHERE id IN (
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
List<Integer> ids = new ArrayList<>();
ids.add(23);
ids.add(24);
session.insert("skill.batchDelete", ids);
利用 foreach 和 collection="array"
批量删除:Java 代码中传入数组
<delete id="batchDelete" parameterType="List">
DELETE FROM skill WHERE id IN
<foreach collection="array"
item="id"
open="("
close=")"
separator=",">
#{id}
</foreach>
</delete>
Integer[] ids = {23, 24, 25, 26};
session.insert("skill.batchDelete", ids);
typeAliases 标签
添加到 mybatis-config.xml 的 configuration 标签中
- 用于设置类型的别名(不区分大小写)
<!-- 别名 -->
<typeAliases>
<!-- 一旦设置了别名,它是不区分大小写的 -->
<typeAlias type="com.mj.bean.Skill" alias="skill" />
<typeAlias type="com.mj.common.DruidDataSourceFactory" alias="druid" />
</typeAliases>
<!-- 别名 -->
<typeAliases>
<!-- 这个包下的所有类, 都会起一个别名: 全类名的最后一个单词 -->
<package name="com.mj.bean" />
</typeAliases>
别名相关文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases
- mybatis 中自带了很多别名,例如:string、int、integer 等
因此实际上使用这些类型时是不区分大小写的,建议按标准写