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.rarDBFactroy
数据是:+----+-------+-------------+------------+
| 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 都完成了 我会努力的
大家要是认为还可以 帮忙顶贴 哦 我会都都完善哦