mybatis使用annotation在mysql,oracle上进行批量处理

来源:互联网 发布:钢琴可以自学吗 知乎 编辑:程序博客网 时间:2024/05/18 03:46
Java代码  收藏代码
  1. /** 
  2.  * 文件名:User.java 
  3.  * 
  4.  * 版本信息: 
  5.  * 日期:2012-8-28 
  6.  * Copyright 足下 Corporation 2012  
  7.  * 版权所有 
  8.  * 
  9.  */  
  10. package org.richiedryday.mybatis.batch.domain;  
  11.   
  12. import java.io.Serializable;  
  13. import java.sql.Timestamp;  
  14.   
  15.   
  16. /** 
  17.  *  
  18.  * 项目名称:mybatis-batch 
  19.  * 类名称:User 
  20.  * 类描述:用户领域模型 
  21.  * 创建人:richie144 
  22.  * 创建时间:2012-8-28 下午5:13:27 
  23.  * 修改人:richie144 
  24.  * 修改时间:2012-8-28 下午5:13:27 
  25.  * 修改备注: 
  26.  * @version  
  27.  *  
  28.  */  
  29. public class User implements Serializable {  
  30.       
  31.     private static final long serialVersionUID = 1L;  
  32.       
  33.     private Integer id;  
  34.       
  35.     private String username;  
  36.       
  37.     private String password;  
  38.       
  39.     private int age;  
  40.       
  41.     private Timestamp birthdate;  
  42.       
  43.     private char gender;  
  44.       
  45.     private String address;  
  46.       
  47.     public User() {  
  48.           
  49.     }  
  50.   
  51.     public User(Integer id, String username, String password, int age,  
  52.             Timestamp birthdate, char gender, String address) {  
  53.         this.id = id;  
  54.         this.username = username;  
  55.         this.password = password;  
  56.         this.age = age;  
  57.         this.birthdate = birthdate;  
  58.         this.gender = gender;  
  59.         this.address = address;  
  60.     }  
  61. //下面省略getter()和setter()  

下面是映射类 
Java代码  收藏代码
  1. /** 
  2.  * 文件名:UserMapper.java 
  3.  * 
  4.  * 版本信息: 
  5.  * 日期:2012-8-28 
  6.  * Copyright 足下 Corporation 2012  
  7.  * 版权所有 
  8.  * 
  9.  */  
  10. package org.richiedryday.mybatis.batch.mapper;  
  11.   
  12. import java.util.List;  
  13.   
  14. import org.apache.ibatis.annotations.Delete;  
  15. import org.apache.ibatis.annotations.DeleteProvider;  
  16. import org.apache.ibatis.annotations.Insert;  
  17. import org.apache.ibatis.annotations.InsertProvider;  
  18. import org.apache.ibatis.annotations.Options;  
  19. import org.apache.ibatis.annotations.Result;  
  20. import org.apache.ibatis.annotations.Results;  
  21. import org.apache.ibatis.annotations.Select;  
  22. import org.apache.ibatis.annotations.Update;  
  23. import org.richiedryday.mybatis.batch.domain.User;  
  24. import org.richiedryday.mybatis.batch.mapper.util.MapperProvider;  
  25.   
  26. /** 
  27.  *  
  28.  * 项目名称:mybatis-batch 
  29.  * 类名称:UserMapper 
  30.  * 类描述:用户对应mybatis映射的结果接口 
  31.  * 创建人:richie144 
  32.  * 创建时间:2012-8-28 下午5:42:56 
  33.  * 修改人:richie144 
  34.  * 修改时间:2012-8-28 下午5:42:56 
  35.  * 修改备注: 
  36.  * @version  
  37.  *  
  38.  */  
  39. public interface UserMapper {  
  40.       
  41.     public static final String INSERT = "INSERT INTO richie144_user VALUES(NULL,#{username},#{password},#{age},#{birthdate},#{gender},#{address})";  
  42.     public static final String DELETE = " DELETE FROM richie144_user ";  
  43.     public static final String UPDATE = "UPDATE richie144_user SET mb_username = #{username},mb_password = #{password},mb_age = #{age},mb_birthdate = #{birthdate},mb_gender = #{gender},mb_address = #{address}";  
  44.     public static final String SELECTALL = " SELECT * FROM richie144_user ";  
  45.     public static final String WHERE_ID = " WHERE mb_id = #{id} ";  
  46.     @Insert(INSERT)  
  47.     @Options(useGeneratedKeys=true,keyColumn="mb_id",keyProperty="id")  
  48.     void insert(User user);  
  49.       
  50.     @Delete(DELETE + WHERE_ID)  
  51.     void delete(int id);  
  52.       
  53.     @Update(UPDATE)  
  54.     void update(User user);  
  55.       
  56.     @Select(SELECTALL + WHERE_ID)  
  57.     @Results(value={  
  58.             @Result(column="mb_id",property="id"),  
  59.             @Result(column="mb_username",property="username"),  
  60.             @Result(column="mb_password",property="password"),  
  61.             @Result(column="mb_age",property="age"),  
  62.             @Result(column="mb_birthdate",property="birthdate"),  
  63.             @Result(column="mb_gender",property="gender"),  
  64.             @Result(column="mb_address",property="address")  
  65.     })  
  66.     User getSingle(Integer id);  
  67.       
  68.     //上面是mysql 的,下面的是oracle的  
  69.     //@InsertProvider(type=MapperProvider.class,method="insertAll")  
  70.     @InsertProvider(type=MapperProvider.class,method="insertAll4Orcl")  
  71.     void insertAll(List<User> users);  
  72.       
  73.     @DeleteProvider(type=MapperProvider.class,method="deleteAll")  
  74.     void deleteAll(List<User> users);  
  75.       
  76.     @Select(SELECTALL)  
  77.     @Results(value={  
  78.             @Result(column="mb_id",property="id"),  
  79.             @Result(column="mb_username",property="username"),  
  80.             @Result(column="mb_password",property="password"),  
  81.             @Result(column="mb_age",property="age"),  
  82.             @Result(column="mb_birthdate",property="birthdate"),  
  83.             @Result(column="mb_gender",property="gender"),  
  84.             @Result(column="mb_address",property="address")  
  85.     })  
  86.     List<User> getAll();  
  87. }  

 下面是MapperProvider类
Java代码  收藏代码
  1. /** 
  2.  * 文件名:InsertProvider.java 
  3.  * 
  4.  * 版本信息: 
  5.  * 日期:2012-8-29 
  6.  * Copyright 足下 Corporation 2012  
  7.  * 版权所有 
  8.  * 
  9.  */  
  10. package org.richiedryday.mybatis.batch.mapper.util;  
  11.   
  12. import java.text.MessageFormat;  
  13. import java.util.List;  
  14. import java.util.Map;  
  15.   
  16. import org.richiedryday.mybatis.batch.domain.User;  
  17.   
  18. /** 
  19.  *  
  20.  * 项目名称:mybatis-batch 
  21.  * 类名称:InsertProvider 
  22.  * 类描述:批量插入辅助类 
  23.  * 创建人:richie144 
  24.  * 创建时间:2012-8-29 下午1:32:18 
  25.  * 修改人:richie144 
  26.  * 修改时间:2012-8-29 下午1:32:18 
  27.  * 修改备注: 
  28.  * @version  
  29.  *  
  30.  */  
  31. public class MapperProvider {  
  32.       
  33.     //批量插入  
  34.     public String insertAll(Map<String,List<User>> map) {     
  35.         List<User> users = map.get("list");  
  36.         StringBuilder sb = new StringBuilder();  
  37.         sb.append("INSERT INTO richie144_user VALUES");  
  38.         MessageFormat messageFormat = new MessageFormat("(null,#'{'list[{0}].username},#'{'list[{0}].password},#'{'list[{0}].age},#'{'list[{0}].birthdate},#'{'list[{0}].gender},#'{'list[{0}].address})");  
  39.         for(int i = 0 ;i<users.size();i++) {  
  40.             sb.append(messageFormat.format(new Object[]{i}));  
  41.             if (i < users.size() - 1) {    
  42.                 sb.append(",");     
  43.             }  
  44.         }  
  45.         System.out.println(sb.toString());  
  46.         return sb.toString();  
  47.     }  
  48.     //批量删除  
  49.     public String deleteAll(Map<String,List<User>> map) {  
  50.         List<User> users =map.get("list");  
  51.         StringBuilder sb = new StringBuilder();  
  52.         sb.append("DELETE FROM richie144_user WHERE mb_id in (");  
  53.         MessageFormat messageFormat = new MessageFormat("#'{'list[{0}].id}");  
  54.         for(int i = 0 ;i<users.size();i++) {  
  55.             sb.append(messageFormat.format(new Integer[]{i}));  
  56.             if (i < users.size() - 1) {    
  57.                 sb.append(",");     
  58.             }  
  59.         }  
  60.         sb.append(")");  
  61.         System.out.println(sb.toString());  
  62.         return sb.toString();  
  63.     }  
  64.     //批量更新就简单了一个普通的更新方法就可以搞定。  
  65.       
  66.     //下面是oracle 批量插入的insertProvider,因为oracle  
  67.     public String insertAll4Orcl(Map<String,List<User>> map){  
  68.         List<User> users =map.get("list");  
  69.         StringBuilder sb = new StringBuilder();  
  70.         MessageFormat messageFormat = new MessageFormat("#'{'list[{0}].username},#'{'list[{0}].password},#'{'list[{0}].age},#'{'list[{0}].birthdate},#'{'list[{0}].gender},#'{'list[{0}].address}");  
  71.         sb.append(" INSERT INTO richie144_user(mb_username,mb_password,mb_age,mb_birthdate,mb_gender,mb_address) ");  
  72.         for(int i = 0 ;i<users.size();i++) {  
  73.             //注意空格  
  74.             sb.append("SELECT ");  
  75.             sb.append(messageFormat.format(new Object[]{i}));  
  76.             //注意空格  
  77.             sb.append(" FROM DUAL ");  
  78.             if(i<users.size()-1) {  
  79.                 sb.append(" UNION ALL ");  
  80.             }  
  81.         }  
  82.         System.out.println(sb.toString());  
  83.         return sb.toString();  
  84.     }  
  85. }  

配置文件放在类路径下(mybatis-config.xml) 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>    
  2. <!DOCTYPE configuration    
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"    
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.     <environments default="development">  
  7.         <environment id="development">  
  8.             <transactionManager type="JDBC" />  
  9.             <dataSource type="POOLED">  
  10.                 <!-- <property name="driver" value="com.mysql.jdbc.Driver" />  
  11.                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis_batch"/>  
  12.                 <property name="username" value="root" />  
  13.                 <property name="password" value="admin" /> -->  
  14.                   
  15.                 <property name="driver" value="oracle.jdbc.driver.OracleDriver" />  
  16.                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>  
  17.                 <property name="username" value="scott" />  
  18.                 <property name="password" value="tiger" />  
  19.             </dataSource>  
  20.         </environment>  
  21.     </environments>  
  22.     <mappers>  
  23.         <mapper class="org.richiedryday.mybatis.batch.mapper.UserMapper"/>  
  24.     </mappers>  
  25. </configuration>  


下面开始测试 
Java代码  收藏代码
  1. /** 
  2.  * 文件名:CRUDTest.java 
  3.  * 
  4.  * 版本信息: 
  5.  * 日期:2012-8-29 
  6.  * Copyright 足下 Corporation 2012  
  7.  * 版权所有 
  8.  * 
  9.  */  
  10. package org.richiedryday.mybatis.batch.test;  
  11.   
  12. import java.io.IOException;  
  13. import java.io.InputStream;  
  14. import java.sql.Timestamp;  
  15. import java.util.ArrayList;  
  16. import java.util.List;  
  17.   
  18. import org.apache.ibatis.io.Resources;  
  19. import org.apache.ibatis.session.SqlSession;  
  20. import org.apache.ibatis.session.SqlSessionFactory;  
  21. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  22. import org.apache.log4j.Logger;  
  23. import org.junit.AfterClass;  
  24. import org.junit.BeforeClass;  
  25. import org.junit.Test;  
  26. import org.richiedryday.mybatis.batch.domain.User;  
  27. import org.richiedryday.mybatis.batch.mapper.UserMapper;  
  28.   
  29.   
  30. /** 
  31.  *  
  32.  * 项目名称:mybatis-batch 
  33.  * 类名称:CRUDTest 
  34.  * 类描述:各种CRUD 包括批处理测试类 
  35.  * 创建人:richie144 
  36.  * 创建时间:2012-8-29 上午9:38:11 
  37.  * 修改人:richie144 
  38.  * 修改时间:2012-8-29 上午9:38:11 
  39.  * 修改备注: 
  40.  * @version  
  41.  *  
  42.  */  
  43. public class CRUDTest {  
  44.       
  45.     private static final Logger log = Logger.getLogger(CRUDTest.class);  
  46.     private static final String resource = "mybatis-config.xml";  
  47.     private static SqlSessionFactory sessionFactory = null;  
  48.     User u1 = new User(null"aaa""aaaa"10, Timestamp.valueOf("1986-11-10 23:23:56"), '男'"武昌关山");  
  49.     User u2 = new User(null"bbb""bbbb"11, Timestamp.valueOf("1987-11-10 23:23:56"), '男'"武昌关山");  
  50.     User u3 = new User(null"ccc""cccc"12, Timestamp.valueOf("1985-11-10 23:23:56"), '男'"武昌关山");  
  51.     User u4 = new User(null"ddd""dddd"13, Timestamp.valueOf("1989-11-10 23:23:56"), '男'"武昌关山");  
  52.     User u5 = new User(null"eee""eeee"14, Timestamp.valueOf("1983-11-10 23:23:56"), '男'"武昌关山");  
  53.     User u6 = new User(null"fff""ffff"15, Timestamp.valueOf("1988-11-10 23:23:56"), '男'"武昌关山");  
  54.     User u7 = new User(null"ggg""gggg"16, Timestamp.valueOf("1980-11-10 23:23:56"), '男'"武昌关山");  
  55.     User u8 = new User(null"hhh""hhhh"17, Timestamp.valueOf("1982-11-10 23:23:56"), '男'"武昌关山");  
  56.     User u9 = new User(null"iii""iiii"18, Timestamp.valueOf("1985-11-10 23:23:56"), '男'"武昌关山");  
  57.     User u10 = new User(null"jjj""jjjj"19, Timestamp.valueOf("1984-11-10 23:23:56"), '男'"武昌关山");  
  58.     User u11 = new User(null"kkk""kkkk"20, Timestamp.valueOf("1985-11-10 23:23:56"), '男'"武昌关山");  
  59.     User u12 = new User(null"lll""llll"21, Timestamp.valueOf("1981-11-10 23:23:56"), '男'"武昌关山");  
  60.     User u13 = new User(null"mmm""mmmm"22, Timestamp.valueOf("1985-11-10 23:23:56"), '男'"武昌关山");  
  61.     User u14 = new User(null"nnn""nnnn"23, Timestamp.valueOf("1990-11-10 23:23:56"), '男'"武昌关山");  
  62.     User u15 = new User(null"ooo""oooo"24, Timestamp.valueOf("1992-11-10 23:23:56"), '男'"武昌关山");  
  63.     private static final User u16 = new User(null"dryday""000000"23,Timestamp.valueOf("1989-11-10 23:23:56") , '男'"湖北省武汉市武昌华城新都");  
  64.     private static final User u17 = new User(null"renhuan""000000"24,Timestamp.valueOf("1989-11-10 23:23:56") , '男'"湖北省武汉市武昌关山大道曙光村");  
  65.     @BeforeClass  
  66.     public static void setUp() {  
  67.         InputStream is = null;  
  68.         try {  
  69.             is = Resources.getResourceAsStream(resource);  
  70.             sessionFactory = new SqlSessionFactoryBuilder().build(is);  
  71.         } catch (IOException e) {  
  72.             log.debug("未找到资源文件"+resource);  
  73.             e.printStackTrace();  
  74.         } finally {  
  75.             try {  
  76.                 if(is != null) {  
  77.                     is.close();  
  78.                     is = null;  
  79.                 }  
  80.             } catch (IOException e) {  
  81.                 log.debug("回收资源"+ is + "失败 !");  
  82.                 e.printStackTrace();  
  83.             }  
  84.         }  
  85.     }  
  86.       
  87.     @AfterClass  
  88.     public static void shutDown() {  
  89.         System.err.println("test over");  
  90.     }  
  91.       
  92.     public static SqlSession getSession(SqlSessionFactory sessionFactory) {  
  93.         return sessionFactory.openSession();  
  94.     }  
  95.       
  96.     //下面是最基本的增删改查  
  97.     @Test  
  98.     public void testInsert() {  
  99.         SqlSession session = getSession(sessionFactory);  
  100.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  101.         userMapper.insert(u1);  
  102.         userMapper.insert(u2);  
  103.         session.commit(true);  
  104.         session.close();  
  105.     }  
  106.       
  107.     @Test  
  108.     public void testDelete() {  
  109.         SqlSession session = getSession(sessionFactory);  
  110.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  111.         userMapper.delete(2);  
  112.         session.commit();  
  113.         session.close();  
  114.     }  
  115.     @Test  
  116.     public void testUpdate() {  
  117.         SqlSession session = getSession(sessionFactory);  
  118.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  119.         User user = new User(null"richie144""admin"24, Timestamp.valueOf("1989-11-10 23:23:56") , '男'"湖北省武汉市武昌关山大道曙光村");  
  120.         userMapper.update(user);  
  121.         session.commit();  
  122.         session.close();  
  123.     }  
  124.       
  125.     @Test  
  126.     public void testGetSingle() {  
  127.         SqlSession session = getSession(sessionFactory);  
  128.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  129.         User u = userMapper.getSingle(1);  
  130.         System.out.println(u);  
  131.         session.commit();  
  132.         session.close();  
  133.     }  
  134.       
  135.     //下面进行批量处理  
  136.       
  137.     @Test  
  138.     public void testInsertAll() {  
  139.         SqlSession session = getSession(sessionFactory);  
  140.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  141.         List<User> users = new ArrayList<User>();  
  142.         users.add(u1);  
  143.         users.add(u2);  
  144.         users.add(u3);  
  145.         users.add(u4);  
  146.         users.add(u5);  
  147.         users.add(u6);  
  148.         users.add(u7);  
  149.         users.add(u8);  
  150.         users.add(u9);  
  151.         users.add(u10);  
  152.         users.add(u11);  
  153.         users.add(u12);  
  154.         users.add(u13);  
  155.         users.add(u14);  
  156.         users.add(u15);  
  157.         users.add(u16);  
  158.         users.add(u17);  
  159.         userMapper.insertAll(users);  
  160.         session.commit();  
  161.         session.close();  
  162.     }  
  163.       
  164.     @Test  
  165.     public void testDeleteAll() {  
  166.         SqlSession session = getSession(sessionFactory);  
  167.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  168.         List<User> users = getAll();  
  169.         userMapper.deleteAll(users);  
  170.         session.commit();  
  171.         session.close();  
  172.     }  
  173.       
  174.     /** 
  175.      *  
  176.      * getAll(给批量删除提供数据) 
  177.      * @param  @return    设定文件 
  178.      * @return String    DOM对象 
  179.      * @Exception 异常对象 
  180.      * @since  CodingExample Ver(编码范例查看) 1.1 
  181.      */  
  182.     private List<User> getAll() {  
  183.         SqlSession session = getSession(sessionFactory);  
  184.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  185.         List<User> users = userMapper.getAll();  
  186.         return users;  
  187.     }  
  188.     @Test  
  189.     public void testInsertAll4Orcl() {  
  190.         SqlSession session = getSession(sessionFactory);  
  191.         UserMapper userMapper = session.getMapper(UserMapper.class);  
  192.         List<User> users = new ArrayList<User>();  
  193.         users.add(u1);  
  194.         users.add(u2);  
  195.         users.add(u3);  
  196.         users.add(u4);  
  197.         users.add(u5);  
  198.         users.add(u6);  
  199.         users.add(u7);  
  200.         users.add(u8);  
  201.         users.add(u9);  
  202.         users.add(u10);  
  203.         users.add(u11);  
  204.         users.add(u12);  
  205.         users.add(u13);  
  206.         users.add(u14);  
  207.         users.add(u15);  
  208.         users.add(u16);  
  209.         users.add(u17);  
  210.         userMapper.insertAll(users);  
  211.         session.commit();  
  212.         session.close();  
  213.     }  
  214. }  

测试成功,OK搞定奉上源码。。详见附件 
原创粉丝点击