MyBatis实现最基本的Cred

MyBatis通过实现SqlBuilderTemplete模板即可实现基本的增,删,查,改。步骤如下:

SqlBuiderTemplete如下:

public class SqlBuilderTemplete<T extends ModelObject> {

    /**
     * insert
     * 
     * @Description 通用Insert方法
     * @param obj 操作对象
     * @return String 返回插入SQL语句
     * @see
     */
    public String insert(T obj) {
        BEGIN();
        INSERT_INTO(obj.tableName());
        obj.caculationColumnList();
        VALUES(obj.returnInsertColumnsName(), obj.returnInsertColumnsDefine());
        return SQL();
    }

    /**
     * update
     * 
     * @Description 通用Update方法
     * @param obj 操作对象
     * @return String 返回插入SQL语句
     * @see
     */
    public String update(T obj) {
        
        Map<String, String> id=new HashMap<String, String>();
        id=obj.id();
        String dbName=id.get("dbName");
        String modelName=id.get("modelName");
        BEGIN();
        UPDATE(obj.tableName());
        obj.caculationColumnList();
        SET(obj.returnUpdateSet());
        WHERE(dbName + "=#{" + modelName + "}");
        return SQL();
    }

    /**
     * delete
     * 
     * @Description 通用Delete方法
     * @param obj 操作对象
     * @return String 返回插入SQL语句
     * @see
     */
    public String delete(T obj) {
        
        Map<String, String> id=new HashMap<String, String>();
        id=obj.id();
        String dbName=id.get("dbName");
        String modelName=id.get("modelName");
        BEGIN();
        DELETE_FROM(obj.tableName());
        WHERE(dbName + "=#{" + modelName + "}");
        return SQL();
    }
}

第一步编写model层中的实体:

model需要继承如下类:

