|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。j2ee|战略|对象|会见|数据|数据库 几种面向对象的数据库会见战略:
1 JDBC
是最原始的办法,写sql语句,保护性差
上面面向对象的办法:
例如update: 要先掏出对象,更新对象,然后再保留
OrderInfo order = orderService.getOrder(orderId);
order.setStatus(new Integer(2));
orderService.updateOrder(order);
2 Hibernate
利用Hql
3 iBatis
将查询和更新放在maps文件中
<dynamic-mapped-statement name="searchProductList" result-map="result">
select productid, name, descn, category from product
<dynamic prepend="where">
<iterate property="keywordList" open="(" close=")" conjunction="OR">
lower(name) like #keywordList[]# OR lower(category) like #keywordList[]# OR lower(descn) like #keywordList[]#
</iterate>
</dynamic>
4 EasyDBO:
有三种完成办法,咱们只看个中采取annotation的
@Table(tableName="Customer")
public class Customer implements Serializable {
来肯定表名
采取反射的办法,不需求设置装备摆设文件:
public List getRootCustomers() {
return this.dao.query(Customer.class,"(parent_id is null or parent_id='')");
}
List list=dao.query(CustomerPrice.class, "customer_id="+cu.getId()+" and product_id="+p.getId()+" order by vdate desc");
该办法已和ADODB很像了,但和adodb分歧的是,依然没有完成完整主动的Plain SQL转换到PO.
5 PHP's ADODB的j2ee移植
以jdbc查询sql为基本,经由过程反射,范型等办法主动装载。
adodb的办法和下面的easydbo很像,不外在obj到sql的生成上加倍成熟一些,驱动也加倍多
关于查询
/////////////////////////////////////////////////////////////////////////////
//Function: 完成ResultSet对象向ArrayList对象为纠合的对象的转化
//Para:sql,指定的查询Sql
//Para:className,Sql绝对应得JavaBean/FormBean类的名字
//Return:以类className为一笔记录的了局集,完成ResultSet对象向ArrayList对象为集//合的className对象的转化
//////////////////////////////////////////////////////////////////////////////
public ArrayList Select(String sql,String className){
ArrayList paraList=new ArrayList();
try{
if (conn == null){
Connection();
}
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String recordValue="";
Object c1=null;
paraList=new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()){
c1=Class.forName(className).newInstance();
for (int i=1; i<=columnCount; i++) {
if(rs.getString(rsmd.getColumnName(i))!=null){
recordValue=rs.getString(rsmd.getColumnName(i));
}else{
recordValue="";
}
Method m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),new Class[]{recordValue.getClass()});
m.invoke (c1, new Object[]{recordValue});
}
paraList.add(c1);
}
}catch(SQLException ex){
}catch(ClassNotFoundException e){
}catch(NoSuchMethodException e) {
}catch(InvocationTargetException e){
}catch (IllegalAccessException e){
}catch(InstantiationException e){
} finaly{
closeConnection();
return paraList;
}
}
//Function:获得用户列表
//Para:
//Return:前往用户列表
/////////////////////////////////////////////////////////////////////////////
public ArrayList getUsers(){
ArrayList ret=null;
DatabaseManage db=new DatabaseManage();
String sql=" select usr_id,usr_name "
+" from users " ; //该办法的优点是SQL可以随意写,需求的字段也能够随意写,乃至免除了耐久层的LazyLoad
ret=db.Select(sql,"com.domain.User");
return ret;
}
关于单张表,用PO/Formbean来寄存
假如有联系关系多张表,需求一个VO/Map来寄存
关于保留和更新
反省对象外面的每个属性,假如不是null,就构成SQL语句,
更新的时分,先查出这个对象,假如属性不是null,而且属性值变了,才将该属性构成SQL语句
这类办法和Hibernate/Ibatis比拟能够就义一些功能,然而免除了大批的设置装备摆设文件,假如对字段有特别的请求,可以
经由过程annotation来界说。
Annotation可是个好器材,依据jdk手册:Annotations can be read from source files, class files, or reflectively at run time.
所以可以充实使用反射读取annotation来削减代码。
上面是一些例子
@com.acme.util.Name(first=Alfred, middle=E., last=Neuman)
@Table(tableName="Customer")
@ManyToOne(column = "parent_id", fieldType=java.util.HashSet.class,type = Customer.class,lazy=false)
读取的办法是在反射外面利用上面的办法
<T extends Annotation> T xxx = getAnnotation(Class<T> annotationClass)
固然,完成必需声明annotationClass,上面是手册的一个复杂例子
/**
* Describes the Request-For-Enhancement(RFE) that led
* to the presence of the annotated API element.
界说一个标签记号
*/
public @interface RequestForEnhancement {
int id();
String synopsis();
String engineer() default "[unassigned]";
String date(); default "[unimplemented]";
}
这个标签,和它的属性都在下面声了然,上面是某个函数中需求用到这个标签的示例
@RequestForEnhancement(
id = 2868724,
synopsis = "Enable time-travel",
engineer = "Mr. Peabody",
date = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }
因而咱们假如想要挪用这个标签
for (Method m : Class.forName('假定是travelThroughTime地点的类名').getMethods()) {
if (m.isAnnotationPresent(RequestForEnhancement.class)) {
RequestForEnhancement rfe = m.getAnnotation(RequestForEnhancement.class);
上面就能够获得rfe的属性了
}
}
Commons Attributes也是一个替换jdk尺度annotation的计划
PHP中的ADODB之所以壮大,高效是在于PHP数组的壮大和弱变量界说的便利。
固然这里的每个对象就相当于对应数据库的一张表,如许也很好。
由于在营业相当庞杂的时分,联系关系要尽可能罕用,把营业精心设计在数据库表下面而非java对象的纠合的联系关系上。
在大型使用中,普通1:1的联系关系都多利用View来处置联系关系,1:n和n:n的联系关系,建议仍是在DAO外面手动保留,装载和更新
===================
另外还有一些办法,可以便利咱们疾速的将RS酿成可操作的对象,复杂举几个例子以下
1 commons dbutils
Custom RowProcessor
java.lang.Object[] toArray(java.sql.ResultSet rs)
Convert a ResultSet row into an Object[].
java.lang.Object toBean(java.sql.ResultSet rs, java.lang.Class type)
Convert a ResultSet row into a JavaBean.
java.util.List toBeanList(java.sql.ResultSet rs, java.lang.Class type)
Convert a ResultSet into a List of JavaBeans.
java.util.Map toMap(java.sql.ResultSet rs)
Convert a ResultSet row into a Map.
Custom BeanProcessor
java.lang.Object toBean(java.sql.ResultSet rs, java.lang.Class type)
Convert a ResultSet row into a JavaBean.
java.util.List toBeanList(java.sql.ResultSet rs, java.lang.Class type)
Convert a ResultSet into a List of JavaBeans.
2 commons beanutils
ResultSetDynaClass (Wraps ResultSet in DynaBeans)
Connection conn = ...;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery
("select account_id, name from customers");
Iterator rows = (new ResultSetDynaClass(rs)).iterator();
while (rows.hasNext()) {
DynaBean row = (DynaBean) rows.next();
System.out.println("Account number is " +
row.get("account_id") +
" and name is " + row.get("name"));
}
rs.close();
stmt.close();
============
总得来讲,利用反射机制可以极大得便利对数据的各类操作,使操作变得加倍通明,无需设置装备摆设文件
通过这段时间的学习实践,对软件开发有了更多新的认识,不在局限于之前的片面性。当然,现在所学到的东西其实并不多,离当一个真正的程序员,还有很大的差距。 |
|