MyBatis中如何使用insert标签呢?
创始人
2024-02-17 05:02:29
0次

转自:

MyBatis中如何使用insert标签呢?

MyBatis insert 标签的功能

 MyBatis insert标签的功能,用于定义一个插入语句,执行插入操作,
  MyBatis运行完插入操作后,将会返回所影响的数据库行数 

例:

1. 修改 UserInfoMapper.xml,增加插入语句,代码如下。

insert into UserInfo(name)values(#{name})


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 等,表示数据库厂家;元素内部可通过 来为特定数据库指定不同的 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 params);

2. 在 UserInfoMapper.xml 中,使用 insert 标签定义一条插入语句,并接收通过 Map 传递的参数,配置如下



insert into UserInfo(name, notes) values (#{name}, #{notes})


3. 测试代码如下。

Map 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 注解传递的参数,配置如下。



insert into UserInfo(name, notes) values (#{name}, #{notes})


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 传递的参数,配置如下。

 

insert into UserInfo(name, notes) values (#{name}, #{notes})


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 属性,具体代码如下:



insert into UserInfo(name,notes) values(#{name},#{notes})


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 的 标签自定义生成主键,如下





select if(max(id) is null,1,max(id)+1) as newId from UserInfo

insert into UserInfo(id,name,notes) values(#{id},#{name},#{notes})

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...