public class ModelObject implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * tableName
     * 
     * @Description 获取Model对象对应的表名,需要Model对象中的属性定义@Table(name)
     * @return String
     * @see
     */
    public String tableName() {
        Table table = this.getClass().getAnnotation(Table.class);
        if (table != null)
            return table.name();
        else
            throw new ModelStructureException(
                    "undefine Model Object @Table, need Tablename(@Table(name))");
    }

   
    
    /**
     * id 
     * 
     * @Description 获取Model对象中的主键字段名,需要定义@Id,@Column
     * @return Map<String,String>
     * @see
     */
    public Map<String, String> id(){
        Map<String, String> result=new HashMap<String, String>();
        for (Field field : this.getClass().getDeclaredFields()) {
            if(field.isAnnotationPresent(Id.class)){
                
                if(field.isAnnotationPresent(Column.class)){
                    
                    Column column=field.getAnnotation(Column.class);
                    if(StringUtils.isNotBlank(column.name())){
                        
                        //实体字段名称
                        result.put("modelName", field.getName());
                        
                        //对应数据库字段名称
                        result.put("dbName", column.name());
                    }else {
                        result.put("modelName", field.getName());
                        result.put("dbName", field.getName());
                    }
                }else {
                    result.put("modelName", field.getName());
                    result.put("dbName", field.getName());
                }
            }
            continue;  
        }
        if(result.size()==0)
            throw new RuntimeException("undefine Model Object @Id");
        return result;
    }

    /**
     * @Fields columnMap 存放Model对象的列信息
     */
    private transient static Map<Class<? extends ModelObject>, List<String>> columnMap = new HashMap<Class<? extends ModelObject>, List<String>>();

    private boolean isNull(String filedname){
        Field[] fields = this.getClass().getDeclaredFields();
        for (Field field : fields) {
            
            if (field.isAnnotationPresent(Column.class)) {
                
                Column column=field.getAnnotation(Column.class);
                if(StringUtils.isNotBlank(column.name()) && filedname.equals(column.name())) {
                    return false;
                }
                if(StringUtils.isBlank(column.name()) && filedname.equals(field.getName())){
                    return isNull(field);
                }
                    
            }
            continue;
        }
        return true;
    }
 
    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;
    }

    /**
     * caculationColumnList
     * 
     * @Description 用于计算类定义 ,需要Model Object中的属性定义@Column(name)
     * @return void
     * @see
     */
    
    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) && !field.isAnnotationPresent(Id.class))
            {
                Column column=field.getAnnotation(Column.class);
                if(StringUtils.isNotBlank(column.name())){
                    
                    columnList.add(column.name());
                }else {
                    
                    columnList.add(field.getName());
                }
            }
        }

        columnMap.put(this.getClass(), columnList);
    }

    /**
     * returnWhereColumnsName
     * 
     * @Description 获取用于Where的 有值字段表
     * @return List<WhereColumn>
     * @see
     */
    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)){
                    Column column=field.getAnnotation(Column.class);
                    if(StringUtils.isNotBlank(column.name())){
                        
                        columnList.add(new WhereColumn(column.name(), field.getGenericType()
                                .equals(String.class)));
                    }else {
                        
                        columnList.add(new WhereColumn(field.getName(), field.getGenericType()
                                .equals(String.class)));
                    }
                }
        }

        return columnList;
    }

    /**
     * WhereColumn
     * 
     * @Description Where条件信息
     * @author EngineerLi
     * @version 版本号:1.0,2015-3-19
     * @see
     * @since
     */
    public class WhereColumn {

        public String name;
        public boolean isString;

        public WhereColumn(String name, boolean isString) {
            this.name = name;
            this.isString = isString;
        }
    }

    /**
     * returnInsertColumnsName
     * 
     * @Description 用于获取Insert的字段累加
     * @return String
     * @see
     */
    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();
    }

    /**
     * returnInsertColumnsDefine
     * 
     * @Description 用于获取Insert的字段映射累加
     * @return String
     * @see
     */
    public String returnInsertColumnsDefine() {

        StringBuilder sb = new StringBuilder();
        List<String> list = columnMap.get(this.getClass());
        Field[] fields = this.getClass().getDeclaredFields();
        int i = 0;
        for (String column : list) {
            if (isNull(column))
                continue;

            for (Field field : fields) {
                if (field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Id.class))
                {
                    Column col=field.getAnnotation(Column.class);
                    if(StringUtils.isNotBlank(col.name()) && column.equals(col.name())){
                        if (i++ != 0)
                            sb.append(',');
                        sb.append("#{").append(field.getName()).append('}');
                    }
                    if(StringUtils.isBlank(col.name()) && column.equals(field.getName())){
                        if (i++ != 0)
                            sb.append(',');
                        
                        sb.append("#{").append(field.getName()).append('}');
                    }
                        
                }
            }
           
        }
        
        return sb.toString();
        
    }

    /**
     * returnUpdateSet
     * 
     * @Description 用于获取Update Set的字段累加
     * @return String
     * @see
     */
    public String returnUpdateSet() {
        StringBuilder sb = new StringBuilder();

        List<String> list = columnMap.get(this.getClass());
        Field[] fields = this.getClass().getDeclaredFields();
        int i = 0;
        for (String column : list) {
            if (isNull(column))
                continue;

           
            for (Field field : fields) {
                if (field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Id.class))
                {
                    Column col=field.getAnnotation(Column.class);
                    if(StringUtils.isNotBlank(col.name()) && column.equals(col.name()))
                    {
                        if (i++ != 0)
                            sb.append(',');
                        
                        sb.append(column+"=").append("#{").append(field.getName()).append('}');
                    }
                    if(StringUtils.isBlank(col.name()) && column.equals(field.getName())){
                        if (i++ != 0)
                            sb.append(',');
                        
                        sb.append(column+"=").append("#{").append(field.getName()).append('}');
                    }
                        
                }
            }
          
        }
        return sb.toString();
    }

    
    
    public Integer getId() {
        return 0;
    }

    /**
     * toJSONString
     * 
     * @Description 转化Model Object为JSon格式
     * @return String
     * @see
     */
    public String toJSONString() {
        JSONObject json = new JSONObject(this);
        return json.toString();
    }

    /*
     * <p>Title: toString</p> <p>Description: 打印类字段信息</p>
     * @return
     * @see java.lang.Object#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();
    }
}

例如:

public class Nation extends ModelObject {

    /**
     * @Fields serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "nation_id")
    private Integer nationId;
    
    @Column(name = "nation_name")
    private String nationName;



    public Integer getNationId() {
		return nationId;
	}

	public void setNationId(Integer nationId) {
		this.nationId = nationId;
	}

 
	public String getNationName() {
		return nationName;
	}

	public void setNationName(String nationName) {
		this.nationName = nationName;
	}

	@Override
    public String toString() {
        String messageFormat = "Nation[nationId:{0},nationName:{1}]";
        return MessageFormat.format(messageFormat, nationId, nationName);
    }
}

OK,model层的搞定:

----------------------------------------------------------------------------------------------------------------

presist层的到需要继承IBaseDao:

public interface IBaseDao<T extends ModelObject> {

    /**
     * selectOneById 根据id查找数据,无具体实现需有子接口自行实现
     * 
     * @Description
     * @param id
     * @return T
     * @see
     */
    public abstract T selectOneById(Integer id);

    /**
     * insert
     * 
     * @Description 通用插入方法
     * @param obj 操作对象 void
     * @see
     */
    @InsertProvider(type = SqlBuilderTemplete.class, method = "insert")
    public void insert(T obj);

    /**
     * update
     * 
     * @Description 通用更新方法
     * @param obj 操作对象 void
     * @see
     */
    @UpdateProvider(type = SqlBuilderTemplete.class, method = "update")
    public void update(T obj);

    /**
     * delete
     * 
     * @Description 通用删除方法
     * @param obj 操作对象 void
     * @see
     */
    @DeleteProvider(type = SqlBuilderTemplete.class, method = "delete")
    public void delete(T obj);
}

例如:

public interface INationDao extends IBaseDao<Nation> {

}

OK,至此通用cred完毕,若需要扩展其他的方法,只需要在dao里面新添即可,然后在写个mapper文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值