1.User类 java
import com.jfinal.plugin.activerecord.Model; /** * user model. */ @SuppressWarnings("serial") public class User extends Model<User> { public static final User dao = new User(); }
2. configPlugin(Plugins me)这里实例化一个ActiveRecordPlugin类,将数据库代表与实体类的映射保存到ActiveRecordPlugin类中 mysql
@Override public void configPlugin(Plugins me) { C3p0Plugin cp = new C3p0Plugin(Util.JDBC, Util.USER, Util.PASSWORD); me.add(cp); ActiveRecordPlugin arp = new ActiveRecordPlugin(cp); me.add(arp); arp.addMapping("user", User.class);//将user(数据库表名)与User(模型类)映射关系保存到arp中 }
3.ActiveRecordPlugin类 sql
将表-类映射封装到TableInfo中,并 用一个 List<TableInfo> tableMappings 保存 数据库
public ActiveRecordPlugin addMapping(String tableName, Class < ? extends Model < ? >> modelClass) { tableMappings.add( new TableInfo(tableName, modelClass)); return this; }
系统启动时用TableInfoBuilder类来实现表中具体元素和类的映射 设计模式
public boolean start() { if (isStarted) return true; if (dataSourceProvider != null) dataSource = dataSourceProvider.getDataSource(); if (dataSource == null) throw new RuntimeException( "ActiveRecord start error: ActiveRecordPlugin need DataSource or DataSourceProvider"); DbKit.setDataSource(dataSource); //设置数据库的具体实现(这里用的是mysql)使用了工厂设计模式 isStarted = true; return TableInfoBuilder.buildTableInfo(tableMappings); //去实现具体的映射 }
class TableInfoBuilder { static boolean buildTableInfo(List <TableInfo > tableMappings) { boolean succeed = true; Connection conn = null; try { conn = DbKit.getDataSource().getConnection(); } catch (SQLException e) { throw new ActiveRecordException(e); } TableInfoMapping tim = TableInfoMapping.me(); //最终保存表与类的映射,单例 for (TableInfo mapping : tableMappings) { //遍历以前保存映射的List try { TableInfo tableInfo = doBuildTableInfo(mapping, conn); //从数据库中读取到表的全部字段及类型,封装到TableInfo类中 tim.putTableInfo(mapping.getModelClass(), tableInfo);// 最终保存表与类的映射 } catch (Exception e) { succeed = false; System.err.println( "Can not build TableInfo, maybe the table " + mapping.getTableName() + " is not exists."); throw new ActiveRecordException(e); } } DbKit.close(conn); return succeed; } /** * 从数据库中读取到表的全部字段及类型,封装到TableInfo类中 * **/ private static TableInfo doBuildTableInfo(TableInfo tableInfo, Connection conn) throws SQLException { TableInfo result = tableInfo; //保存类的全部属性及类型 String sql = DbKit.getDialect().forTableInfoBuilderDoBuildTableInfo(tableInfo.getTableName()); Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); for ( int i = 1; i < =rsmd.getColumnCount(); i ++) { String colName = rsmd.getColumnName(i); //取得列表标题(类属性) String colClassName = rsmd.getColumnClassName(i); //属性的type if ( "java.lang.String".equals(colClassName)) { // varchar, char, enum, set, text, tinytext, mediumtext, longtext result.addInfo(colName, java.lang.String. class); } else if ( "java.lang.Integer".equals(colClassName)) { // int, integer, tinyint, smallint, mediumint result.addInfo(colName, java.lang.Integer. class); } else if ( "java.lang.Long".equals(colClassName)) { // bigint result.addInfo(colName, java.lang.Long. class); } // else if ("java.util.Date".equals(colClassName)) { // java.util.Data can not be returned // java.sql.Date, java.sql.Time, java.sql.Timestamp all extends java.util.Data so getDate can return the three types data // result.addInfo(colName, java.util.Date.class); // } else if ( "java.sql.Date".equals(colClassName)) { // date, year result.addInfo(colName, java.sql.Date. class); } else if ( "java.lang.Double".equals(colClassName)) { // real, double result.addInfo(colName, java.lang.Double. class); } else if ( "java.lang.Float".equals(colClassName)) { // float result.addInfo(colName, java.lang.Float. class); } else if ( "java.lang.Boolean".equals(colClassName)) { // bit result.addInfo(colName, java.lang.Boolean. class); } else if ( "java.sql.Time".equals(colClassName)) { // time result.addInfo(colName, java.sql.Time. class); } else if ( "java.sql.Timestamp".equals(colClassName)) { // timestamp, datetime result.addInfo(colName, java.sql.Timestamp. class); } else if ( "java.math.BigDecimal".equals(colClassName)) { // decimal, numeric result.addInfo(colName, java.math.BigDecimal. class); } else if ( "[B".equals(colClassName)) { // binary, varbinary, tinyblob, blob, mediumblob, longblob // qjd project: print_info.content varbinary(61800); result.addInfo(colName, byte[]. class); } else { int type = rsmd.getColumnType(i); if (type == Types.BLOB) { result.addInfo(colName, byte[]. class); } else if (type == Types.CLOB || type == Types.NCLOB) { result.addInfo(colName, String. class); } else { result.addInfo(colName, String. class); } // core.TypeConverter // throw new RuntimeException("You've got new type to mapping. Please add code in " + TableInfoBuilder.class.getName() + ". The ColumnClassName can't be mapped: " + colClassName); } } rs.close(); stm.close(); return result; } }
private String tableName;//表名 private String primaryKey;//主键 private String secondaryKey = null; @SuppressWarnings( "unchecked") private Map <String, Class < ? >> columnTypeMap = DbKit.containerFactory.getAttrsMap(); // new HashMap<String, Class<?>>(); private Class < ? extends Model < ? >> modelClass;