MyBatis中如何使用insert标签呢?
MyBatis insert 标签的功能
MyBatis insert标签的功能,用于定义一个插入语句,执行插入操作,
MyBatis运行完插入操作后,将会返回所影响的数据库行数
1. 修改 UserInfoMapper.xml,增加插入语句,代码如下。
<insert id="addUserInfo" parameterType="string"> insert into UserInfo(name) values(#{name}) </insert>
2. 在 UserInfoMapper 接口中定义一个 add() 方法,代码
public int addUserInfo(String name); /* 参数说明: 参数为 Sting 类型的字符串 返回值为 int 类型 即运行SQL 后,返回插入操作影响的行数 */
3. 测试代码
//插入 name 为"java265"的记录 String name = "java265"; int i = userInfoMapper.addWebsite(name); System.out.println("共插入了 " + i + " 条记录");
4. 运行测试代码,控制台输出如下
共插入了 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 等,表示数据库厂家;元素内部可通过 <if test="_databaseId = 'oracle'"> 来为特定数据库指定不同的 sql 语句。 | MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 |
keyColumn | 该属性用于设置第几列是主键,当主键列不是表中的第 1 列时,就需要设置该属性。如果是联合主键,可以将多个值用逗号隔开。 | - |
注意事项:
insert 关键字中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定
传递多个参数
上例中只讲述了一个参数的写法,实际情况中,往往会有大量的参数,那么此时我们该如何处理呢?下文将讲述其它的参数传递方法,如下所示:
- 使用 Map 传递参数
- 使用注解传递参数
- 使用 JavaBean 传递参数
使用 Map 传递参数
我们可以将参数封装到一个 Map 对象中,然后传递给 MyBatis 的映射器,示例如下。1. 在 UserMapper 接口中,定义一个 addUserByMap() 方法,并使用 Map 传递参数,方法如下。
int addUserInfoByMap(Map<String, String> params);2. 在 UserInfoMapper.xml 中,使用 insert 标签定义一条插入语句,并接收通过 Map 传递的参数,配置如下
<!--接收 Map 参数--> <insert id="addUserInfoByMap" parameterType="map"> insert into UserInfo(name, notes) values (#{name}, #{notes}) </insert>
3. 测试代码如下。
Map<String, String> params = new HashMap<>(); params.put("name", "Java265"); params.put("url", "我是Java爱好者"); int i = userInfoMapper.addUserInfoByMap(params); System.out.println("通过 Map 成功向数据库中添加了 " + i + " 条记录");
4. 执行测试代码,控制台输出如下。
通过 Map 成功向数据库中添加了 1 条记录
使用注解传递参数
下文中讲述MyBatis 使用@Param 注解给注解器传递参数,示例代码如下。1. 在 UserInfoMapper 接口中,定义一个 addUserInfoByParam() 方法,并使用 @Param 注解传递参数,方法如下
int addUserInfoByParam(@Param("name") String name, @Param("notes") String notes);
2. 在 UserInfoMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 @Param 注解传递的参数,配置如下。
<!--接收 @Param 注解传递的参数--> <insert id="addUserInfoByParam"> insert into UserInfo(name, notes) values (#{name}, #{notes}) </insert>
3. 测试代码如下。
int i = userInfoMapper.addUserInfoByParam("java265", "java爱好者"); System.out.println("通过 @Param 注解成功向数据库中添加了 " + i + " 条记录");
4. 执行测试代码,控制台输出以下信息---
通过 @Param 注解成功向数据库中添加了 1 条记录
使用 JavaBean 传递参数
当参数过多的情况下,我们可以将参数封装到实体类中,然后传递给映射器1. 在 UserInfoMapper 接口中,定义一个 addUserInfoByJavaBean() 方法,并使用 JavaBean 传递参数,方法如下。
int addUserInfoByJavaBean(UserInfo userInfo);
2. 在 UserInfoMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 JavaBean 传递的参数,配置如下。
<!--接收通过 JavaBean 传递的参数--> <insert id="addUserInfoByJavaBean" parameterType="com.java265.www.po.UserInfo"> insert into UserInfo(name, notes) values (#{name}, #{notes}) </insert>
3. 测试代码如下。
//创建 JavaBean 对象 UserInfo userInfo = new UserInfo(); //将参数封装 userInfo.setName("Java JavaBean"); userInfo.setNotes("Java爱好者"); int i = userInfoMapper.addUserInfoByJavaBean(userInfo); System.out.println("通过 JavaBean 成功向数据库中添加了 " + i + " 条记录");
4. 执行测试代码,控制台输出如下。
通过 JavaBean 成功向数据库中添加了 1 条记录
主键(自动递增)填写
我们都知道 MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键, 那么MyBatis如何设置呢?1. 为 UserInfoMapper.xml 中 id 为 addUserInfo 的 insert 标签添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下:
<!--添加一个网站信息,成功后将主键值返回填给id(po的属性)--> <insert id="addUserInfo" parameterType="com.java265.po.UserInfo" keyProperty="id" useGeneratedKeys="true"> insert into UserInfo(name,notes) values(#{name},#{notes}) </insert>
2. 测试代码如下:
// 添加一个网站信息 UserInfo userInfo= new UserInfo(); //插入的对象中不包含主键 id userInfo.setName("Java265"); userInfo.setNotes("Java爱好者"); //执行插入 int num = userInfoMapper.addUserInfo(userInfo); System.out.println("添加了 " + num + " 条记录"); //获取回填的主键 System.out.println("添加记录的主键是:" + addsite.getId());
3. 执行测试代码,控制台输出如下。
添加了 1 条记录 添加记录的主键是:3
自定义主键
在一些实际项目中, 当数据库不支持递增生成主键时,我们可以使用MyBatis 的 <selectKey> 标签自定义生成主键,如下<!-- 添加一个网站,#{name}为 com.java265.po.UserInfo的属性值 --> <insert id="insertUserInfo" parameterType="com.java265.po.UserInfo"> <!-- 先使用selectKey标签定义主键,然后再定义SQL语句 --> <selectKey keyProperty="id" resultType="Integer" order="BEFORE"> select if(max(id) is null,1,max(id)+1) as newId from UserInfo </selectKey> insert into UserInfo(id,name,notes) values(#{id},#{name},#{notes}) </insert>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。