Mybatis通过注解方式实现批量插入数据库 及 常见的坑

原文地址:http://f0rb.iteye.com/blog/1207384

MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcch/articles/2042298.html,但探讨如何通过注解配置实现同样效果的文章却很少,官方文档上也没找到相关的用法,其中的难点在于如何处理List或者Map类型的参数。不过这种方法终于被我试出来并且测试通过,现以批量插入为例,来演示一下怎样通过注解来实现数据库的批量操作:

/*User.java*/

public class User {
    private Integer id;
    private String name;  

    public Integer getId() {  

        return id;
    }  

    public void setId(Integer id) {
        this.id = id;
    }  

    public String getName() {
        return name;
    }  

    public void setName(String name) {
        this.name = name;
    }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
/*UserDAO.java*/
public interface UserDAO {
    @InsertProvider(type = UserDAOProvider.class, method = "insertAll")
    void insertAll(@Param("list") List<User> users);
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
/*UserDAOProvider.java*/
public class UserDAOProvider {
    public String insertAll(Map map) {
        List<User> users = (List<User>) map.get("list");
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO User ");
        sb.append("(id, name) ");
        sb.append("VALUES ");
        MessageFormat mf = new MessageFormat("(null, #'{'list[{0}].name})");
        for (int i = 0; i < users.size(); i++) {
            sb.append(mf.format(new Object[]{i}));
            if (i < users.size() - 1) {
                sb.append(",");
            }
        }
        return sb.toString();
    }
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

MyBatis会把UserDAO的insertAll方法中的List类型的参数存入一个Map中, 默认的key是”list”, 可以用@Param注解自定义名称, MyBatis在调用@InsertProvide指定的方法时将此map作为参数传入, 所有代码中使用List users = (List) map.get(“list”);获取list参数. 
可以从代码中看出生成的SQL语句大致为:

INSERT INTO User (id, name) VALUES (null, #{list[0].name}), (null, #{list[1].name})[,(null, #{list[i].name})]  

其中#{list[0].name}就表示从List参数的取第0个元素的name的值了, “list”跟key是对应的。

http://blog.csdn.net/del_zhu/article/details/52711678

Mybatis常见配置错误总结
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="mapperLocations">
<list>
<value>classpath:com.axxxxxy/**/dao/mapper/*.xml</value>
</list>
</property>
<property name="dataSource" ref="dbcp2dataSource" />
<property name="configLocation" value="classpath:resources/mybatis/mybatis-config.xml"/>
</bean>
spring中的Mybatis的配置
1.classpath是针对src的,classpath后面跟的是路径名称而不是包名。
例如上面,com.axxxxy/**/dao/mapper/*.xml ,com后面应该是‘/’而不是'.',这个错误找了一天才找到。如果你classpath写了classpath*:,那么Mybatis会自动搜索查找子包

2.可以免Mapper接口实现类的,如果不用读写分离,dao接口对象可以直接被注入到Service,可以直接调用对应的Mapper ID
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.axxxxxy" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- <property name="annotationClass" value="org.springframework.stereotype.Repository"/> -->
</bean>

3.Mapper的DAO类的名称和对应XML的mapper文件文件名称应该一致(没试过)

4.最常见的错误有mapper XML文件的namespace,一定要确保数据表的Model路径配置正确了

5.DaoMapper接口中的方法 与 Mapper中的id不匹配,错别字或者 缺失,都是问题。

http://blog.csdn.net/cor_twi/article/details/51228516

 

时间: 2024-09-16 10:18:49

Mybatis通过注解方式实现批量插入数据库 及 常见的坑的相关文章

MYSQL批量插入数据库实现语句性能分析

  假定我们的表结构如下 代码如下   CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情况下单条插入的sql语句我们会这么写: 代码如下   INSERT INTO example (example_id, name, value, other_valu

mybatis 向oracle 采用foearch批量插入,如果包含clob字段报错

问题描述 mybatis 向oracle 采用foearch批量插入,如果包含clob字段报错 mybatis 向oracle 采用foearch批量插入 如下代码: insert into (id,name,clobs) SELECT #{item.id},#{item.name},#{item.clobs} FROM DUAL 报错信息:仅能绑定要插入 LONG 列的 LONG 值 可是如果采用普通的insert into (id,name,clobs) values(#{id},#{nam

Java实现mybatis批量插入数据到Oracle_java

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址  1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &

Hibernate批量插入数据到数据库

之前笔记中使用jdbc和iBATIS方式实现批量插入数据到数据库.在Hibernate框架中使用相应接口,同样也可以实现数据的批量操作,Hibernate把最近插入的数据都以session-level cache在内存做缓存,首先在配置文件中设置一个合理的JDBC批处理大小hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量.配置hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,hibernate.jdbc.batch_size参数值越

C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// <param name="sourceDataTable">数据源表</param> /// <param name="targetTableName">服务器上目标表</param> /// <param nam

log4net插入数据库,性能是怎么样的呢?

问题描述 log4net插入数据库,性能是怎么样的呢?有没有做过这方面的测试呢?我是直接插入存储过程的,可能每秒要达到几万条数据.log4net是否能扛得住呢? 解决方案 解决方案二: 解决方案三: 解决方案四:每秒插入几万条~很想知道你记录什么~解决方案五:LZ真逗log4是在程序中记录log而不是数据库你执行存储过程插入几百万条数据跟log4没任何关系....如果你执行一次插入一条执行100W次这才有关系....解决方案六:关键我想在log4net源码开发里面加入定时插入解决方案七:引用4楼

PHP大批量插入数据库的3种方法和速度对比_php实例

第一种方法:使用insert into 插入,代码如下: $params = array('value'=>'50′); set_time_limit(0); echo date("H:i:s"); for($i=0;$i<2000000;$i++){ $connect_mysql->insert($params); }; echo date("H:i:s"); 最后显示为:23:25:05 01:32:05 也就是花了2个小时多! 第二种方法:使

mybatis中批量插入的两种方式(高效插入)_java

MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

一.前言      数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅.   二. insert元素 属性详解   其属性如下:    parameterType ,入参的全限定类名或类型别名    keyColumn ,设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置    keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元