MyBatis中如何使用insert标签呢?

Java-框架王 MyBatis 发布时间:2021-07-19 16:08:38 阅读数:11889 1


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 属性,只有查询操作才需要对返回结果类型进行相应的指定 

传递多个参数

上例中只讲述了一个参数的写法,实际情况中,往往会有大量的参数,那么此时我们该如何处理呢?下文将讲述其它的参数传递方法,如下所示: 

  1. 使用 Map 传递参数
  2. 使用注解传递参数
  3. 使用 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>

 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/MyBatis/202107/537.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者