jfinal以插件的形式封裝了jdbc
5.1 Model一個實例對應(yīng)一張表
ActiveRecordPlugin類 通過List集合維護了項目中所有的表
//配置文件
arp.addMapping("tb_item", User.class);
// 存放了所有的Table约郁,對應(yīng)數(shù)據(jù)庫的表
private List<Table> tableList = new ArrayList<Table>();
// 226 維護TableMapping類的modelToTableMap 存放<class,table>映射
new TableBuilder().build(tableList, config);
Table類
private String name;//表名
private String[] primaryKey = null;
//
private Map<String, Class<?>> columnTypeMap; // config.containerFactory.getAttrsMap();
private Class<? extends Model<?>> modelClass;
ModelBuilder類的build方法,完成了數(shù)據(jù)庫表列名骑祟,到Model對象參數(shù)名的映射
public <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass) throws SQLException, InstantiationException, IllegalAccessException {
List<T> result = new ArrayList<T>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] labelNames = new String[columnCount + 1];
int[] types = new int[columnCount + 1];
// 從結(jié)果集中獲取每一列的 列名稱 和 列類型 集合
buildLabelNamesAndTypes(rsmd, labelNames, types);
while (rs.next()) {
Model<?> ar = modelClass.newInstance();
Map<String, Object> attrs = ar._getAttrs();
for (int i=1; i<=columnCount; i++) {
Object value;
if (types[i] < Types.BLOB)
value = rs.getObject(i);
else if (types[i] == Types.CLOB)
value = handleClob(rs.getClob(i));
else if (types[i] == Types.NCLOB)
value = handleClob(rs.getNClob(i));
else if (types[i] == Types.BLOB)
value = handleBlob(rs.getBlob(i));
else
value = rs.getObject(i);
// 填充Model的字段信息 <參數(shù)名饥努,參數(shù)值>
attrs.put(labelNames[i], value);
}
result.add((T)ar);
}
// 返回Model對象的結(jié)果集
return result;
}
Model類主要就關(guān)注attrs屬性 用一個map集合替代了傳統(tǒng)javaBean的屬性(從resultSet中取出來)
tips:
1.getModel 其實調(diào)原理就是從request中獲取Map參數(shù)集合,遍歷Map在set到model
2.可以同過TableMapping獲取表相關(guān)信息剃根,Table user = TableMapping.me().getTable(User.class);
5.2 Db
model有很多方法都是間接的在調(diào)用Db -> DbPro
model 和Db存在數(shù)據(jù)源的問題打毛,大體調(diào)用方法一致 核心代碼就是ModelBuild類build方法