To Patrick_DK: 不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进 To Brain: 是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。 To ajoo: 我倒是常见你的文章:)很受启发 所言极是,我原来不熟悉Java的Collection和一些OO的思想方法,所以采用了错误的定义,现在已部分改为Map。自定义的容器是更灵活,我现在的系统中有两个基类ParameterStruct和ParamList,第一个是参数基类,所有的参数类定义都由它继承,作一定扩展,第二个作为ParamStruct的容器,内部使用JGL的Collection,提供一些find和isExist的方法。因我的系统使用Servlet+XSLT开发,对XML需求比较大,所以我覆盖了它们的toString()。至于没使用标准的ResultSet,而自己定义了一个RecordSet,也有这方面的原因--为RecordSet提供了一个通用的toXml()方法,生成相应的XML串。 至于key采用自定义接口,很好的建议!我原来见一些系统的接口定义都是这样的(Key key,Value value),感觉确实不错:)谢谢大家的建议:)请继续! BTW:CSDN真是郁闷,我现在总发不了消息:发送失败三次后,发送计数更新了,正文却没进去,还告诉我“不能联系回复三次以上” :(
/*
* iSee Software License, Version 1.0
*
* Copyright (c) 2002 iSee Studio. All rights reserved.
*
* 爱思时代科技版权所有
*
*/
package isee.utility.datastorage;import java.io.IOException;import java.util.Hashtable;
import java.util.Map;
/**
* 数据访问接口。 提供对XML和JDBC数据源的数据访问。
*
*@author iSee
*@created 2002年3月30日
*@version 1.0,06/06/2001
*/
public interface DataAccessible
{
//~ Methods ............................................................... /**
* 取得节点的属性列表,仅适用于XML数据源。 针对JDBC数据源,取得的值为下级的数据;
* 针对XML文件,取得的值为指定节点包含的全部元素和属性;属性名称加前缀@,以区分同名元素。
*
*@param key 节点路径
*@return The attributes value
*@exception Exception Description of the Exception
*/
public Hashtable getAttributes( java.lang.String key )
throws Exception; /**
* 查询满足指定条件的数据是否存在。
*
*@param key 数据访问串
*@return 存在返回true,否则返回false
*@exception Exception 出错时抛出
*/
public boolean isExist( String key )
throws Exception; /**
* 设置指定节点的值。 <P>
*
* <CODE> DataAccessible dm = new DataMediator();</CODE></P> <P>
*
* <CODE> String path="project/target[@name='init']/taskdef/@name";</P>
* <P>
*
* <CODE> dm.setValue(path,new Object());</CODE></P>
*
*@param key 数据访问串
*@param value 新值。
*@return long 成功返回1;否则返回0;出现不预期的异常则返回-1;。
*@exception Exception Description of the Exception
*@throws java.io.IOException
*@roseuid 3B64B3E20348
*/
public long setValue( java.lang.String key, Object value )
throws Exception; /**
* 取值(XML数据文件中不能包含PI,否则JDOM将无法解析)。 示例如下: <P>
*
* <CODE> import isee.mymisc.Const; </P> </CODE> <P>
*
* ...</CODE> <P>
*
* <CODE> DataAccessible dm = new DataMediator();</CODE></P> <P>
*
* <CODE> String path;</CODE></P> <P>
*
* <CODE> path = "xml/Root/Node[Code='04']/Name"; <FONT color="green">// 取Code字段值为'04'的Name</FONT>
* </CODE></P> <P>
*
* <CODE> Object value = dm.getValue(path); </P> </CODE> <P>
*
* <CODE> path = "xml/Root/Node[position()=2]/Code"; <FONT color="green">// 取绝对位置为2的记录</FONT>
* </CODE></P> <P>
*
* <CODE> Object value = dm.getValue(path); </P> </CODE> <P>
*
* <CODE> path = "xml/Root/Node[2]/Code"; <FONT color="green">// position()=2的省略写法</FONT>
* </CODE></P> <P>
*
* <CODE> long longValue = dm.getValue(path,Const.DATATYPE_LONG).longValue(); </P>
* </CODE> <P>
*
* <CODE> path = "xml/Root/Node[3]/Code";</CODE></P> <P>
*
* <CODE> int intValue = dm.getValue(path,Const.DATATYPE_INTEGER).intValue(); </P>
* </CODE> <P>
*
* <CODE> path = "xml/Root/Node[4]/Code";</CODE></P> <P>
*
* <CODE> double doubleValue = dm.getValue(path,Const.DATATYPE_DOUBLE).doubleValue(); </P>
* </CODE> <P>
*
* <CODE> path = "xml/Root/Node[last()]/Name";</CODE></P> <P>
*
* <CODE> Object value = dm.getValue(path); </P> </CODE> <P>
*
* <CODE> boolean boolValue = ((Boolean) value).booleanValue(); </P>
* </CODE>
*
*@param key 路径字符串,形如:<BR/>
* XML数据源: Datasource/根节点名称/子节点[过滤条件]<BR/>
* JDBC数据源:Datasource/Root/RecordSet/字段名称[过滤条件]<BR/>
* Datasource为DatastorageConst类中指定的配置文件XMLFileMap.xml的Entry的name属性<BR/>
* 过滤条件包含在[]封闭的区域中,XML的属性前加@区分。 例如:<BR/>
* <CODE>Datasource1/Root/Node/Name<BR/>
* JDBCDatasource/Root/RecordSet/ProductName[ProductID=2]</CODE>
*@return 取到的Object类型的值。可使用强制数据类型转换处理。
*@throws java.lang.Exception
*/
public Object getValue( String key )
throws java.lang.Exception; /**
* 取值,指定期望的数据类型。
*
*@param key 路径字符串,形如:<BR/>
* XML数据源: Datasource/根节点名称/子节点[过滤条件]<BR/>
* JDBC数据源:Datasource/Root/RecordSet/字段名称[过滤条件]<BR/>
* Datasource为DatastorageConst类中指定的配置文件XMLFileMap.xml的Entry的name属性<BR/>
* 过滤条件包含在[]封闭的区域中,XML的属性前加@区分。 例如:<BR/>
* <CODE>Datasource1/Root/Node/Name<BR/>
* JDBCDatasource/Root/RecordSet/ProductName[ProductID=2]</CODE>
*@param dataType 按照该数据类型进行强制类型转换。取值范围参见isee.mymisc.Const类。
*@return 取到的Object类型的值。可使用强制数据类型转换处理。
*@see isee.mymisc.Const
*@throws java.lang.Exception
*/
public Object getValue( String key, int dataType )
throws java.lang.Exception; /**
* <P>
*
* 删除满足指定条件的记录。</P> <P>
*
* <CODE> DataAccessible dm = new DataMediator();</CODE></P> <P>
*
* <CODE> long count = dm.delete("xml/XmlMap/Entry[@name='TestInsert']");</CODE>
* </P>
*
*@param key 数据访问串
*@return 删除的记录数
*@exception Exception Description of the Exception
*/
public long delete( String key )
throws Exception; /**
*@param key
*@param nameValueString Description of the Parameter
*@return String[]
*@exception Exception Description of the Exception
*@deprecated 不建议使用,未实现
*/ //public String[] getValueList(String key); /**
* 在指定的节点插入新值。 <P>
*
* <CODE> DataAccessible dm = new DataMediator();</CODE></P> <P>
*
* <CODE> HashTable values = new HashTable();</CODE></P> <P>
*
* <CODE> values.put("@name","TestInsert");</CODE></P> <P>
*
* <CODE> values.put("Boolean",new Boolean(true));</CODE></P> <P>
*
* <CODE> values.put("Long",65535);</CODE></P> <P>
*
* <CODE> dm.insert("xml/XmlMap/Entry",values);</CODE></P>
*
*@param key 数据源路径:只能有两段
* 第一段为数据源ID,第二段为表名称或XML二级节点(字段容器)名称,不能包含条件。
*@param nameValueString 表征新节点的名值对列表;如:name=name,type=xml,....
*@return long 插入的记录数。
*@exception Exception Description of the Exception
*/
public long insert( String key, String nameValueString )
throws Exception; /**
* 在指定的节点插入新值。
*
*@param key 数据访问串
*@param values HashTable的名值对
*@return 插入的记录数。
*@exception Exception Description of the Exception
*/
public long insert( String key, Map values )
throws Exception;
* 在指定的节点批量插入新值。
*
*@param key 数据访问串
*@param records HashTable的名值对数组
*@return 插入的记录数。
*@exception Exception Description of the Exception
*/
public long insert( String key, Map[] records )
throws Exception; /**
* 读取数据到RecordSet。
*
*@param key 数据访问串
*@param pageNumber 页号
*@param rowsPerPage 每页记录数
*@return 返回的记录集
*@exception Exception Description of the Exception
*@see RecordSet
*/
public RecordSet read( String key, int pageNumber, int rowsPerPage )
throws Exception; /**
* 读取数据到RecordSet。
*
*@param key 数据访问串
*@return isee.utility.datastorage.RecordSet 返回的记录集
*@exception Exception Description of the Exception
*@see RecordSet
*/
public RecordSet read( String key )
throws Exception; /**
* 更新满足指定条件的数据。
*
*@param key 数据访问串
*@param values HashTable的名值对
*@return long 更新操作影响的记录数
*@exception Exception Description of the Exception
*/
public long update( String key, Map values )
throws Exception;
}
我自己先说几个不足吧
1、当时不熟悉Java,返回值该使用int的使用了long,应改为int,但已使用,改变已有源码工作量过大,所以未更正。
2、为统一进行异常定义,未抛出明确类型的异常。
3、欠缺数据迁移的方法,如copy或move。
请指正
通过配置文件来根据数据库的不同,应用服务器的不同(用连接池时)
来达到应用程序使用接口的统一唯一不足的是,定义接口的时候应该采用javax.sql里面Connection,Statement,ResultSet等所有接口的名称和参数,这样客户段就可以直接象使用jdbc一样操作数据库而我做的这个不是,而是取其中主要部分,并且封装到了其中一个类
这样别的程序员还得来熟悉接口
通过配置文件来根据数据库的不同,应用服务器的不同(用连接池时)
来达到应用程序使用接口的统一唯一不足的是,定义接口的时候应该采用javax.sql里面Connection,Statement,ResultSet等所有接口的名称和参数,这样客户段就可以直接象使用jdbc一样操作数据库而我做的这个不是,而是取其中主要部分,并且封装到了其中一个类
这样别的程序员还得来熟悉接口
不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
To Brain:
是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
To Brain:
是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
To Brain:
是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
1。最好不用Hashtable, Map比Hashtable抽象。
2。java.util.Map的方法很多。猜想很多方法都是你不需要的。所以也许你可以自己定义一个更符合自己要求的Map接口。接口越小,别人越好实现。
3。一些key什么的,定义成自己的接口比直接用String更灵活。
1。最好不用Hashtable, Map比Hashtable抽象。
2。java.util.Map的方法很多。猜想很多方法都是你不需要的。所以也许你可以自己定义一个更符合自己要求的Map接口。接口越小,别人越好实现。
3。一些key什么的,定义成自己的接口比直接用String更灵活。
最近在忙什么哪?
几个小建议:
1。 使用Map比使用Hashtable好
2。 自己定义Map接口比用jdk的好。更能体现你的需求
3。 为key使用自定义接口比用String灵活。
To Patrick_DK:
不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
To Brain:
是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
To ajoo:
我倒是常见你的文章:)很受启发
所言极是,我原来不熟悉Java的Collection和一些OO的思想方法,所以采用了错误的定义,现在已部分改为Map。自定义的容器是更灵活,我现在的系统中有两个基类ParameterStruct和ParamList,第一个是参数基类,所有的参数类定义都由它继承,作一定扩展,第二个作为ParamStruct的容器,内部使用JGL的Collection,提供一些find和isExist的方法。因我的系统使用Servlet+XSLT开发,对XML需求比较大,所以我覆盖了它们的toString()。至于没使用标准的ResultSet,而自己定义了一个RecordSet,也有这方面的原因--为RecordSet提供了一个通用的toXml()方法,生成相应的XML串。
至于key采用自定义接口,很好的建议!我原来见一些系统的接口定义都是这样的(Key key,Value value),感觉确实不错:)谢谢大家的建议:)请继续!
BTW:CSDN真是郁闷,我现在总发不了消息:发送失败三次后,发送计数更新了,正文却没进去,还告诉我“不能联系回复三次以上” :(
所以有时还得换一个账号发。史特!另一点浅见:一般不喜欢做一个鸡肋让别人继承。Java里就那么一个鸡肋的位置,要是我占了,别人就没有自由去继承其它不那么绅士的库的鸡肋了。
而且,鸡肋和子类的强耦合关系也很讨厌。你一旦发布了一个鸡肋,再加任何一个函数都有可能造成问题。
现在最大的问题就是你所说过的Key的问题了,原来我的定义是使用自己扩展的XPath,综合考虑了我所可能操纵的数据:主要是JDBC数据和XML数据(当时忽略了Mail,而且也不知道JNDI),因为XML结构比RDB的Table复杂,所以放弃SQL,让它迁就于XPath。带来的问题就是复杂查询(如多表查询)无法进行确切的XPath定义。真是头痛:)
现在最大的问题就是你所说过的Key的问题了,原来我的定义是使用自己扩展的XPath,综合考虑了我所可能操纵的数据:主要是JDBC数据和XML数据(当时忽略了Mail,而且也不知道JNDI),因为XML结构比RDB的Table复杂,所以放弃SQL,让它迁就于XPath。带来的问题就是复杂查询(如多表查询)无法进行确切的XPath定义。真是头痛:)
一管理数据库连接类
package dbproc;
import debug.*;
import java.sql.*;public class ConnectionManager
{
public ConnectionManager(){ writer = new DebugWriter();
}
public String getDriverClass(){
return driver;
} public void setConnectionUrl(String s){
url = s;
} public void setDebug(String b){
debug = b.equals("true");
} public void setUserId(String s){
user = s;
}
/******************
* Sets the passwd for the next logon attempt
* @return String
****************/
public void setPassword(String s){
passwd = s;
} public Connection logon(){
try{
Class.forName( driver ).newInstance();
}
catch (Exception ex){
if (debug)
writer.writeDebug("Error setting driver: "+ex);
}
try{
con = DriverManager.getConnection( url, user, passwd ); if (debug)
writer.writeDebug("Connection succeded! URL: " + url +
" Driver: " + driver + " User: " + user + " Pwd: " + passwd);
return con;
}
catch(Exception ex){
if (debug)
writer.writeDebug("Connection failed! URL: " + url +
" Driver: " + driver + " User: " + user + " Pwd: " + passwd +
ex.getMessage());
return null;
} } private boolean debug = false;
protected Connection con;
protected String driver="sun.jdbc.odbc.JdbcOdbcDriver";
protected String passwd;
protected String user;
protected String url="Jdbc:Odbc:cmusic";
protected DebugWriter writer; public static void main(String[] args) {
ConnectionManager con= new ConnectionManager();
//con.setDebug("true");
con.logon(); }
package dbproc;import java.sql.*;
import debug.*;
import java.util.*;public class dbApp {private ConnectionManager conMan;
private Statement stmt = null;
private ResultSet rs = null;
private DebugWriter writer;
private boolean debug = false;
protected Connection con;
private String sql;
private Vector resultsVector;
public dbApp()
{
writer = new DebugWriter();
conMan= new ConnectionManager();
con = conMan.logon();
resultsVector=new Vector();
}
public void setSql(String s){
sql=s;
}
public String getSql(){
return sql;
}
public void setDebug(String b){
debug = b.equals("true");
}//执行Select语句
public ResultSet executeQuery(String sql) {
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return null;
}
rs = null;try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
return rs;
}public ResultSet executeQuery(){
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return null;
}
rs = null; try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
return rs;
}//执行Insert,Update语句
public void executeUpdate(String sql) {
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return;
}
stmt = null;
rs=null;
try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeQuery(sql);
stmt.close();
con.close();
}
catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
}public void executeUpdate() {
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return;
}
stmt = null;
rs=null;
try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.executeQuery(sql);
stmt.close();
con.close();
}
catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
}
public void closeStmt(){
try{
stmt.close();
}
catch(SQLException e){
if (debug) writer.writeDebug("close stmt error:" +e.getMessage());
e.printStackTrace();}
}public void closeConn(){
try{
con.close();
}
catch(SQLException e){
if (debug) writer.writeDebug("close connection error:" +e.getMessage());
e.printStackTrace();
}
}public Vector executeQueryVector(String s){
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return null;
}
rs = null; try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
ResultSetMetaData meta=rs.getMetaData();
int count;
count=meta.getColumnCount(); while(rs.next()){
HashMap cols=new HashMap(count);
int i;
for (i=0; i<count; i++){
Object ob=rs.getObject(i+1);
if (rs.wasNull()) {
ob=null;
}
cols.put(meta.getColumnName(i+1),ob);
}
resultsVector.add(cols);
}
return resultsVector;
}catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
return null;
}public Vector executeQueryVector(){
if (sql == null || sql.equals("")){
if (debug) writer.writeDebug("sql is null");
return null;
}
rs = null; try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
ResultSetMetaData meta=rs.getMetaData();
int count;
count=meta.getColumnCount(); while(rs.next()){
HashMap cols=new HashMap(count);
int i;
for (i=0; i<count; i++){
Object ob=rs.getObject(i+1);
if (rs.wasNull()) {
ob=null;
}
cols.put(meta.getColumnName(i+1),ob);
}
resultsVector.add(cols);
}
return resultsVector;
}catch(SQLException ex) {
if (debug) writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
}
return null;
}
public static void main(String[] args)
{
dbApp app=new dbApp();
app.setSql("select * from com_register");
/*ResultSet s=app.executeQuery();
try{
while (s.next()){
System.out.print(s.getString(1)+"--");
System.out.println(s.getString(2));
}
}catch(Exception e){e.printStackTrace();}
app.closeStmt();
app.closeConn();*/
/*
Vector a=app.executeQueryVector();
int newcount=a.size();
for (int i=1;i<=newcount;i++)
{
HashMap n=(HashMap)a.get(i);
System.out.println(n.get("usrcode")+"--"+n.get("pwd"));
}*/
}}
“我觉得你是想包装JDBC,然后构造面向应用的接口函数。如插入一条数据,删除数据,修改数据。但这里有一些问题。如插入数据时,显然要知道插入的表名,字段数据,如何做到比较通用?要通用只能在外部化定义,然后程序读取外部文件,进行操作。不知还有什么好方法。”to 网路:
其实在运行期也可以知道表名、字段名等“类”信息,
sql的PreparedStatement里面的.getMetaData()方法可以返回表的信息,java的Reflection机制可以找到object的类信息。
我觉得问题在确定value object的字段与数据库表的字段名对应的方式。 如果是一一对应的问题不大,可对象模型和数据库模型很少有一一映射的,所以这个假设其实变得并不通用。没有读过面向对象数据库的设计思想,呵呵,不知道他们怎么解决的。
你去www.google.com上搜vbsf download java
然后把vbsf下载下来
剩下的老兄自然就明白了,东西早就有人做了出来,只不过影响不大
就算你仍然想做,也可以有很多借鉴意义另外推荐你一本老书,《自学jdbc数据库编程21天》清华出版社98年出的
现在能否买得到不清楚,那里面调用和封装的思想也不错,如果你有兴趣,
巴黎面的东西整理一下封装成一个大包,也是不错的
SQL,就可以操作数据库,无需对 java.sql.* 的知识,支持事务,当然如果想使用 statement 之类的 接口也是支持的,已使用了4年了,感觉十分好!
使用 delete/select/update/insert/ 就可完成 95% 以上的通用操作,
如果要使用高级的,则提供了 tramsaction/connect/statement/resultset等
java.sql.* 中提供的接口
to qfjiang(Jiang) ( ) 信誉:100 你能共享一下你的源码和文档吗?
没什么必要。将项目中有关DB的操作集合成实体类,屏蔽外部对JDBC的接触,即可。
这样的实体在项目框架中,可以理解为永久化资源层。可从根本上隔离应用系统中其他部分对DB的依赖性。再数据库的操作实现一个通用抽象,纯粹是多此一举。OO不能从技术上去想,OO是一种程序组织的细想,OO可以是为了封装操作,封装策略,也可以用来作为整个系统的架构分层来用。
简单的说,对于DB中的一个table,我们有这样一些java文件于之对应:
Model class:封装纯数据类
DAO class:封装DB操作,通常是由父类集成下来,如从OracleDAO集成下来。
properties文件:用来描述table和model类的对应关系,比如
<schema table="test" model="TestModel">
<column name="key" type="char" length="20" field="key" />
....
</schema>
在这种体系下,对于每个表我们只要定制properties文件,然后我们的Dao在运行状态下会读取这个peoperties文件,加载这些meta信息,动态生成和帮定sql语句。
而这些dao,model和properties文件,我们也有代码生成器来自动生成代码。
因此,以前最麻烦的例如修改数据库结构、增加table等问题,在现在的体系下就是小菜一叠,使得开发人员可以把绝大部分精力放在business logic的实现上。 大家可以研究一下Entity Bean的实现和运行方法。
qfjiang(Jiang)
两位兄台,可否共享一下源码吗?
谢谢谢谢谢谢谢谢乐![email protected]
JDBC接口就是SUN提供的API。我实现的BEAN是为了屏蔽DBMS和APPSERVER,通过简单配置做到在各大DB和APPSERVER上的真正的可移植,所以加了一层,通过调用各大DB厂商的JDBC实现类来达到对应用层的接口的统一。这个工作要根据公司的需要项目的需要等等来决定是否必要做;
一般项目是选定DB,APPSERVER这个项目就一直用它,所以没必要做象I做的BEAN。
1.建立一个建立连接池的配置文件eg:.cfg file,含driver,url,user,pass,etc
2.建立连接池类
3.引用连接池建立数据库操作类
4.打包生成jar我像这样做通用性比较好!
用抽象类实现通用的添加,修改,删除,列表查询等功能。
业务处理类继承该抽象类,只需要设置相应的属性字段和值。
调用相应的add,delete,list,update方法即可实现数据操作,
不必写sql.非常有价值。