4.3 insert 元素
4.3.1 概述
insert 元素,相对于 select 元素而言要简单许多。MyBatis 会在执行插入之后返回一个整数,以表示你进行操作后插入的记录数。insert 元素配置详解,如表 4-4 所示。
表 4-4 insert 元素配置详解
虽然元素也不少,但是我们实际操作中常用的元素只有几个,并不是很难掌握,让我们做一个插入角色的操作。首先需要在映射器中定义我们的插入语句,如代码清单 4-10 所示。
代码清单 4-10:插入实例
<insert parameterType="role" id ="insertRole"> insert into t_role(role_name, note) values(#{roleName}, #{note}) </insert>
4.3.2 主键回填和自定义
现实中有许多我们需要处理的问题,例如,主键自增字段;MySQL 里面的主键需要根据一些特殊的规则去生成,在插入后我们往往需要获得这个主键,以便于未来的操作,而 MyBatis 提供了实现的方法。
首先我们可以使用 keyProperty 属性指定哪个是主键字段,同时使用 useGeneratedKeys 属性告诉 MyBatis 这个主键是否使用数据库内置策略生成。
我们的例子中 t_role 表就是指定了 id 列为自增字段。因此我们建立 POJO,它能提供 setter 和 getter 方法,这样便能够使用 MyBatis 的主键回填功能了。
那么我们可以在 XML 中进行如代码清单 4-11 所示的配置。
代码清单 4-11:插入后自动返回主键
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id"> insert into t_role(role_name, note) values (#{roleName}, #{note}) </insert>
这样我们传入的 role 对象就无需设置 id 的值,MyBatis 会用数据库的设置进行处理。这样做的好处是在 MyBatis 插入的时候,它会回填 JavaBean 的 id 值。我们进行调试,在插入后,它自动填充主键,方便以后使用。
让我们测试一下这个功能,如代码清单 4-12 所示。
代码清单 4-12:主键回填测试
sqlSession = SqlSessionFactoryUtil.openSqlSession(); RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); Role role = new Role(); role.setRoleName("test4"); role.setRoleName("test4Note"); roleMapper.insertRole(role); System.err.println(role.getId());
让我们看看调试的结果,如图 4-1 所示。
图 4-1 调试的结果
实际工作往往不是我们想象的那么简单,需要根据一些特殊的关系设置主键 id 的值。假设我们取消表 t_role 的 id 自增的规则,我们的要求是:如果表 t_role 没有记录,则我们需要设置 id=1,否则我们就取最大 id 加 2,来设置新的主键,对于一些特殊要求,MyBatis 也提供了应对方法。
这个时候我们可以使用 selectKey 元素进行处理,操作方法如代码清单 4-13 所示。
代码清单 4-13:使用自定义主键生成规则
<insert id ="insertRole" parameterType="role" useGeneratedKeys= "true" keyProperty="id"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select if(max(id) is null, 1, max(id) + 2) as newId from t_role </selectKey> insert into t_role(id, role_name, note) values (#{id}, #{roleName}, #{note}) </insert>
这样我们就能定义自己的规则来生成主键了,MyBatis 的灵活性也得以体现。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论