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文件。