自用小框架:DB工厂

BUG 修改 :
09-20   因为 Oracle  取元数据的字符串需要 大写 至修改并下载更新
测试使用表
      ID                           SN   STATIONNAME          SPELL      DEPOTID 
      -------------- ---- -------------------- ---------- ------- ------------------
      08050000390689    3     永安                              ya                ....
版本升级
09-21 DyanDBUtils 动态面向对象数据库 操作

由于 hibernate 还要table影射成class 这好处和坏处只有我们程序员知道了
        只要修改数据库就大量影射附加工作要做 ,有时影射还有BUG弄的我们@#$%!.....(哈hibernate我是小鸟^_^),我----不要----影射 , 没有他们数据库就又回到jdbc.本人比较喜欢偷懒 哈哈 自己来个小框架吧( 就300来行的代码有兴趣的看看哦 )!!! 

用到技术
     BeanUtil , JDBC元数据(在这我可是好好看了下JDBC,其实他是很强的东西,大家应该好好用用^_^) 
下载 DBFactory.rar
DBFactroy
数据是:
+----+-------+-------------+------------+
| id | title | description | buydate    |
+----+-------+-------------+------------+
|  6 | tt    | asdgwgw     | 1990-12-02 |
+----+-------+-------------+------------+

先看看测试吧

public   class  testNotKonw  extends  TestCase {

    
protected   void  setUp()  throws  Exception {
       //运行 sql 可见
        DBFactory.getTools().setIsShowSql(DBFactory.SHOW);
        
super .setUp();
    }
    
public   void  testDelete() throws  Exception{
         // select 出来 就的 List 中 DynaBean : id , title .....  类型 , 和值都有了
        
for (Iterator it  =  DBFactory.getTools().select( " select * from books " ).iterator();it.hasNext();){
            // 那就是delete : 目的是测试前 删除全部数据
            DBFactory.getTools().delete(it.next());
        }
    }
    
      
public   void  testInsert() throws  Exception{
        // insert 要先new出来个 table->bean  再 添属性  
        Object obj 
=  DBFactory.getTools().getDynaTableClass( " books " ).newInstance();
        BeanUtils.setProperty(obj,
" id " , " 6 " );
        BeanUtils.setProperty(obj,
" title " , " tt " );
        BeanUtils.setProperty(obj,
" description " , " asdgwgw " );
        BeanUtils.setProperty(obj,
" buydate " , new  Date());
       //这几是 insert 了 (简单吧)
        DBFactory.getTools().insert(obj);
    }
    
    
// update
     public   void  testUpdate() throws  Exception{
        
for (Iterator it  =  DBFactory.getTools().select( " select * from books " ).iterator();it.hasNext();){
            Object obj 
=  it.next();
            BeanUtils.setProperty(obj,
" buydate " , new  Date( 90 , 11 , 2 ));
            DBFactory.getTools().update(obj);
        }
    }
}


控制台输出
//testDelete
delete from books where 1=1  and id=6
//testInsert
insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','2007-09-19')
//testUpdate
delete from books where 1=1  and id=6
insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','1990-12-02')

代码关键说明:
关键在BeanUtil 的 DnayBean中 我通过元数据 得到了 这个Bean 属性.属性类型,还有表信息放在 getClass();的字符串中
   EG:    table=...;key=..,..,..;columns=...,..,; 后在insert , delet , update就是(先delete后insert^_^)  中 解析得到 动态写sql语句 
         更举 DnayBean中属性类型看看 Bean value 是否要加 ' value ' 还是直接 value 到sql 中

     public   BasicDynaClass getDynaTableClass(String table){
        Connection conn 
=  getConn() ;
        List props 
=   new  ArrayList();
        DatabaseMetaData dm 
=   null  ;
        BasicDynaClass dynaClass 
=   null  ;
        
try  {    
            dm 
=  conn.getMetaData();
            ResultSet coulumns 
=  dm.getColumns( null , null ,table, null );
            
while (coulumns.next()){
               //元数据中得到 类型做 DynaBean 属性   coulumns.getInt("DATA_TYPE")  是  java.sql.Types.XXXXX
                props.add(
new  DynaProperty( coulumns.getString( " COLUMN_NAME " ),getStrClass(coulumns.getInt( " DATA_TYPE " ))) );
            }
            
//  all : table
            
// delete : column_name column_value
            
// insert : column_name
            StringBuffer sb  =   new  StringBuffer();
            sb.append(
" table= " ).append(table).append( " ; " );
            
            sb.append(
" keys= " );
                ResultSet keys 
=  dm.getPrimaryKeys( null , null ,table);
                
while (keys.next()){
                    sb.append( keys.getString(
" column_name " )).append( " , " );
                }
                sb.replace(sb.length()
- 1 ,sb.length(), " ; " );
            
            sb.append(
" columns= " );    
                ResultSet couls 
=  dm.getColumns( null , null ,table, null );
                
while (couls.next()){
                    sb.append( couls.getString(
" column_name " )).append( " , " );
                }
                sb.replace(sb.length()
- 1 ,sb.length(), " ; " );
                
            //为 Class name  <- sb.toString()
            dynaClass 
=   new  BasicDynaClass(sb.toString() ,  null
                    (DynaProperty[])props.toArray(
new  DynaProperty[]{}) );
        } 
catch  (Exception e) {e.printStackTrace();}
        
finally {
            
try  {
                conn.close() ;
            } 
catch  (SQLException e) {e.printStackTrace();}
        }
        
return  dynaClass ;
    }

insert , delete 差不多 就来insert

     public   boolean  insert(Object obj){
        String sqlstrat 
=   " insert into  " ;
        String sqldo 
=   "  values(  " ;
        String sqlend 
=   " ) " ;
        String sql 
=   "" ;
        
boolean  od  =   false  ;
        
        Connection conn 
=  getConn() ;
        Statement sta 
=   null  ;
        
try  {
             //解析getDynaClass().getName()  得到 table
            sqlstrat 
+=  getTableConfig(obj, " table " )[ 0 ] + " ( "  ;
            
             //解析getDynaClass().getName()  得到 columns
            String[] cols 
=  getTableConfig(obj, " columns " );
            
for ( int  i = 0 ;i < cols.length;i ++ ){
                sqlstrat 
+=  cols[i]   + " , " ;
                sqldo 
+=  getSqlAtt(obj,cols[i] ) + " , " ;
            }
            sql 
=  sqlstrat.substring( 0 ,sqlstrat.length() - 1 ) + " ) " + sqldo.substring( 0 ,sqldo.length() - 1 ) + sqlend;
            sta 
=  conn.createStatement();
            
if ( sta.executeUpdate(sql) > 0 ){od  =   true ;};
        } 
catch  (Exception e) {e.printStackTrace();}
        
finally {
            
try  {
                
if ( isShowSql == SHOW ) {System.out.println();System.out.println(sql);}
                conn.close();
            } 
catch  (SQLException e) {e.printStackTrace();}
        }
        
return  od ;
    }



小结:
当然表连和多表 是没问题的
但在多表 delete , update 就还没有完成 (蛮难的 5555  还有 没时间)
单表的 delete update ,select,insert 都完成了 我会努力的
大家要是认为还可以 帮忙顶贴 哦 我会都都完善哦

你可能感兴趣的:(自用小框架:DB工厂)