MyBatis insert 标签用来定义插入语句,执行插入操作。当 MyBatis 执行完一条插入语句后,就会返回其影响数据库的行数。 下面通过一个示例演示 insert 标签的具体用法。 1. 修改 WebsiteMapper.xml,增加插入语句,代码如下。 <!-- 增加网站信息 --> <insert id="addWebsite" parameterType="string"> insert into website(name) values(#{name})</insert>12345复制代码类型:[java] 2. 在 WebsiteMapper 接口中定义一个 add() 方法,代码如下。 public int addWebsite(String name);1复制代码类型:[java] 参数为 Sting 类型的字符串;返回值为 int 类型,即执行 SQL 后,插入记录的行数。 3. 测试代码如下。 //插入 name 为开课吧4 的记录String name = "开课吧4";int i = websiteMapper.addWebsite(name); System.out.println("共插入了 " + i + " 条记录");1234复制代码类型:[java] 4. 执行测试代码,控制台输出如下。 共插入了 1 条记录1复制代码类型:[java] insert 标签常用属性insert 标签中常用的属性如下表。
注意:insert 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。 传递多个参数在上面的示例中,我们在插入语句中只使用了一个 String 类型的参数,而在实际的开发过程中,我们的插入语句往往需要使用多个参数,Mybatis 为我们提供以下 3 种方式,来实现给映射器传递多个参数: 使用 Map 传递参数 使用注解传递参数 使用 JavaBean 传递参数 使用 Map 传递参数 我们可以将参数封装到一个 Map 对象中,然后传递给 MyBatis 的映射器,示例如下。 1. 在 WebsiteMapper 接口中,定义一个 addWebsiteByMap() 方法,并使用 Map 传递参数,方法如下。 int addWebsiteByMap(Map<String, String> params);1复制代码类型:[java] 2. 在 WebsiteMapper.xml 中,使用 insert 标签定义一条插入语句,并接收通过 Map 传递的参数,配置如下。 <!--接收 Map 参数--> <insert id="addWebsiteByMap" parameterType="map"> insert into Website (name, url) values (#{name}, #{url})</insert>1234复制代码类型:[java] 3. 测试代码如下。 Map<String, String> params = new HashMap<>(); params.put("name", "开课吧"); params.put("url", "https://topic./"); int i = websiteMapper.addWebsiteByMap(params); System.out.println("通过 Map 成功向数据库中添加了 " + i + " 条记录");12345复制代码类型:[html] 4. 执行测试代码,控制台输出如下。 通过 Map 成功向数据库中添加了 1 条记录1复制代码类型:[java] 使用注解传递参数我们还可以使用 MyBatis 提供的 @Param 注解给注解器传递参数,示例代码如下。 1. 在 WebsiteMapper 接口中,定义一个 addWebsiteByParam() 方法,并使用 @Param 注解传递参数,方法如下 int addWebsiteByParam(@Param("name") String name, @Param("url") String url);1复制代码类型:[java] 2. 在 WebsiteMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 @Param 注解传递的参数,配置如下。 <!--接收 @Param 注解传递的参数--> <insert id="addWebsiteByParam"> insert into Website (name, url) values (#{name}, #{url})</insert>1234复制代码类型:[java] 3. 测试代码如下。 int i = websiteMapper.addWebsiteByParam("kaikeba", "topic./"); System.out.println("通过 @Param 注解成功向数据库中添加了 " + i + " 条记录");12复制代码类型:[html] 4. 执行测试代码,控制台输出如下。 通过 @Param 注解成功向数据库中添加了 1 条记录1复制代码类型:[java] 使用 JavaBean 传递参数在参数过多的情况下,我们可以将参数通过 setter 方法封装到 JavaBean(实体类)对象中 ,传递给映射器。 1. 在 WebsiteMapper 接口中,定义一个 addWebsiteByJavaBean() 方法,并使用 JavaBean 传递参数,方法如下。 int addWebsiteByJavaBean(Website website);1复制代码类型:[java] 2. 在 WebsiteMapper.xml 中使用 insert 标签定义一条插入语句,并接收通过 JavaBean 传递的参数,配置如下。 <!--接收通过 JavaBean 传递的参数--> <insert id="addWebsiteByJavaBean" parameterType="com.kaikeba.topic.po.Website"> insert into Website (name, url) values (#{name}, #{url})</insert>//1234复制代码类型:[java] 3. 测试代码如下。 //创建 JavaBean 对象Website website = new Website();//通过 setter 方法将参数封装website.setName("kaikeba JavaBean"); website.setUrl("topic.");int i = websiteMapper.addWebsiteByJavaBean(website); System.out.println("通过 JavaBean 成功向数据库中添加了 " + i + " 条记录");1234567复制代码类型:[java] 4. 执行测试代码,控制台输出如下。 通过 JavaBean 成功向数据库中添加了 1 条记录1复制代码类型:[java] 区别以上 3 种方式的区别如下: 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。 当参数个数大于 5 个时,建议使用 JavaBean 方式。 主键(自动递增)回填我们知道,MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。 一些特殊情况下,我们可能需要将这个刚刚生成的主键回填到请求对象(原本不包含主键信息的请求对象)中,供其他业务使用。此时,我们就可以通过在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性,来实现该功能。 下面我们通过一个示例,来演示主键(自动递增)回填功能。 1. 为 WebsiteMapper.xml 中 id 为 addWebsite 的 insert 标签添加 keyProperty 和 useGeneratedKeys 属性,具体代码如下: <!--添加一个网站信息,成功后将主键值返回填给id(po的属性)--> <insert id="addWebsite" parameterType="net.biancheng.po.Website" keyProperty="id" useGeneratedKeys="true"> insert into Website (name,url) values(#{name},#{url})</insert>1234复制代码类型:[java] 2. 测试代码如下: // 添加一个网站信息Website addsite = new Website();//插入的对象中不包含主键 id addsite.setName("kaikeba "); addsite.setUrl("https://topic./");//执行插入int num = websiteMapper.addWebsite(addsite); System.out.println("添加了 " + num + " 条记录");//获取回填的主键System.out.println("添加记录的主键是:" + addsite.getId());12345678910复制代码类型:[java] 3. 执行测试代码,控制台输出如下。 添加了 1 条记录 添加记录的主键是:312复制代码类型:[java] 自定义主键如果在实际项目中,若数据库不支持主键自动递增(例如 Oracle),或者取消了主键自动递增的规则,我们可以使用 MyBatis 的 标签自定义生成主键,具体配置代码如下。 <!-- 添加一个网站,#{name}为 com.kaikeba.po.Website 的属性值 --> <insert id="insertWebsite" parameterType="com.kaikeba.po.Website"> <!-- 先使用selectKey标签定义主键,然后再定义SQL语句 --> <selectKey keyProperty="id" resultType="Integer" order="BEFORE"> select if(max(id) is null,1,max(id)+1) as newId from Website </selectKey> insert into Website (id,name,url) values(#{id},#{name},#{url})</insert>12345678复制代码类型:[java] 标签中属性说明如下: keyProperty:用于指定主键值对应的 PO 类的属性。 order:该属性取值可以为 BEFORE 或 AFTER。BEFORE 表示先执行 标签内的语句,再执行插入语句;AFTER 表示先执行插入语句再执行 标签内的语句。 |
|