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})

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...