淘特cms
当前位置:淘特CMS->产品中心->淘特JavaCms->产品特色
高性能/扩展
  • 作者:本站
  • 日期:2007/8/5 10:54:30
  • 出处:淘特CMS
  • 点击:

采用高性能的数据库连接池,提供tomcat、weblogic等容器连接池接口,统一的DaoFactory管理,扩展开发容易

框架说明:
·基于MVC三层架构,业务、控制、显示层层分离,面向对象的编程思想,扩展开发容易。
·数据库模块统一放置于包tot.dao.jdbc中,所有业务逻辑相关操作,由统一的DAOFactory获取并实例化,便于系统的统一管理。
打个比方:如果你原来的广告管理使用的AdDaoJDBC类,如果你通过二次开发(扩展AdDaoJDBC类更加快洁)新建一个类AdNewDaoJDBC,
那么只要在DAOFactory中更改AdDao实例类为AdNewDaoJDBC,无需修改其它代码,所有系统中的相关广告管理都会自动更新到你新开发的类AdNewDaoJDBC上。
·基于语言包的管理,每个国家的语言包以属性文件的形式存放,更换语言容易。使用记事本等编辑软件打开修改后,即可自动更新。无需编程。
·系统以已提供高性能的连接池,同时提供各WEB容器的连接池接口,只需要设置相关参数就可以进行数据库操作。
·统一的数据库BEAN工厂(tot.bean.DataField),通过引用(import)系统中的DataField类,即可完成数据库中字段的复值、取值。
·而不需要再写专门的数据bean,对于任何一个工程来讲,都会大大降低了重复工作量。
说明:DataField对应中数据库中的一行记录,通过它的setField()方法增加字段,然后再通过getFieldValue()方法获取字段值。

AbstractDao类说明:

数据操作类(tot.dao.AbstractDao),作为数据库操作的基础类,本系统中所有的数据库业务对象均扩展此类,通过其提供的一系统方法,
只要构造相应的sql查询语句就可以获取相应的记录对象。无需再写专门的处理程序。

以下函数为部分方法说明:

public Collection getData(String sqlStr,String fieldArr){}

函数说明:获取数据记录
参数:
* @paramsqlStr   用于查询数据库的标准sql语句
* @paramfieldArr 用于返回字段的名称映射
* @返回类型 Collection.

public Collection getDataList_mysqlLimit(String sqlStr,String fieldArr,int rowsNum, int offset){}

函数说明:数据显示分页函数,专用于mysql数据库
参数:
* @param sqlStr 数据库查询SQL语句.
* @param fieldArr 需要返回的字段.
* @param rowsNum 每页显示数据行数.
* @param offset 当前回溯位置.
* @返回类型 Collection.

public Collection getDataList_Limit_Normal(String sqlStr,String fieldArr,int rowsNum,int offset){}

函数说明:数据显示分页函数,适用于支持记录回滚的数据库。
参数:
* @param sqlStr 数据库查询SQL语句.
* @param fieldArr 需要返回的字段.
* @param rowsNum 每页显示数据行数.
* @param offset 当前回溯位置.
* @返回类型 Collection.

public DataField getFirstData(String sqlStr,String fieldArr){}

函数说明:据SQL语句查询获得第一条记录
参数:
* @param sqlStr SQL查询语句
* @param fieldArr 需要返回的字段名称
* @返回类型 DataFild
*/

public int getDataCount(String sqlStr){}
函数说明:获取记录个数,如:getDataCount("select count(*) from 表")
返回类型:int

public boolean exe(String sqlStr) throws ObjectNotFoundException,DatabaseException{}
函数说明:执行sql更新语句 如:exe("update table set field=1 where id=1")
返回类型:boolean

public void bat(String sqlStr,String[] fieldvalue){ }

函数说明:批量执行sql更新语句 如:bat("update table set field=1 where id=?",String对象)


备注:
以上函数中均包含sqlStr和fieldArr两个参数,他们分别是要执行的sql语句和要返回的字段名称,注意字段个数
要和你查询的字段字数相同比如:
sqlStr设置如下:"select id,Title,Content from t_article"
因为上面sql查询语句返回3个字段,因此fieldArr要设置如下:
"id,Title,Content",因为这三个字段是数据库bean中的字段设置、取值所用的字段名称,其名字是随意的,只要字段个数
与sqlStr查询语句中返回的字段个数一致就可以了。因此fieldArr你也以设置如:
"a1,a2,a3"
因此根据设置的bean字段名称不同,我们取字段值所采用的字段名称也是不同的。
如:
df.getFieldValue("id"),df.getFieldValue("Title")等是根据fieldArr="id,Title,Content"时的取值。
df.getFieldValue("a1"),df.getFieldValue("a2")等是根据fieldArr="a1,a2,a3"时的取值。

以下例子是一个完整的二次开发数据库类的例子(一个广告操作的数据库类):
package tot.dao.jdbc;
import tot.dao.AbstractDao;
import tot.db.DBUtils;
import tot.bean.*;
import tot.exception.ObjectNotFoundException;
import tot.exception.DatabaseException;
import java.sql.*;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
 *
 * @author tot
 */
