这次把代码贴全吧
首先是Mapper接口的基类
- package org.sol.util.mybatis;
-
- import java.util.List;
-
- import org.apache.ibatis.annotations.DeleteProvider;
- import org.apache.ibatis.annotations.InsertProvider;
- import org.apache.ibatis.annotations.SelectProvider;
- import org.apache.ibatis.annotations.UpdateProvider;
-
-
-
-
-
-
-
- public interface BaseMapper<T extends MyBatisPojo> {
-
-
-
-
-
-
-
- public List<T> select(T obj);
-
- public List<T> selectByPage(T obj);
-
-
-
-
-
-
-
-
- @InsertProvider(type = CUDTemplate.class,method = "insert")
- public void insert(T obj);
-
-
-
-
-
- @UpdateProvider(type = CUDTemplate.class,method = "update")
- public void update(T obj);
-
-
-
-
-
- @DeleteProvider(type = CUDTemplate.class,method = "delete")
- public void delete(T obj);
-
- }
然后是POJO的基类
- package org.sol.util.mybatis;
-
- import java.io.Serializable;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import javax.persistence.Column;
- import javax.persistence.Id;
- import javax.persistence.Table;
-
- import org.json.JSONObject;
- import org.sol.util.mybatis.exception.PojoStructureException;
-
-
-
-
-
-
- public class MyBatisPojo implements Serializable{
-
- private static final long serialVersionUID = 1L;
-
-
-
-
-
-
- public String tablename() {
- Table table = this.getClass().getAnnotation(Table.class);
- if(table != null)
- return table.name();
- else
- throw new PojoStructureException("undefine POJO @Table, need Tablename(@Table(name))");
- }
-
-
-
-
-
-
- public String id() {
- for(Field field : this.getClass().getDeclaredFields()) {
- if(field.isAnnotationPresent(Id.class))
- return field.getName();
- }
-
- throw new RuntimeException("undefine POJO @Id");
- }
-
-
-
-
- private transient static Map<Class<? extends MyBatisPojo>,List<String>> columnMap = new HashMap<Class<? extends MyBatisPojo>, List<String>>();
-
- private boolean isNull(String fieldname) {
- try {
- Field field = this.getClass().getDeclaredField(fieldname);
- return isNull(field);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- }
-
- return false;
- }
-
- private boolean isNull(Field field) {
- try {
- field.setAccessible(true);
- return field.get(this) == null;
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
-
- return false;
- }
-
-
-
-
-
- public void caculationColumnList() {
- if(columnMap.containsKey(this.getClass()))
- return;
-
- Field[] fields = this.getClass().getDeclaredFields();
- List<String> columnList = new ArrayList<String>(fields.length);
-
- for(Field field : fields) {
- if(field.isAnnotationPresent(Column.class))
- columnList.add(field.getName());
- }
-
- columnMap.put(this.getClass(), columnList);
- }
-
-
-
-
-
- public List<WhereColumn> returnWhereColumnsName() {
- Field[] fields = this.getClass().getDeclaredFields();
- List<WhereColumn> columnList = new ArrayList<WhereColumn>(fields.length);
-
- for(Field field : fields) {
- if(field.isAnnotationPresent(Column.class) && !isNull(field))
- columnList.add(new WhereColumn(field.getName(), field.getGenericType().equals(String.class)));
- }
-
- return columnList;
- }
-
-
-
-
-
-
- public class WhereColumn {
- public String name;
- public boolean isString;
-
- public WhereColumn(String name,boolean isString) {
- this.name = name;
- this.isString = isString;
- }
- }
-
-
-
-
-
- public String returnInsertColumnsName() {
- StringBuilder sb = new StringBuilder();
-
- List<String> list = columnMap.get(this.getClass());
- int i = 0;
- for(String column : list) {
- if(isNull(column))
- continue;
-
- if(i++ != 0)
- sb.append(',');
- sb.append(column);
- }
- return sb.toString();
- }
-
-
-
-
-
- public String returnInsertColumnsDefine() {
- StringBuilder sb = new StringBuilder();
-
- List<String> list = columnMap.get(this.getClass());
- int i = 0;
- for(String column : list) {
- if(isNull(column))
- continue;
-
- if(i++ != 0)
- sb.append(',');
- sb.append("#{").append(column).append('}');
- }
- return sb.toString();
- }
-
-
-
-
-
- public String returnUpdateSet() {
- StringBuilder sb = new StringBuilder();
-
- List<String> list = columnMap.get(this.getClass());
- int i = 0;
- for(String column : list) {
- if(isNull(column))
- continue;
-
- if(i++ != 0)
- sb.append(',');
- sb.append(column).append("=#{").append(column).append('}');
- }
- return sb.toString();
- }
-
-
- public Integer getId(){return 0;}
-
-
-
-
-
-
- public String toJSONString() {
- JSONObject json = new JSONObject(this);
- return json.toString();
- }
-
-
-
-
- @Override
- public String toString() {
- Field[] fields = this.getClass().getDeclaredFields();
- StringBuilder sb = new StringBuilder();
- sb.append('[');
- for(Field f : fields) {
- if(Modifier.isStatic(f.getModifiers()) || Modifier.isFinal(f.getModifiers()))
- continue;
- Object value = null;
- try {
- f.setAccessible(true);
- value = f.get(this);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- if(value != null)
- sb.append(f.getName()).append('=').append(value).append(',');
- }
- sb.append(']');
-
- return sb.toString();
- }
-
-
-
-
- private int page;
- private int pageSize;
-
- public int getPage() {
- return page;
- }
-
- public void setPage(int page) {
- this.page = page;
- }
-
- public int getPageSize() {
- return pageSize;
- }
-
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- }
其中用到的Exception定义
- package org.sol.util.mybatis.exception;
-
- public class PojoStructureException extends RuntimeException{
-
- private static final long serialVersionUID = 1L;
-
- public PojoStructureException(String msg) {
- super(msg);
- }
-
- public PojoStructureException(String msg,Throwable e) {
- super(msg,e);
- }
- }
最后是用于构建SQL的模板
- package org.sol.util.mybatis;
-
- import static org.apache.ibatis.jdbc.SqlBuilder.*;
-
- public class CUDTemplate<T extends MyBatisPojo> {
- public String insert(T obj) {
- BEGIN();
-
- INSERT_INTO(obj.tablename());
- obj.caculationColumnList();
- VALUES(obj.returnInsertColumnsName(), obj.returnInsertColumnsDefine());
-
- return SQL();
- }
-
- public String update(T obj) {
- String idname = obj.id();
-
- BEGIN();
-
- UPDATE(obj.tablename());
- obj.caculationColumnList();
- SET(obj.returnUpdateSet());
- WHERE(idname + "=#{" + idname + "}");
-
- return SQL();
- }
-
- public String delete(T obj) {
- String idname = obj.id();
-
- BEGIN();
-
- DELETE_FROM(obj.tablename());
- WHERE(idname + "=#{" + idname + "}");
-
- return SQL();
- }
- }
实际使用时,只需要构建一个继承MyBatisPOJO的实体对象,和一个继承BaseMapper的映射器就可以了
例子:
- import javax.persistence.Column;
- import javax.persistence.Id;
- import javax.persistence.Table;
-
- import org.sol.util.mybatis.MyBatisPojo;
-
- @Table(name = "testTable")
- public class TestTable extends MyBatisPojo{
-
- private static final long serialVersionUID = 1L;
-
-
-
-
- @Id
- private Integer id;
-
- @Column
- private String name;
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- }
对应的Mapper
-
-
- public interface InfoShopMapper extends BaseMapper<TestTable>{
- }
其他操作与MyBatis原始操作一样
另外,希望有高人能提供生成通用Select的办法
分享到:
相关推荐
本项目是基于Mybatis进行DAO(Data Access Object)层的CRUD(Create、Read、Update、Delete)操作的源码实现,结合了Spring框架,便于管理和集成事务。 在Mybatis中,CRUD操作主要通过Mapper接口和对应的XML配置...
"封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询"是一个典型的企业级Web应用开发实践,它整合了三个主流的Java开源框架,即Spring、Struts2和MyBatis3,用于实现数据的创建(Create)、读取(Read)、更新...
封装通用的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"为主题,详细解析这一过程。 首先,理解通用Dao的概念。Dao是数据访问对象,它的主要职责是封装数据库操作,使得业务层代码...
Mybatis通用DAO设计封装主要涉及的是在Java开发中如何高效地使用Mybatis框架进行数据库操作。Mybatis是一款轻量级的持久层框架,它避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过提供自定义SQL、存储...
简介: 该项目基于mybatis封装, 目前只支持mysql, 旨在提供一个对dao层通用的操作,支持普通java程序和spring程序. 1 特性: ... <artifactId>mybatis-universal-crud <version>2.2.1.RELEASE 2.1.2 s
同时,我们也会涉及通用分页这一实用功能。 `iBatis` 是一款由 Apache Software Foundation 维护的开源项目,它最初由 Clinton Begin 创建。`iBatis` 提供了一种将SQL语句与Java代码解耦的方法,通过XML或注解来...
通用Mapper是MyBatis的一种扩展,提供了很多预定义的CRUD操作,简化了开发过程,减少了代码量。而Druid的多数据源支持,则允许程序同时连接并操作不同的数据库,这在处理分布式系统或需要分离读写操作的场景中非常...
MyBatis的通用CRUD** 在提供的源码中,很可能包含了一套通用的CRUD模板或者工具类,用于处理常见的数据库操作。例如,可能有如下的方法: - `insert()`:插入数据,通常会调用`insert(String sqlId, Object ...
MyBatis通用Mapper是一种基于MyBatis框架的扩展插件,它能够为开发者提供一系列方便的CRUD(创建、读取、更新、删除)操作方法,极大地简化了日常开发中的数据库操作流程。通用Mapper支持自定义SQL,同时也提供了对...
【描述解析】:“mybatis开发通用mapper共9页.pdf.zip”描述与标题一致,表明这是一个PDF格式的压缩文件,内容聚焦于MyBatis通用Mapper的开发,且包含9页详细信息。由于没有提供具体细节,我们可以推测文档可能涵盖...
这里我们讨论的是一个基于Ibatis、Struts2、Spring3的整合应用,涵盖了数据访问、业务逻辑和控制层的关键技术,以及分页和CRUD操作的实现。下面我们将详细探讨这些知识点。 1. **Ibatis**:Ibatis是一个优秀的持久...
在实际开发中,为了提高代码的复用性和减少重复工作,开发者通常会实现一套通用的增删改查模板,这就是“Mybatis通用增删改查”的概念。 1. **基础 DaoImpl 概念** Dao(Data Access Object)接口是Java中用于...
【自虐1.2】Spring+MyBatis完成CRUD 在现代Web开发中,Spring框架和MyBatis作为两大核心组件,常被用来构建高效、灵活的数据访问层。本篇将详细介绍如何利用Spring和MyBatis实现基本的CRUD(创建Create、读取Read、...
TkMybatis通用Mapper通过提供一系列预定义的CRUD操作,使得开发者可以快速进行数据操作,而无需编写大量重复的Mapper方法。 Ibatis是MyBatis的前身,是一个持久层框架,它允许开发者将SQL语句直接写在配置文件中,...
通用Mapper是MyBatis框架中的一个实用工具,它极大地简化了数据库操作的代码编写工作,尤其是在处理CRUD(创建、读取、更新、删除)操作时。MyBatis-通用Mapper通过逆向工程(Reverse Engineering)和代码生成工具,...
在"springboot+mybatis通用注解"这个项目中,开发者进行了深入的整合与封装,旨在进一步提升开发效率。通过自定义注解,我们可以实现动态生成SQL语句的功能。这样的设计减少了手动编写SQL语句的工作量,同时降低了...
本教程将深入探讨如何在Spring Boot项目中集成tk.mybatis通用Mapper,实现高效的数据访问。 首先,我们需要理解Spring Boot的核心特性:自动配置。Spring Boot通过扫描类路径并根据存在的依赖来自动配置相应的Bean...