MyBatis insert标签
MyBatis insert 标签用来定义插入语句,执行插入操作。当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。
下面通过一个示例演示 insert 标签的具体用法。
- 修改 RoleMapper.xml,增加插入语句,代码如下。
<insert id="insertRole" parameterType="role">
INSERT INTO role VALUES(#{id},#{name})
</insert>
- 在 RoleMapper 接口中定义一个 insertRole(Role role) 方法,代码如下。
public void insertRole(Role role);
参数为 Sting 类型的字符串;返回值为 int 类型,即执行 SQL 后,插入记录的行数。
- 测试代码如下。
Role role=new Role();
role.setRoleId(UUID.randomUUID().toString().replace("-",""));
role.setRoleName("网站维护人员");
roleMapper.insertRole(role);
- 执行测试代码,控制台输出如下。
16:10:22 [main] DEBUG cn.edu.guet.mapper.RoleMapper.insertRole - ==> Preparing: INSERT INTO role VALUES(?,?)
16:10:22 [main] DEBUG cn.edu.guet.mapper.RoleMapper.insertRole - ==> Parameters: a9bc8a343106448a8061115b598f6724(String), 网站维护人员(String)
16:10:22 [main] DEBUG cn.edu.guet.mapper.RoleMapper.insertRole - <== Updates: 1
1、insert 标签常用属性
insert 标签中常用的属性如下表。
属性名称 | 描述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
keyProperty | 该属性的作用是将插入操作的返回值赋给 PO 类的某个属性,通常为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
useGeneratedKe | 该属性用来设置,是否使用 JDBC 提供的 getGenereatedKeys() 方法,获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中,例如 MySQL、SQL Server 等自动递增的字段,其默认值为 false。 | 该属性值设置为 true 后,会将数据库生成的主键回填到请求对象中,以供其他业务使用。 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置执行该操作的最大时限,如果超时,就抛异常。 | - |
databaseId | 取值范围 oracle、mysql 等,表示数据库厂家;元素内部可通过 来为特定数据库指定不同的 sql 语句。 | MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 |
keyColumn | 该属性用于设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
注意:insert 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。
2、传递多个参数
和7.2节中传递多个参数的方式完全一样,可以参考7.2
3、主键(自动递增)回填
我们知道,MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。
一些特殊情况下,我们可能需要将这个刚刚生成的主键回填到请求对象(原本不包含主键信息的请求对象)中,供其他业务使用。此时,我们就可以通过在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性,来实现该功能。
下面我们通过一个示例,来演示主键(自动递增)回填功能。
- 为 UserMapper.xml 中 id 为 insertUser 的 insert 标签添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下:
<insert id="insertUser" keyProperty="id" useGeneratedKeys="true" parameterType="user">
INSERT INTO user(name) VALUES(#{name})
</insert>
- 测试代码如下:
UserMapper userMapper=sqlsession.getMapper(UserMapper.class);
User user=new User();
user.setName("liwei");
userMapper.insertUser(user);
System.out.println("回填id:"+user.getId());
- 执行测试代码,控制台输出如下。
16:37:13 [main] DEBUG cn.edu.guet.mapper.UserMapper.insertUser - ==> Preparing: INSERT INTO user(name) VALUES(?)
16:37:13 [main] DEBUG cn.edu.guet.mapper.UserMapper.insertUser - ==> Parameters: liwei(String)
16:37:13 [main] DEBUG cn.edu.guet.mapper.UserMapper.insertUser - <== Updates: 1
回填id:3
4、自定义主键
如果在实际项目中,若数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,我们可以使用 MyBatis 的 标签自定义生成主键,具体配置代码如下。
<!-- 添加一个角色,#{name}为 cn.edu.guet.bean.User 的属性值 -->
<insert id="saveUser" parameterType="user">
<selectKey resultType="integer" order="BEFORE" keyProperty="id">
SELECT NVL2(MAX(id),MAX(id)+1,1) as id FROM t_users
</selectKey>
INSERT INTO t_users (id,name) VALUES(#{id},#{name})
</insert>
标签中属性说明如下:
- keyProperty:用于指定主键值对应的 PO 类的属性。
- order:该属性取值可以为 BEFORE 或 AFTER。BEFORE 表示先执行 标签内的语句,再执行插入语句;AFTER 表示先执行插入语句再执行 标签内的语句。
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@120.77.235.6:1521:orcl"/>
<property name="username" value="liwei"/>
<property name="password" value="LiLanqiao8U"/>