public class AdDaoImplJDBC extends AbstractDao{
    private static Log log = LogFactory.getLog(AdDaoImplJDBC.class);
    /** Creates a new instance of AdDaoImplJDBC */
    public AdDaoImplJDBC() {
    }
/** 广告添加 */
    public boolean add(String title,String content,Timestamp moditime){
        Connection conn = null;
        PreparedStatement ps = null;
        boolean returnValue=true;
        String sql="insert into t_ad(Title,Content,ModiTime) values(?,?,?)";
        try{
            conn = DBUtils.getConnection();
            ps=conn.prepareStatement(sql);           
            ps.setString(1,title);
            ps.setString(2,content);
            ps.setTimestamp(3,moditime);
            if(ps.executeUpdate()!=1) returnValue=false;
        } catch(SQLException e){
            log.error("add error",e);
        } finally{
            DBUtils.closePrepareStatement(ps);
            DBUtils.closeConnection(conn);
        }
        return returnValue;
    }
    /*
     * 广告修改
     */
    public boolean mod(int id,String title,String content,Timestamp moditime){
        Connection conn = null;
        PreparedStatement ps = null;
        boolean returnValue=true;
        String sql="update t_ad set Title=?,Content=?,ModiTime=? where id=?";
        try{
            conn = DBUtils.getConnection();
            ps=conn.prepareStatement(sql);
            ps.setString(1,title);
            ps.setString(2,content);
            ps.setTimestamp(3,moditime);
            ps.setInt(4,id);
            if(ps.executeUpdate()!=1) returnValue=false;
        } catch(SQLException e){
            log.error("mod error",e);
        } finally{
            DBUtils.closePrepareStatement(ps);
            DBUtils.closeConnection(conn);
        }
        return returnValue;
    }   
    /* 广告删除 */
    public boolean del(int id) throws ObjectNotFoundException,DatabaseException{
        return exe("delete from t_ad where id="+id);
    }
    /*
     * 广告分页调用
     * @param currentpage 当前页数
     * @param pagesize   每页记录数
    */
    public Collection getAdList_Limit(int currentpage,int pagesize){
        if(DBUtils.getDatabaseType() == DBUtils.DATABASE_MYSQL){
            StringBuffer sql=new StringBuffer(512);
            sql.append("select id,Title,ModiTime from t_ad");
            return getDataList_mysqlLimit(sql.toString(),"id,Title,ModiTime",pagesize,(currentpage-1)*pagesize);
        } else if (DBUtils.getDatabaseType() == DBUtils.DATABASE_SQLSERVER) {
            StringBuffer sql=new StringBuffer(512);
            sql.append("SELECT TOP ");
            sql.append(pagesize);
            sql.append(" id,Title,ModiTime FROM t_ad WHERE (id <=(SELECT MIN(id) FROM (SELECT TOP ");
            sql.append((currentpage-1)*pagesize+1);
            sql.append(" id  FROM t_ad");
            sql.append(" ORDER BY id DESC) AS t))");
            sql.append(" ORDER BY id DESC");
            return getData(sql.toString(),"id,Title,ModiTime");
        } else{
            StringBuffer sql=new StringBuffer(512);
            sql.append("select id,Title,ModiTime from t_ad");
            return getDataList_Limit_Normal(sql.toString(),"id,Title,ModiTime",pagesize,(currentpage-1)*pagesize);
        }
    }
    /** 获取某一条广告记录 ,并以DataField类结果存放,读取时采用DataField.getFieldValue("字段名称")方法*/
    public DataField getGuestBook(int id){
        return getFirstData("select id,Title,ModiTime from t_ad where id="+id,"id,Title,ModiTime");
    }
    /*记录个数*/
    public int getTotalCount(){
        StringBuffer sql=new StringBuffer(512);
        sql.append("select count(*) from t_ad");
        return(this.getDataCount(sql.toString()));
    }
}

常见的前台分页调用部分代码:
开始要import系统常用的包
<%@ page import="tot.exception.*"%>
<%@ page import="tot.util.*" %>
<%@ page import="tot.bean.*" %>
<%@ page import="tot.dao.DaoFactory" %>
..............

<%
  int CurrentPage=RequestUtil.getInt(request,"page");//当前页数
  int PageSize=20;//每页显示个数
  TotalNum=DaoFactory.getAdDAO().getTotalCount(categoryid);//总记录个数
  PageNum=(TotalNum-1+PageSize)/PageSize;//计算总页数
  ArrayList list=(ArrayList)DaoFactory.getAdDAO().getAdList_Limit(CurrentPage,PageSize);//获取记录
  for (Iterator iter = list.iterator(); iter.hasNext(); ) {//遍历记录
   DataField df=(DataField)iter.next();//一行记录
 String id=df.getFieldValue("id");//读取字段id
 int AdType=Integer.parseInt(df.getFieldValue("AdType"));//读取字段AdType
  }
%>

最新评论
用 户:
内 容:
验证码: