`
923080512
  • 浏览: 190908 次
  • 性别: Icon_minigender_1
  • 来自: 商丘
社区版块
存档分类
最新评论

MyBatis3 通用CRUD的研究[二]

阅读更多

这次把代码贴全吧

首先是Mapper接口的基类

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


然后是POJO的基类

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


其中用到的Exception定义

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


最后是用于构建SQL的模板

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


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

例子:

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

对应的Mapper

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

 

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

 

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

分享到:
评论

相关推荐

    mybatis基于Dao的crud操作源码

    本项目是基于Mybatis进行DAO(Data Access Object)层的CRUD(Create、Read、Update、Delete)操作的源码实现,结合了Spring框架,便于管理和集成事务。 在Mybatis中,CRUD操作主要通过Mapper接口和对应的XML配置...

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询

    "封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询"是一个典型的企业级Web应用开发实践,它整合了三个主流的Java开源框架,即Spring、Struts2和MyBatis3,用于实现数据的创建(Create)、读取(Read)、更新...

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context=...

    Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x

    我们将以"Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用Mapper3.5.x"为主题,详细解析这一过程。 首先,理解通用Dao的概念。Dao是数据访问对象,它的主要职责是封装数据库操作,使得业务层代码...

    Mybatis通用DAO设计封装(mybatis)

    Mybatis通用DAO设计封装主要涉及的是在Java开发中如何高效地使用Mybatis框架进行数据库操作。Mybatis是一款轻量级的持久层框架,它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过提供自定义SQL、存储...

    mybatis-universal-crud:基于mybatis的通用crud操作框架

    简介: 该项目基于mybatis封装, 目前只支持mysql, 旨在提供一个对dao层通用的操作,支持普通java程序和spring程序. 1 特性: ... &lt;artifactId&gt;mybatis-universal-crud &lt;version&gt;2.2.1.RELEASE 2.1.2 s

    ibatis mybatis crud 完整代码

    同时,我们也会涉及通用分页这一实用功能。 `iBatis` 是一款由 Apache Software Foundation 维护的开源项目,它最初由 Clinton Begin 创建。`iBatis` 提供了一种将SQL语句与Java代码解耦的方法,通过XML或注解来...

    springboot + mybatis(通用mapper) + druid多数据源

    通用Mapper是MyBatis的一种扩展,提供了很多预定义的CRUD操作,简化了开发过程,减少了代码量。而Druid的多数据源支持,则允许程序同时连接并操作不同的数据库,这在处理分布式系统或需要分离读写操作的场景中非常...

    通用mybatis-MySQL增删改查CRUD源码

    MyBatis的通用CRUD** 在提供的源码中,很可能包含了一套通用的CRUD模板或者工具类,用于处理常见的数据库操作。例如,可能有如下的方法: - `insert()`:插入数据,通常会调用`insert(String sqlId, Object ...

    mybatis通用mapper笔记

    MyBatis通用Mapper是一种基于MyBatis框架的扩展插件,它能够为开发者提供一系列方便的CRUD(创建、读取、更新、删除)操作方法,极大地简化了日常开发中的数据库操作流程。通用Mapper支持自定义SQL,同时也提供了对...

    mybatis开发通用mapper共9页.pdf.zip

    【描述解析】:“mybatis开发通用mapper共9页.pdf.zip”描述与标题一致,表明这是一个PDF格式的压缩文件,内容聚焦于MyBatis通用Mapper的开发,且包含9页详细信息。由于没有提供具体细节,我们可以推测文档可能涵盖...

    ibatis struts2 spring3 mybatis 分页 crud 完整代码

    这里我们讨论的是一个基于Ibatis、Struts2、Spring3的整合应用,涵盖了数据访问、业务逻辑和控制层的关键技术,以及分页和CRUD操作的实现。下面我们将详细探讨这些知识点。 1. **Ibatis**:Ibatis是一个优秀的持久...

    Mybatis通用增删改查

    在实际开发中,为了提高代码的复用性和减少重复工作,开发者通常会实现一套通用的增删改查模板,这就是“Mybatis通用增删改查”的概念。 1. **基础 DaoImpl 概念** Dao(Data Access Object)接口是Java中用于...

    【自虐1.2】Srping+MyBatis完成CRUD

    【自虐1.2】Spring+MyBatis完成CRUD 在现代Web开发中,Spring框架和MyBatis作为两大核心组件,常被用来构建高效、灵活的数据访问层。本篇将详细介绍如何利用Spring和MyBatis实现基本的CRUD(创建Create、读取Read、...

    TkMybatis通用Mapper逆向工程代码生成工具

    TkMybatis通用Mapper通过提供一系列预定义的CRUD操作,使得开发者可以快速进行数据操作,而无需编写大量重复的Mapper方法。 Ibatis是MyBatis的前身,是一个持久层框架,它允许开发者将SQL语句直接写在配置文件中,...

    mybatis-通用Mapper-逆向工程-代码生成工具

    通用Mapper是MyBatis框架中的一个实用工具,它极大地简化了数据库操作的代码编写工作,尤其是在处理CRUD(创建、读取、更新、删除)操作时。MyBatis-通用Mapper通过逆向工程(Reverse Engineering)和代码生成工具,...

    springboot+mybatis通用注解

    在"springboot+mybatis通用注解"这个项目中,开发者进行了深入的整合与封装,旨在进一步提升开发效率。通过自定义注解,我们可以实现动态生成SQL语句的功能。这样的设计减少了手动编写SQL语句的工作量,同时降低了...

    spring-boot+tk.mybatis通用mapper

    本教程将深入探讨如何在Spring Boot项目中集成tk.mybatis通用Mapper,实现高效的数据访问。 首先,我们需要理解Spring Boot的核心特性:自动配置。Spring Boot通过扫描类路径并根据存在的依赖来自动配置相应的Bean...

Global site tag (gtag.js) - Google Analytics