• 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

  • 相关阅读:
    周鸿祎笔录
    set multiset 集合实现众数的统计
    栈实现 汉诺塔 操作是否符合规范
    优先队列----解决排序问题
    字符串的应用(续一)
    优先队列 的实例(未完----待续)
    字符串的应用
    栈实现括号
    Jave垃圾回收算法
    Java 按代回收垃圾以及回收算法
  • 原文地址:https://www.cnblogs.com/softidea/p/6693255.html
Copyright © 2020-2023  润新知