mybatis3通用crud的研究二

来源:互联网 发布:centos telnet 安装 编辑:程序博客网 时间:2024/06/05 11:49

这次把代码贴全吧

首先是Mapper接口的基类

[java] view plain copy
  1. package org.sol.util.mybatis;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.ibatis.annotations.DeleteProvider;  
  6. import org.apache.ibatis.annotations.InsertProvider;  
  7. import org.apache.ibatis.annotations.SelectProvider;  
  8. import org.apache.ibatis.annotations.UpdateProvider;  
  9.   
  10. /** 
  11.  * MyBatis CRUD基接口 
  12.  * @author ALLEN.HU 
  13.  * 
  14.  * @param <T> 处理的POJO对象 
  15.  */  
  16. public interface BaseMapper<T extends MyBatisPojo> {  
  17.       
  18.     /** 
  19.      * 基于泛型的SELECT的返回类型,无法达到运行时改变对象签名 
  20.      * 目前无解  
  21.      * @param obj 
  22.      * @return 
  23.      */  
  24.     public List<T> select(T obj);  
  25.       
  26.     public List<T> selectByPage(T obj);  
  27.       
  28.     //@SelectProvider(type = SelectTemplate.class,method = "count")  
  29.     //public int count(T obj);  
  30.       
  31.     /** 
  32.      * Insert语句从CUDTemplate类中生成 
  33.      * @param obj 
  34.      */  
  35.     @InsertProvider(type = CUDTemplate.class,method = "insert")  
  36.     public void insert(T obj);  
  37.       
  38.     /** 
  39.      * Update语句从CUDTemplate类中生成 
  40.      * @param obj 
  41.      */  
  42.     @UpdateProvider(type = CUDTemplate.class,method = "update")  
  43.     public void update(T obj);  
  44.       
  45.     /** 
  46.      * Delete语句从CUDTemplate类中生成 
  47.      * @param obj 
  48.      */  
  49.     @DeleteProvider(type = CUDTemplate.class,method = "delete")  
  50.     public void delete(T obj);  
  51.   
  52. }  


然后是POJO的基类

