本文共 10580 字,大约阅读时间需要 35 分钟。
MyBatis通过实现SqlBuilderTemplete模板即可实现基本的增,删,查,改。步骤如下:
SqlBuiderTemplete如下:
public class SqlBuilderTemplete第一步编写model层中的实体:{ /** * 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需要继承如下类:
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 IBaseDaoOK,至此通用cred完毕,若需要扩展其他的方法,只需要在dao里面新添即可,然后在写个mapper文件。{}
转载地址:http://qsobn.baihongyu.com/