From 74e8c4aa68baaf04ca831a3250917684173f3b7c Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Tue, 15 Dec 2015 23:53:35 +0100 Subject: [PATCH] Refactored DBBean and added DBColumn annotation --- Zutil.jar | Bin 1187169 -> 1188166 bytes src/zutil/db/bean/DBBean.java | 120 +++++------------- src/zutil/db/bean/DBBeanConfig.java | 88 +++++++++++++ src/zutil/db/bean/DBBeanSQLResultHandler.java | 13 +- 4 files changed, 124 insertions(+), 97 deletions(-) create mode 100755 src/zutil/db/bean/DBBeanConfig.java diff --git a/Zutil.jar b/Zutil.jar index 710b2141b8bbdd6ec31bf57b2a7bd43b8ca998ce..7466c03d8516a5e5dd61c8735377271d94beb732 100755 GIT binary patch delta 31193 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 delta 30390 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 TZI06%r*9@13>ix>--iDOikc%d diff --git a/src/zutil/db/bean/DBBean.java b/src/zutil/db/bean/DBBean.java index 35ae080..ad75c8a 100755 --- a/src/zutil/db/bean/DBBean.java +++ b/src/zutil/db/bean/DBBean.java @@ -38,8 +38,6 @@ import java.math.BigInteger; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.NoSuchElementException; import java.util.logging.Level; @@ -87,104 +85,41 @@ public abstract class DBBean { } /** - * Sets the name of the table that links different DBBeans together + * Can be used if the column name is different from the field name. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public @interface DBColumn { + /** This is the name of the column in the database for the specified field. SQL rules apply, should not contain any strange characters or spaces **/ + String value(); + } + + /** + * Should be used for fields with lists of DBBeans. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface DBLinkTable { - /** The name of the Link table, SQL rules apply should not contain any strange characters or spaces */ + /** The name of the Link table, SQL rules apply, should not contain any strange characters or spaces */ String table(); /** The class of the linked bean */ Class beanClass(); - /** The name of the column that contains the main objects id, SQL rules apply should not contain any strange characters or spaces */ + /** The name of the column that contains the main objects id, SQL rules apply, should not contain any strange characters or spaces */ String idColumn() default ""; } - /** - * A Class that contains information about a bean - */ - protected static class DBBeanConfig{ - /** The name of the table in the DB **/ - protected String tableName; - /** The name of the id column **/ - protected String idColumn; - /** All the fields in the bean **/ - protected ArrayList fields; - protected DBBeanConfig(){ - fields = new ArrayList(); - } - } - - /** This is a cache of all the initialized beans */ - private static HashMap beanConfigs = new HashMap(); /** This value is for preventing recursive loops when saving */ protected boolean processing_save; /** This value is for preventing recursive loops when updating */ protected boolean processing_update; protected DBBean(){ - if( !beanConfigs.containsKey( this.getClass() ) ) - initBeanConfig( this.getClass() ); + DBBeanConfig.getBeanConfig(this.getClass()); processing_save = false; processing_update = false; } - /** - * @return all the fields except the ID field - */ - public static ArrayList getFields(Class c){ - if( !beanConfigs.containsKey( c.getName() ) ) - initBeanConfig( c ); - return beanConfigs.get( c.getName() ).fields; - } - - /** - * @return the configuration object for the specified class - */ - protected static DBBeanConfig getBeanConfig(Class c){ - if( !beanConfigs.containsKey( c.getName() ) ) - initBeanConfig( c ); - return beanConfigs.get( c.getName() ); - } - - /** - * Caches the fields - */ - private static void initBeanConfig(Class c){ - logger.fine("Initiating new DBBeanConfig( "+c.getName()+" )"); - DBBeanConfig config = new DBBeanConfig(); - // Find the table name - DBTable tableAnn = c.getAnnotation(DBTable.class); - if( tableAnn != null ){ - config.tableName = tableAnn.value(); - config.idColumn = tableAnn.idColumn(); - } - else{ - config.tableName = c.getSimpleName(); - config.idColumn = "id"; - } - // Add the fields in the bean and all the super classes fields - for(Class cc = c; cc != DBBean.class ;cc = cc.getSuperclass()){ - Field[] fields = cc.getDeclaredFields(); - for( Field field : fields ){ - int mod = field.getModifiers(); - if( !Modifier.isTransient( mod ) && - !Modifier.isAbstract( mod ) && - !Modifier.isFinal( mod ) && - !Modifier.isStatic( mod ) && - !Modifier.isInterface( mod ) && - !Modifier.isNative( mod ) && - !config.fields.contains( field )){ - config.fields.add( field ); - } - } - if( tableAnn == null || !tableAnn.superBean() ) - break; - } - - beanConfigs.put(c.getName(), config); - } /** * Saves the object and all the sub objects to the DB @@ -207,7 +142,7 @@ public abstract class DBBean { return; processing_save = true; Class c = this.getClass(); - DBBeanConfig config = getBeanConfig( c ); + DBBeanConfig config = DBBeanConfig.getBeanConfig( c ); try { Long id = this.getId(); // Generate the SQL @@ -218,7 +153,7 @@ public abstract class DBBean { for( Field field : config.fields ){ if( !List.class.isAssignableFrom(field.getType()) ){ query.append(" "); - query.append(field.getName()); + query.append(DBBeanConfig.getFieldName(field)); query.append(","); } } @@ -238,7 +173,7 @@ public abstract class DBBean { for( Field field : config.fields ){ if( !List.class.isAssignableFrom(field.getType()) ){ query.append(" "); - query.append(field.getName()); + query.append(DBBeanConfig.getFieldName(field)); query.append("=?,"); } } @@ -308,7 +243,7 @@ public abstract class DBBean { } // Get the Sub object configuration if(subConfig == null){ - subConfig = getBeanConfig( subobj.getClass() ); + subConfig = DBBeanConfig.getBeanConfig( subobj.getClass() ); sub_idcol = subConfig.idColumn; } // Save links in link table @@ -342,7 +277,7 @@ public abstract class DBBean { */ public void delete(DBConnection db) throws SQLException{ Class c = this.getClass(); - DBBeanConfig config = getBeanConfig( c ); + DBBeanConfig config = DBBeanConfig.getBeanConfig( c ); if( this.getId() == null ) throw new NoSuchElementException("ID field is null( Has the bean been saved?)!"); @@ -366,7 +301,7 @@ public abstract class DBBean { */ public static List load(DBConnection db, Class c) throws SQLException { // Initiate a BeanConfig if there is non - DBBeanConfig config = getBeanConfig( c ); + DBBeanConfig config = DBBeanConfig.getBeanConfig( c ); // Generate query String sql = "SELECT * FROM "+config.tableName; logger.fine("Load All query("+c.getName()+"): "+sql); @@ -386,7 +321,7 @@ public abstract class DBBean { */ public static T load(DBConnection db, Class c, long id) throws SQLException { // Initiate a BeanConfig if there is non - DBBeanConfig config = getBeanConfig( c ); + DBBeanConfig config = DBBeanConfig.getBeanConfig( c ); // Generate query String sql = "SELECT * FROM "+config.tableName+" WHERE "+config.idColumn+"=? LIMIT 1"; logger.fine("Load query("+c.getName()+" id:"+id+"): "+sql); @@ -402,7 +337,7 @@ public abstract class DBBean { * WARNING: Experimental */ public static void create(DBConnection sql, Class c) throws SQLException{ - DBBeanConfig config = getBeanConfig( c ); + DBBeanConfig config = DBBeanConfig.getBeanConfig( c ); // Generate the SQL StringBuilder query = new StringBuilder(); @@ -415,7 +350,7 @@ public abstract class DBBean { for( Field field : config.fields ){ query.append(" "); - query.append( field.getName() ); + query.append( DBBeanConfig.getFieldName(field) ); query.append( classToDBName(c) ); query.append(", "); } @@ -504,7 +439,7 @@ public abstract class DBBean { } } - /** + /** * @return the object id or null if the bean has not bean saved yet */ public Long getId(){ @@ -517,7 +452,12 @@ public abstract class DBBean { public static void cancelGBC(){ DBBeanSQLResultHandler.cancelGBC(); } - + + + + + ////////////////// EXTENDABLE METHODS ///////////////////////// + /** * Will be called whenever the bean has been updated from the database. */ diff --git a/src/zutil/db/bean/DBBeanConfig.java b/src/zutil/db/bean/DBBeanConfig.java new file mode 100755 index 0000000..1573162 --- /dev/null +++ b/src/zutil/db/bean/DBBeanConfig.java @@ -0,0 +1,88 @@ +package zutil.db.bean; + +import zutil.log.LogUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.logging.Logger; + +/** + * A Class that contains information about a bean + */ +class DBBeanConfig{ + private static final Logger logger = LogUtil.getLogger(); + /** This is a cache of all the initialized beans */ + private static HashMap beanConfigs = new HashMap(); + + + /** The name of the table in the DB **/ + protected String tableName; + /** The name of the id column **/ + protected String idColumn; + /** All the fields in the bean **/ + protected ArrayList fields; + + protected DBBeanConfig(){ + fields = new ArrayList(); + } + + + + /** + * @return the configuration object for the specified class + */ + protected static DBBeanConfig getBeanConfig(Class c){ + if( !beanConfigs.containsKey( c.getName() ) ) + initBeanConfig( c ); + return beanConfigs.get( c.getName() ); + } + + /** + * Caches the fields + */ + private static void initBeanConfig(Class c){ + logger.fine("Initiating new DBBeanConfig( "+c.getName()+" )"); + DBBeanConfig config = new DBBeanConfig(); + // Find the table name + DBBean.DBTable tableAnn = c.getAnnotation(DBBean.DBTable.class); + if( tableAnn != null ){ + config.tableName = tableAnn.value(); + config.idColumn = tableAnn.idColumn(); + } + else{ + config.tableName = c.getSimpleName(); + config.idColumn = "id"; + } + // Add the fields in the bean and all the super classes fields + for(Class cc = c; cc != DBBean.class ;cc = cc.getSuperclass()){ + Field[] fields = cc.getDeclaredFields(); + for( Field field : fields ){ + int mod = field.getModifiers(); + if( !Modifier.isTransient( mod ) && + !Modifier.isAbstract( mod ) && + !Modifier.isFinal( mod ) && + !Modifier.isStatic( mod ) && + !Modifier.isInterface( mod ) && + !Modifier.isNative( mod ) && + !config.fields.contains( field )){ + config.fields.add( field ); + } + } + if( tableAnn == null || !tableAnn.superBean() ) + break; + } + + beanConfigs.put(c.getName(), config); + } + + protected static String getFieldName(Field field){ + String name = null; + if(field.getDeclaredAnnotation(DBBean.DBColumn.class) != null) + name = field.getDeclaredAnnotation(DBBean.DBColumn.class).value(); + else + name = field.getName(); + return name; + } +} \ No newline at end of file diff --git a/src/zutil/db/bean/DBBeanSQLResultHandler.java b/src/zutil/db/bean/DBBeanSQLResultHandler.java index e2124bc..f6b4511 100755 --- a/src/zutil/db/bean/DBBeanSQLResultHandler.java +++ b/src/zutil/db/bean/DBBeanSQLResultHandler.java @@ -26,7 +26,6 @@ package zutil.db.bean; import zutil.db.DBConnection; import zutil.db.SQLResultHandler; -import zutil.db.bean.DBBean.DBBeanConfig; import zutil.db.bean.DBBean.DBLinkTable; import zutil.log.LogUtil; @@ -114,7 +113,7 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ this.bean_class = cl; this.list = list; this.db = db; - this.bean_config = DBBean.getBeanConfig( cl ); + this.bean_config = DBBeanConfig.getBeanConfig( cl ); // Initiate DBBeanGarbageCollector if( timer == null ){ @@ -207,7 +206,7 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ * @return a new instance of the bean */ protected DBBean createBean(ResultSet result) throws SQLException{ - try { + try { Long id = result.getLong( "id" ); DBBean obj = getCachedDBBean(bean_class, id, result); if( obj != null ) @@ -222,6 +221,8 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ // Update fields updateBean( result, obj ); return obj; + } catch (SQLException e) { + throw e; } catch (Exception e) { throw new SQLException(e); } @@ -240,7 +241,7 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ obj.processing_update = true; // Get the rest for( Field field : bean_config.fields ){ - String name = field.getName(); + String name = DBBeanConfig.getFieldName(field); // Another DBBean class if( DBBean.class.isAssignableFrom( field.getType() )){ @@ -257,7 +258,7 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ field.getAnnotation( DBLinkTable.class ) != null){ if(db != null){ DBLinkTable linkTable = field.getAnnotation( DBLinkTable.class ); - DBBeanConfig subConfig = DBBean.getBeanConfig( linkTable.beanClass() ); + DBBeanConfig subConfig = DBBeanConfig.getBeanConfig( linkTable.beanClass() ); String linkTableName = linkTable.table(); String subTable = subConfig.tableName; String idcol = (linkTable.idColumn().isEmpty() ? bean_config.tableName : linkTable.idColumn() ); @@ -277,8 +278,6 @@ public class DBBeanSQLResultHandler implements SQLResultHandler{ else obj.setFieldValue(field, result.getObject(name)); } - } catch (Exception e) { - throw new SQLException(e); } finally{ obj.processing_update = false; }