怎么获得Model里所有 数据库中存在的字段呢?

目标:

   BaseService<T> 写1个通用的查询方法,参数是 普通的Model。

public List<T> list(T model){

}


public class Brand extends BaseBrand<Brand>{

  

public Company getCompany() {

return super.get("company");

}


public void setCompany(Company company) {

super.put("company", company);

}

}

BaseBrand是自动生成的,而且里面的getter/setter都是 数据库已有字段 生成的。


实现1:

  根据输入参数Brand找到父类 BaseBrand的Class,可以找到它所有的getter方法,进而找到 所有 数据库字段。(Brand里写的是 自定义的方法属性)

有了数据库字段名称,就可以拼接:

  select * from table_name

  where 1=1

  for( 每一个数据库字段){

    and fieldName= model对应字段的值.

  }


实现2:

Table table = TableMapping.me().getTable(model.getClass());

Map<String, Class<?>> columnTypeMap;

表的元数据 有字段名。

怎么找到 这个字段 对应的Model的字段名呢?

比如  数据库字段名 user_name,model可能是userName 也可能是user_name。

JFinal自动解析了数据库的“_”。


想请教波哥,给一种 比较简单的方法,找到信息:

大概的格式:

List{

      数据库字段 user_name,model的字段“userName”


}

  拼接出

  user_name = model.getUserName();




评论区

JFinal

2018-09-20 17:54

通过 TableMapping 得到 Table 对象以后,里面有一些方法可以做很多事情,例如:
getColumnTypeMapEntrySet()
getColumnTypeMap()
getColumnNameSet()

足够满足你的需求了

fansunion

2018-09-20 18:47

@JFinal 怎么匹配到 java对应的属性名呢? 比如 数据库字段叫做user_name,jfinal 转换为 userName,那么 model的get方法为 getUserName。 userName怎么根据列名 找到呢?正在研究

fansunion

2018-09-20 18:53

@JFinal com.jfinal.kit.StrKit.toCamelCase(String) 看过源码就是爽,哈哈哈

fansunion

2018-09-20 19:10

public void test() {
BrandAdminService brandService = BrandAdminService.me;
Brand brand = new Brand();
brand.setYn(1);
brand.setCategoryId(4);
List list=brandService.list(brand);
System.out.println(list.size());
}

public List list(T model){
Table table=TableMapping.me().getTable(model.getClass());
String whereSql = buildWhereSql(model, table);
String sql="select * from " + getTableName() + whereSql;
List list=getDao().find(sql);
return list;
}

public String buildWhereSql(T model, Table table) {
String whereSql=" where 1 = 1";
Set>> set=table.getColumnTypeMapEntrySet();
for(Entry> entry:set){
String columnName=entry.getKey();
String attrName= StrKit.toCamelCase(columnName);
//String getterMethodName = "getter"+StringUtils.capitalize(attrName);
Object attrValue=ReflectionKit.getProperty(model, attrName);
if(attrValue != null){
whereSql+= " and "+columnName+"="+attrValue;
}
}
return whereSql;
}

搞定了。

fansunion

2018-09-20 19:11

后续再优化。Hibernate、Mybatis、JFinal,各种版本的 CRUD。单表操作,非常快。一般不用联表查询。打好基础,今后重在业务和核心技术。

fansunion

2018-09-20 19:14

public class BrandAdminController extends BaseController {

private BrandAdminService service = BrandAdminService.me;

@Override
protected BrandAdminService getService() {
return service;
}
}
符合需求的标准化 Controoler,几行代码就行。
如果变化,再重载或重写一个。
Service完全可以服用,Model/Dao 用 JFinal底层的。
666。
页面,目前考虑用vue,jquery,layui之类的,然后再选择 tree、日期、弹出层等单一牛逼的组件

JFinal

2018-09-21 16:31

@fansunion 复杂查询 sql 的管理、拼接使用 enjoy 来管理比 mybatis 爽得多:
http://www.jfinal.com/doc/5-13

fansunion

2018-09-22 09:35

@JFinal 单表类sql,全部用java的方法,看起来清晰简单。多表复杂查询,用 模版足够了。一般情况下,没有必要使用多表查询,sql复杂,不好维护,性能也容易出问题。 分页查询并且 条件是关联表的字段时,才需要联合查询。 关联id尽可能全部层,包括关联id表的关联id。 name等非索引之类的,看情况。

fansunion

2018-09-22 09:35

@JFinal 目前写了 后台的CRUD,全都是 单表查询足够了,而且几乎都是 BaseService里的方法。BaseController也满足大部分的需要。

热门反馈

扫码入社