DbUtil分析
分析一個(gè)最簡(jiǎn)單的框架流程
dbutil是我知的最簡(jiǎn)單的框架,分析它有利于了解框架的基礎(chǔ)思路
select一個(gè)對(duì)象并返回是此框架最簡(jiǎn)單流程:
@Override public Admin selectAdminByUsername(String name) {Admin admin = null;QueryRunner queryRunner = new QueryRunner();String sql = "select id,username,phone,password,salt from admin where username=?";Connection connection = JdbcUtils.getConnection();// todo BeanHandle???BeanHandler<Admin> beanHandler = new BeanHandler<Admin>(Admin.class);try {admin = queryRunner.query(connection, sql, beanHandler, name);} catch (SQLException e) {System.out.println("adminDaoImpl_e_104");e.printStackTrace();}return admin; }?
在以上代碼段,創(chuàng)建了一個(gè)BeanHandler:BeanHandler<Admin> beanHandler = new BeanHandler<Admin>(Admin.class);
執(zhí)行了sql:admin = queryRunner.query(connection, sql, beanHandler, name);
畫(huà)圖分析了sql執(zhí)行的流程,以及此流程調(diào)用的method,是屬于哪個(gè)類(lèi)(BeanHandler的作用):
? ? ? ? 執(zhí)行的最終,是靠BeanProcessor的tobean方法
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {PropertyDescriptor[] props = this.propertyDescriptors(type);ResultSetMetaData rsmd = rs.getMetaData();int[] columnToProperty = this.mapColumnsToProperties(rsmd, props);return this.createBean(rs, type, props, columnToProperty); } this.createBean如下: private <T> T createBean(ResultSet rs, Class<T> type, PropertyDescriptor[] props, int[] columnToProperty) throws SQLException {T bean = this.newInstance(type);for(int i = 1; i < columnToProperty.length; ++i) {if (columnToProperty[i] != -1) {PropertyDescriptor prop = props[columnToProperty[i]];Class<?> propType = prop.getPropertyType();Object value = this.processColumn(rs, i, propType);if (propType != null && value == null && propType.isPrimitive()) {value = primitiveDefaults.get(propType);}this.callSetter(bean, prop, value);}}return bean; }斷點(diǎn)調(diào)試:
每執(zhí)行一次for循環(huán):通過(guò)PropertyDescriptor prop,設(shè)置空參bean(反射instance創(chuàng)建)的一個(gè)子屬性(根據(jù)rs)最終返回處理好的bean
?
總結(jié)
- 上一篇: selenium+python笔记3
- 下一篇: android- Auto Monit