posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

自用小框架:DB工厂

Posted on 2007-09-19 11:41 G_G 阅读(1481) 评论(6)  编辑  收藏 所属分类: InspirationJDBC
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 都完成了 我会努力的
大家要是认为还可以 帮忙顶贴 哦 我会都都完善哦


评论

# re: 自用小框架:DB工厂  回复  更多评论   

2007-09-19 11:59 by 千里冰封
哈哈,支持一下.

# re: 自用小框架:DB工厂  回复  更多评论   

2007-09-19 12:19 by G_G
千里冰封 谢谢 ^_^

# re: 自用小框架:DB工厂  回复  更多评论   

2007-09-19 12:43 by Artkai
没有考虑下事务??

# re: 自用小框架:DB工厂  回复  更多评论   

2007-09-19 13:30 by G_G
还没加 但后面有时间会 加上 的

# re: 自用小框架:DB工厂[未登录]  回复  更多评论   

2007-09-19 19:01 by unmi
不错,考虑配置的缓存,预编译语句的缓存,数据记录的缓存机制,不过所有的加上去就有得完了。

# re: 自用小框架:DB工厂  回复  更多评论   

2007-09-20 14:01 by 小天
真的很不錯耶~~若有加上transaction那會更好~~

只有注册用户登录后才能发表评论。


网站导航: