mybatis批量插入

9 篇文章 0 订阅
3 篇文章 0 订阅

针对上一篇的bootstarp table 页面最后提交表格所有数据到后台,统一保存到后台批量插入。
bootstrap table 页面的增删改,不通过后台。http://blog.csdn.net/orangetop/article/details/76532707

下面是mybatis的批量插入:

java后台

@Controller
@RequestMapping("/assets")
public class AssetsController {

    @Resource
    private BizAssetsService assetsService;

    @RequestMapping(value = "/insert")
    @ResponseBody
    public void insertBizAssetsList(HttpServletRequest request, HttpServletResponse response){

String data = request.getParameter("mydata");   //获取表格中的数据mydata是传递过来data的name
List<BizAssets> dataList =  JSONObject.parseArray(data.toString(),BizAssets.class);   //把json转为list数组,类型是自己定义的bean

assetsService.insertBizAssetsList(dataList);   //批量插入方法
}
}

Dao:

public interface IAssetsDao {
    
    /**
     * 批量插入
     */
    int insertBizAssetsList(List<BizAssets> list);

}

service:

@Service
public class BizAssetsService {
    
    @Autowired
    private IAssetsDao assetsDao;

   public int insertBizAssetsList(List<BizAssets> assetsList){
        return assetsDao.insertBizAssetsList(assetsList);
    }

}

java bean:

public class BizAssets {

    private String assetsType;


    private BigDecimal assetsAmt;

    private Integer coefficient;

    private BigDecimal valueAmt;

   //  get set方法略
 }


mapper.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.orange.IAssetsDao">
    
  <insert id="insertBizAssetsList" parameterType="java.util.List">
          <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">
              SELECT LAST_INSERT_ID()
          </selectKey>
        insert into biz_assets (REC_UID, CREDIT_RATING_ID, ASSETS_TYPE, ASSETS_AMT,
            COEFFICIENT, VALUE_AMT, STATUS, CREATE_USER, CREATE_TIME)
        values
        <foreach collection="list" item="item" index="index" separator=",">
         ( #{item.assetsType,jdbcType=VARCHAR},
          #{item.assetsAmt,jdbcType=DECIMAL}, #{item.coefficient,jdbcType=INTEGER}, #{item.valueAmt,jdbcType=DECIMAL}
          )
        </foreach>
    </insert>
</mapper>


到此代码已经结束,下面说下自己在使用mybatis过程遇到的坑吧!

首先刚开始,直接insert,数据,搞了好久都没有成功一直报错,后来看了 一下,加入

 <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">
              SELECT LAST_INSERT_ID()
 </selectKey>

总算可以了。解释下:

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他它可以很随意的设置生成主键的方式。

resultType:结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。

keyProperty:selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

order:这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素 - 这和像 Oracle 的数据库相似,在插入语句内部可能有嵌入索引调用。

还有我写的数据库原来为空的,如何数据库已经有值,你在新增的时候,新增了已经存在的主键di,mybatis会报错,要么你避免插入已经存在的数据,要么在插入之前进行判断数据是否存在,我是直接加入了ignore .用法-在into 前加ignore例如:insert ignore into biz_assets(,,,,)values(?,?,?,?)

加入ignore, 插入重复的数据不报错也不插入。


下面对顺便对foreach标签解释下:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名,
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,与colse一起使用,
separator表示在每次进行迭代之间以什么符号作为分隔 符,
close表示以什么结束,与open一起使用。

当传入的参数不一样collection属性也不一样,具体可以参看http://www.cnblogs.com/fangyu19900812/p/6046209.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值