|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点:编程 Hibernate的一些缺点:好比对象干系的映照设置过量,把持庞大;事件处置面对各类兼容成绩;HQL言语增添进修本钱等。并提出了一些减化和退步计划,详细请看上面的原文,你的倡议又怎样?
想了很长工夫hibernate的一些缺点
1.对象与数据库的映照,关头在于对象干系的映照,可是没做到很幻想,设置过量,把持庞大,别的还会堕落。实在实质在于对象不敷自在。
2.事件处置。这点上更简单出成绩,相对林林总总的事件办理器,要兼容是一个年夜成绩,总回在各类使用服务器上有良多成绩。其实质在于创立了一个自我数据存取小情况,一定面对各类兼容成绩。
3.HQL言语。创建对象查询言语,类SQL,可是分歧于任何一种SQL,调试情况庞大。实质在于创立了一种言语,增添进修本钱。
减化hibernate,将其退步成一个sql天生器,既能够保存原本的次要功效,又能够兼容各类使用服务器和数据库服务器,别的还不必要进修HQL言语。
只必要一系列的功效函数,作一下包装,再依据分歧数据库天生分歧的SQL便可,连数据库范例都不必指定,由于从Connection中能够取得数据库范例属性。
设想中的API:
publicObjectResultMapObject(ResultSetrs,Stringxml) //一行映照单个对象,能够用XML绑定,也能够不必。
publicListSQLMapObjects(Connectionconn,String[]sqls,Stringxml)//将一堆SQL映照成一个对象树,能够用xml来形貌绑定,也能够不必,仅利用ror体例的商定。
借助JDBC和SQL能够构建全部数据存取层。
映照单个对象的代码,将一行纪录映照成单个对象。sql能够是恣意的。
Connectionconn=DriverManager.getConnection(url);
PreparedStatementps=conn.prepareStatement(sql);
ResultSetrs=ps.executeQuery();
while(rs.next())
{
user=(Users)ResultMapObject(rs);
//TODO可使用user
}
映照对象树。
/*
sale_orders发卖定单表
sale_order_details发卖定单细表
products商品表
product_catalogs商品种别表
从sql中就能够剖析出
id是主I
sale_order_details.sale_order_id===>sale_orders.id
sale_order_details.product_catalog_id==>product_catalogs.id
sale_order_details.product_id==>products.id
*/
String[]sqls=newString[]{
"selectid,total_sum,memo,state,modify_date,creator,checkerfromsale_orders",
"selectid,sale_order_id,product_id,product_name,product_catalog_id,model,product_unit,product_amount,product_price,product_sum,memofromsale_order_details",
"selectid,name,catalog,model,price,unit,memo,createtime,state,code,productnofromproducts",
"selectid,name,memofromproduct_catalogs"
};
//不XML映照的,可是o法得知一对一仍是一对多仍是多对多的干系,以是一概建成多对多干系。
Listl=SQLMapObjects(conn,sqls);
/*
l的布局:
sale_orders[]
|-----sale_order_details[](sale_order_details.sale_order_id===>sale_orders.id)
|-----products[](sale_order_details.product_id==>products.id)
|-----product_catalogs[](sale_order_details.product_catalog_id==>product_catalogs.id)
*/
/*带xml*/
/*
sale_orders发卖定单表
sale_order_details发卖定单细表
products商品表
product_catalogs商品种别表
从sql中就能够剖析出
id是主I
sale_order_details.sale_order_id===>sale_orders.id
sale_order_details.product_catalog_id==>product_catalogs.id
sale_order_details.product_id==>products.id
*/
String[]sqls=newString[]{
"selectid,total_sum,memo,state,modify_date,creator,checkerfromsale_orders",
"selectid,sale_order_id,product_id,product_name,product_catalog_id,model,product_unit,product_amount,product_price,product_sum,memofromsale_order_details",
"selectid,name,catalog,model,price,unit,memo,createtime,state,code,productnofromproducts",
"selectid,name,memofromproduct_catalogs"
};
/*
id
id
可选...
product_id
id
可选...
product_catalog_id
id
可选...
可选...
*/
Stringxml="...";
//带xml映照
Listl=SQLMapObjects(conn,sqls,xml);
/*
l的布局:
sale_orders[]
|-----sale_order_details[](sale_order_details.sale_order_id===>sale_orders.id)
|-----products[](sale_order_details.product_id==>products.id)
|-----product_catalogs[](sale_order_details.product_catalog_id==>product_catalogs.id)
*/
固然类要事前写好,这里就不具体写了。
保留成绩更严峻,掏出来用sql映照已能够很好地办理了,基础上一个函数、一群SQL,加上极少的XML就能够表达分明了,可是这不克不及办理保留对象的成绩。
设想中的保留API.
publicvoidsaveObject(Connectionconn,Objectobj,Stringxml);//保留单个对象,复杂地将对象扩大成sql,同意xml映照,也能够不映照
publicvoidsaveObjects(Connectionconn,Listobjs,Stringxml);//将对象树保留到数据库
上一篇掏出的List某人工组合的List能够用saveObjects来保留,这个函数的义务就对照重了,由于没有形态,以是要判别修正过十分贫苦。
一种思绪是在对象是增添属性,然后由开辟者保护,好比界面上是不是修正很有多是有形态位的,这个形态位就能够用起来,然后函数依据这个形态位来判别是不是往更新。
一种思绪是从Class自己中就得知对象是不是被悔改,相似AOP,在修正的时分纪录一下,然后函数来判别是不是悔改,然后构成SQL来更新。
至于批量修正是刚强,间接用SQL便可,进修SQL比HQL的本钱要低,究竟这么多年了。
核心有用函数的思索:基础上都针对SQL的天生,或数据库函数的交换
publicStringgenerateInsertSQL(DBTypetype,Objectobj);//天生insert语句
publicStringgenerateUpdateSQL(DBTypetype,Objectobj);//天生update语句
publicStringgenerateSelectSQL(DBTypetype,Objectobj);//天生select语句
总之这个函数工具箱的思绪有这几条:
1.利用函数,而不是利用情况来取代JDBC或使用服务器。
2.利用成熟的SQL,而不是自创言语,最多增添SQL预处置器,将一些函数转成数据库相干,复杂的文本功效。
3.坚持对各类情况的兼容性。对象是洁净的,固然假如用AOP就很难说对象干不洁净了,不外基础上应当合用于一切的情况中。
弱点:因为没有了情况,保留对象有点贫苦,用SQL来办理批量更新和删除,需要时增添几个SQL语句天生器便可。保留对象树是一个年夜弱点,没有十分好的举措可以将对象树全部保留上去并且效力十分高,只要下面提到的两种不太完善的举措,这都是由于JVM没有供应对象形态的缘故原由。
不外如许用函数的办法来办理多承继的成绩仍是对照洁净恬逸的,既能够静态,又能够静态,为所欲为,天真性、效力和兼容性兼得。
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉, |
|