[java] view plain copy
  1. package org.sol.util.mybatis;  
  2.   
  3. import java.io.Serializable;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Modifier;  
  6. import java.util.ArrayList;  
  7. import java.util.HashMap;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10.   
  11. import javax.persistence.Column;  
  12. import javax.persistence.Id;  
  13. import javax.persistence.Table;  
  14.   
  15. import org.json.JSONObject;  
  16. import org.sol.util.mybatis.exception.PojoStructureException;  
  17.   
  18. /** 
  19.  * MyBatis用POJO基类 
  20.  * @author Allen.Hu 
  21.  * 
  22.  */  
  23. public class MyBatisPojo implements Serializable{  
  24.   
  25.     private static final long serialVersionUID = 1L;  
  26.   
  27.     /** 
  28.      * 获取POJO对应的表名 
  29.      * 需要POJO中的属性定义@Table(name) 
  30.      * @return 
  31.      */  
  32.     public String tablename() {  
  33.         Table table = this.getClass().getAnnotation(Table.class);  
  34.         if(table != null)  
  35.             return table.name();  
  36.         else  
  37.             throw new PojoStructureException("undefine POJO @Table, need Tablename(@Table(name))");  
  38.     }  
  39.       
  40.     /** 
  41.      * 获取POJO中的主键字段名 
  42.      * 需要定义@Id 
  43.      * @return 
  44.      */  
  45.     public String id() {  
  46.         for(Field field : this.getClass().getDeclaredFields()) {  
  47.             if(field.isAnnotationPresent(Id.class))  
  48.                 return field.getName();  
  49.         }  
  50.           
  51.         throw new RuntimeException("undefine POJO @Id");  
  52.     }  
  53.   
  54.     /** 
  55.      * 用于存放POJO的列信息 
  56.      */  
  57.     private transient static Map<Class<? extends MyBatisPojo>,List<String>> columnMap = new HashMap<Class<? extends MyBatisPojo>, List<String>>();  
  58.       
  59.     private boolean isNull(String fieldname) {  
  60.         try {  
  61.             Field field = this.getClass().getDeclaredField(fieldname);  
  62.             return isNull(field);  
  63.         } catch (SecurityException e) {  
  64.             e.printStackTrace();  
  65.         } catch (NoSuchFieldException e) {  
  66.             e.printStackTrace();  
  67.         } catch (IllegalArgumentException e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.           
  71.         return false;  
  72.     }  
  73.       
  74.     private boolean isNull(Field field) {  
  75.         try {  
  76.             field.setAccessible(true);  
  77.             return field.get(this) == null;  
  78.         } catch (SecurityException e) {  
  79.             e.printStackTrace();  
  80.         } catch (IllegalArgumentException e) {  
  81.             e.printStackTrace();  
  82.         } catch (IllegalAccessException e) {  
  83.             e.printStackTrace();  
  84.         }  
  85.           
  86.         return false;  
  87.     }  
  88.       
  89.     /** 
  90.      * 用于计算类定义 
  91.      * 需要POJO中的属性定义@Column(name) 
  92.      */  
  93.     public void caculationColumnList() {  
  94.         if(columnMap.containsKey(this.getClass()))  
  95.             return;  
  96.           
  97.         Field[] fields = this.getClass().getDeclaredFields();  
  98.         List<String> columnList = new ArrayList<String>(fields.length);  
  99.           
  100.         for(Field field : fields) {  
  101.             if(field.isAnnotationPresent(Column.class))  
  102.                 columnList.add(field.getName());  
  103.         }  
  104.           
  105.         columnMap.put(this.getClass(), columnList);  
  106.     }  
  107.       
  108.     /** 
  109.      * 获取用于WHERE的 有值字段表 
  110.      * @return 
  111.      */  
  112.     public List<WhereColumn> returnWhereColumnsName() {  
  113.         Field[] fields = this.getClass().getDeclaredFields();  
  114.         List<WhereColumn> columnList = new ArrayList<WhereColumn>(fields.length);  
  115.           
  116.         for(Field field : fields) {  
  117.             if(field.isAnnotationPresent(Column.class) && !isNull(field))   
  118.                 columnList.add(new WhereColumn(field.getName(), field.getGenericType().equals(String.class)));  
  119.         }  
  120.           
  121.         return columnList;  
  122.     }  
  123.       
  124.     /** 
  125.      * Where条件信息 
  126.      * @author HUYAO 
  127.      * 
  128.      */  
  129.     public class WhereColumn {  
  130.         public String name;  
  131.         public boolean isString;  
  132.           
  133.         public WhereColumn(String name,boolean isString) {  
  134.             this.name = name;  
  135.             this.isString = isString;  
  136.         }  
  137.     }  
  138.       
  139.     /** 
  140.      * 用于获取Insert的字段累加 
  141.      * @return 
  142.      */  
  143.     public String returnInsertColumnsName() {  
  144.         StringBuilder sb = new StringBuilder();  
  145.           
  146.         List<String> list = columnMap.get(this.getClass());  
  147.         int i = 0;  
  148.         for(String column : list) {  
  149.             if(isNull(column))  
  150.                 continue;  
  151.               
  152.             if(i++ != 0)  
  153.                 sb.append(',');  
  154.             sb.append(column);  
  155.         }  
  156.         return sb.toString();  
  157.     }  
  158.       
  159.     /** 
  160.      * 用于获取Insert的字段映射累加 
  161.      * @return 
  162.      */  
  163.     public String returnInsertColumnsDefine() {  
  164.         StringBuilder sb = new StringBuilder();  
  165.           
  166.         List<String> list = columnMap.get(this.getClass());  
  167.         int i = 0;  
  168.         for(String column : list) {  
  169.             if(isNull(column))  
  170.                 continue;  
  171.               
  172.             if(i++ != 0)  
  173.                 sb.append(',');  
  174.             sb.append("#{").append(column).append('}');  
  175.         }  
  176.         return sb.toString();  
  177.     }  
  178.       
  179.     /** 
  180.      * 用于获取Update Set的字段累加 
  181.      * @return 
  182.      */  
  183.     public String returnUpdateSet() {  
  184.         StringBuilder sb = new StringBuilder();  
  185.           
  186.         List<String> list = columnMap.get(this.getClass());  
  187.         int i = 0;  
  188.         for(String column : list) {  
  189.             if(isNull(column))  
  190.                 continue;  
  191.               
  192.             if(i++ != 0)  
  193.                 sb.append(',');  
  194.             sb.append(column).append("=#{").append(column).append('}');  
  195.         }  
  196.         return sb.toString();  
  197.     }  
  198.       
  199.   
  200.     public Integer getId(){return 0;}  
  201.   
  202.     /** 
  203.      * 转化POJO为JSON格式 
  204.      * 需要org.json包支持,可以在json官网下载源码,或自己实现json编码 
  205.      * @return 
  206.      */  
  207.     public String toJSONString() {  
  208.         JSONObject json = new JSONObject(this);  
  209.         return json.toString();  
  210.     }  
  211.       
  212.     /** 
  213.      * 打印类字段信息 
  214.      */  
  215.     @Override  
  216.     public String toString() {  
  217.         Field[] fields = this.getClass().getDeclaredFields();  
  218.         StringBuilder sb = new StringBuilder();  
  219.         sb.append('[');  
  220.         for(Field f : fields) {  
  221.             if(Modifier.isStatic(f.getModifiers()) || Modifier.isFinal(f.getModifiers()))  
  222.                 continue;  
  223.             Object value = null;  
  224.             try {  
  225.                 f.setAccessible(true);  
  226.                 value = f.get(this);  
  227.             } catch (IllegalArgumentException e) {  
  228.                 e.printStackTrace();  
  229.             } catch (IllegalAccessException e) {  
  230.                 e.printStackTrace();  
  231.             }  
  232.             if(value != null)  
  233.                 sb.append(f.getName()).append('=').append(value).append(',');  
  234.         }  
  235.         sb.append(']');  
  236.           
  237.         return sb.toString();  
  238.     }  
  239.       
  240.     /** 
  241.      * 以下为一些分页信息,如不需要可以删除 
  242.      */  
  243.     private int page;  
  244.     private int pageSize;  
  245.   
  246.     public int getPage() {  
  247.         return page;  
  248.     }  
  249.   
  250.     public void setPage(int page) {  
  251.         this.page = page;  
  252.     }  
  253.   
  254.     public int getPageSize() {  
  255.         return pageSize;  
  256.     }  
  257.   
  258.     public void setPageSize(int pageSize) {  
  259.         this.pageSize = pageSize;  
  260.     }  
  261. }  


其中用到的Exception定义

[java] view plain copy
  1. package org.sol.util.mybatis.exception;  
  2.   
  3. public class PojoStructureException extends RuntimeException{  
  4.   
  5.     private static final long serialVersionUID = 1L;  
  6.   
  7.     public PojoStructureException(String msg) {  
  8.         super(msg);  
  9.     }  
  10.       
  11.     public PojoStructureException(String msg,Throwable e) {  
  12.         super(msg,e);  
  13.     }  
  14. }  


最后是用于构建SQL的模板

[java] view plain copy
  1. package org.sol.util.mybatis;  
  2.   
  3. import static org.apache.ibatis.jdbc.SqlBuilder.*;  
  4.   
  5. public class CUDTemplate<T extends MyBatisPojo> {  
  6.     public String insert(T obj) {  
  7.         BEGIN();  
  8.           
  9.         INSERT_INTO(obj.tablename());  
  10.         obj.caculationColumnList();  
  11.         VALUES(obj.returnInsertColumnsName(), obj.returnInsertColumnsDefine());  
  12.   
  13.         return SQL();  
  14.     }  
  15.       
  16.     public String update(T obj) {  
  17.         String idname = obj.id();  
  18.           
  19.         BEGIN();  
  20.           
  21.         UPDATE(obj.tablename());  
  22.         obj.caculationColumnList();  
  23.         SET(obj.returnUpdateSet());  
  24.         WHERE(idname + "=#{" + idname + "}");  
  25.           
  26.         return SQL();  
  27.     }  
  28.       
  29.     public String delete(T obj) {  
  30.         String idname = obj.id();  
  31.           
  32.         BEGIN();  
  33.           
  34.         DELETE_FROM(obj.tablename());  
  35.         WHERE(idname + "=#{" + idname + "}");  
  36.           
  37.         return SQL();  
  38.     }  
  39. }  


 

实际使用时,只需要构建一个继承MyBatisPOJO的实体对象,和一个继承BaseMapper的映射器就可以了

例子:

[java] view plain copy
  1. import javax.persistence.Column;  
  2. import javax.persistence.Id;  
  3. import javax.persistence.Table;  
  4.   
  5. import org.sol.util.mybatis.MyBatisPojo;  
  6.   
  7. @Table(name = "testTable")  
  8. public class TestTable extends MyBatisPojo{  
  9.   
  10.     private static final long serialVersionUID = 1L;  
  11.   
  12. // 一个很简单的示例表,仅有2列,主键列id,和一个Varchar列name  
  13.   
  14.     // 以@Id标识的字段,表示这个字段是主键  
  15.     @Id  
  16.     private Integer id;  
  17.     // 以@Column标识的字段,表示这个字段是一般列  
  18.     @Column  
  19.     private String name;  
  20.       
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public Integer getId() {  
  28.         return id;  
  29.     }  
  30.   
  31.     public void setId(Integer id) {  
  32.         this.id = id;  
  33.     }  
  34.   
  35. }  

对应的Mapper

[java] view plain copy
  1. // 只需要继承BaseMapper,就可以直接实现根据主键的Update,Insert,Delete操作  
  2. // 如果需要其他附加动作,也可以增加xml文件,完全没有冲突  
  3. public interface InfoShopMapper extends BaseMapper<TestTable>{  
  4. }  

 

其他操作与MyBatis原始操作一样

 

另外,希望有高人能提供生成通用Select的办法

转载:http://blog.csdn.net/beiouwolf/article/details/7347797

0 0
原创粉丝点击