mybatis 公用CRUD 增删改查

mybatis公用增删改查CRUD

1.具体mapper

package com.kevin.mapper;

import org.apache.ibatis.annotations.Mapper;

import com.kevin.dto.AllType;
import com.kevin.mapper.common.CommonMapper;

@Mapper
public interface AllTypeMapper extends CommonMapper<AllType> {

}

2.公用mapper:

package com.kevin.mapper.common;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.SelectProvider;

/**
 * CRUD公用类
 * @author Kevin Zhang @Date 2018年3月20日 下午4:55:23
 */
public interface CommonMapper<T> {
    @SelectProvider(type = CommonProvider.class, method = "save")
    public void save(T t);
   
    @SelectProvider(type = CommonProvider.class, method = "delete")
    public void delete(Integer id, Class<T> t);
   
    /**
     * 注意,更新之前, 输入参数t一定要从数据库中读出,不然很容易将其他字段置为空
     */
    @SelectProvider(type = CommonProvider.class, method = "update")
    public void update(Integer id, Map<String,Object> map, Class<T> t);
   
    @SelectProvider(type = CommonProvider.class, method = "find")
    T findOne(T t);
   
    @SelectProvider(type = CommonProvider.class, method = "find")
    List<T> find(T t);
}

3.公用CRUD

package com.kevin.mapper.common;

import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.apache.ibatis.jdbc.SQL;

import com.kevin.annotation.Column;
import com.kevin.annotation.Ignore;
import com.kevin.annotation.Table;

/**
 * 公用crud
 *
 * @author Kevin Zhang @Date 2018年3月15日 下午4:43:52
 */
public class CommonProvider {
    /**
     * 保存对象至数据库
     */
    public static <T> String save(T t) throws IllegalAccessException {
        String sql = new SQL() {
            {
                Class<?> entityClass = t.getClass();
                String tableName = tableName(entityClass);

                // 各字段,如果不为null, 且不为"", 则作为查询条件,并用and连接后,生成SQL
                Field[] fields = entityClass.getDeclaredFields();
                if (fields != null && fields.length > 0) {
                    // 生成insert
                    INSERT_INTO(tableName);
                    for (Field field : fields) {
                        String fieldName = field.getName();
                        Ignore ignore = field.getAnnotation(Ignore.class);
                        if (!"serialVersionUID".equals(fieldName) && ignore == null) {
                            field.setAccessible(true);
                            Column column = field.getAnnotation(Column.class);
                            if (column != null) {                                                             // 如果有加列注解,用列的注解名
                                fieldName = column.name();
                            }

                            Object o = field.get(t);
                            if(!"id".equals(fieldName) || ("id".equals(fieldName) && o != null)){
                                if (o instanceof String) {                                                     // 如果string类型, SQL里要加引号
                                    VALUES(fieldName, "'" + o.toString() + "'");
                                } else if(o instanceof Date) {                                                // 如果是日期格式,转换成string: yyyy-MM-dd HH:mm:ss
                                    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                    String dateString = format.format((Date)o);
                                    VALUES(fieldName, "'" + dateString + "'");
                                } else {                                                                     // 如果不是string类型,直接填值
                                    String value = o == null ? "null" : o.toString();
                                    VALUES(fieldName, value);
                                }
                            }
                        }
                    }
                }
            }
        }.toString();
        return sql;
    }
   
    /**
     * 删除指定表,指id行的记录
     */
    public static <T> String delete(final Integer id, final Class<T> t) {
        String sql = new SQL() {
            {
                String tableName = tableName(t);
                DELETE_FROM(tableName);
                WHERE("id = " + id);
            }
        }.toString();
        return sql;
    }

    /**
     * 更新数据库记录
     */
    public static <T> String update(Integer id, Map<String,Object> map, Class<T> t) {
        String sql = new SQL() {
            {
                String tableName = tableName(t);

                Set<String> columns = map.keySet();
                if (id != null && columns != null && columns.size() > 0) {
                    // 生成update
                    UPDATE(tableName);
                    for (String column : columns) {
                        Object o = map.get(column);
                        if (o instanceof String) {                                                     // 如果string类型, SQL里要加引号
                            SET(column + "='" + o.toString() + "'");
                        } else {                                                                     // 如果不是string类型,直接填值
                            String value = o == null ? "null" : o.toString();
                            SET(column + "=" + value);
                        }
                    }
                    //where 条件
                    WHERE("id = " + id);
                }
            }
        }.toString();
        return sql;
    }
   
    /**
     * 根据查询条件查出记录:查询条件用and连接, null或"" 不能作为查询条件
     */
    public static <T> String find(T t) throws IllegalAccessException {
        return new SQL() {
            {
                Class<?> entityClass = t.getClass();
                String tableName = tableName(entityClass);

                // 各字段,如果不为null, 且不为"", 则作为查询条件,并用and连接后,生成SQL
                Field[] fields = entityClass.getDeclaredFields();
                if (fields != null && fields.length > 0) {
                    SELECT("*");
                    FROM(tableName);
                    for (Field field : fields) {
                        String fieldName = field.getName();
                        Ignore ignore = field.getAnnotation(Ignore.class);
                        if (!"serialVersionUID".equals(fieldName) && ignore == null) {
                            field.setAccessible(true);
                            Column column = field.getAnnotation(Column.class);
                            if (column != null) { // 如果有加列注解,用列的注解名
                                fieldName = column.name();
                            }

                            Object o = field.get(t);
                            // 字段值不为null, 且不为"", 才作为条件进行查询
                            if (o != null && !"".equals(o.toString())) {
                                if (o instanceof String) {                                     // 如果string类型, SQL里要加引号
                                    WHERE(fieldName + "='" + o + "'");
                                } else if(o instanceof Date){                                // 如果Date作为查询条件
                                    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                    String value = format.format((Date)o);
                                    WHERE(fieldName + "='" + value + "'");
                                } else { // 如果不是string类型,直接填值
                                    WHERE(fieldName + "=" + o);
                                }
                            }
                        }
                    }
                }
            }
        }.toString();
    }

    /**
     * 根据对象取出表名
     */
    private static <T> String tableName(Class<?> entityClass) {
        // 取出表名
        Table a = entityClass.getAnnotation(Table.class);
        String tableName = null;
        if (a != null) { // 有加注解,写明表名
            tableName = a.name();
        } else { // 没加注解,则用类名
            String className = entityClass.getName();
            tableName = className.substring(className.lastIndexOf("."));
        }
        return tableName;
    }
}