博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis实现最基本的Cred
阅读量:3676 次
发布时间:2019-05-21

本文共 10580 字,大约阅读时间需要 35 分钟。

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

SqlBuiderTemplete如下:

public class SqlBuilderTemplete
{ /** * 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
id=new HashMap
(); 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
id=new HashMap
(); 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
* @see */ public Map
id(){ Map
result=new HashMap
(); 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
, List
> columnMap = new HashMap
, List
>(); 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
columnList = new ArrayList
(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
* @see */ public List
returnWhereColumnsName() { Field[] fields = this.getClass().getDeclaredFields(); List
columnList = new ArrayList
(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
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
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
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(); } /* *

Title: toString

Description: 打印类字段信息

* @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
{ /** * 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
{}
OK,至此通用cred完毕,若需要扩展其他的方法,只需要在dao里面新添即可,然后在写个mapper文件。

转载地址:http://qsobn.baihongyu.com/

你可能感兴趣的文章
打印选课学生名单
查看>>
二分查找
查看>>
双端队列
查看>>
线性探测法的查找函数
查看>>
邻接表存储图的广度优先遍历
查看>>
Kylin Cube构建流程
查看>>
新增多个 Flume 实例后,Kafka 数据重复消费问题处理
查看>>
如何从HDFS导入数据到ClickHouse
查看>>
布隆过滤器原理
查看>>
linux查找指定目录下面多种后缀名的方法
查看>>
统计指定路径hive表存量
查看>>
2021年,12月28号开始面试,截止时间2月8号收到的offer情况
查看>>
ES_记一次分页查询(getHits().getTotalHits() 获取总条目)为0的问题
查看>>
elasticsearch---批量修改,批量更新某个字段
查看>>
es java聚合方法——多字段分组并求和
查看>>
Spark读取Json类型的数据与读取Hive中的数据
查看>>
Flink简介与快速入门
查看>>
HDFS小文件优化方法
查看>>
HDFS的I/O流操作
查看>>
GroupingComparator分组(辅助排序)的作用以及GroupingComparator分组案例实操
查看>>