关于网友提出的“JDBC访问数据库 一个轻量级的通用数据库访问层接口设计,请大家赐教。”问题疑问,本网通过在网上对“JDBC访问数据库 一个轻量级的通用数据库访问层接口设计,请大家赐教。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:JDBC访问数据库 一个轻量级的通用数据库访问层接口设计,请大家赐教。
描述: 目标:1适用小型项目,比如业务逻辑很简单的企业网站,什么新闻发布啦,产片展示啦。2通用的,不针对某一项目。

带箭头的虚线表示依赖关系,业务逻辑层只依赖数据访问层接口和实体,通用类。
主要接口代码:
public interface IDALContext : IDisposable
{
//该方法可返回IDALDase,IDALTUser,IDALTRole,可利用反射实现返回不同类型实例
TDAL GetDAL() where TDAL : class;
}
public interface IDALBase
{
DataTable GetDataTable(String commandText);
DataTable GetDataTable(String commandText, CommandType type);
DataTable GetDataTable(String commandText, params TParameter[] parameters)
where TParameter : DbParameter;
DataTable GetDataTable(String commandText, CommandType type, params TParameter[] parameters)
where TParameter : DbParameter;
int ExecuteNonQuery(String commandText);
int ExecuteNonQuery(String commandText, CommandType type);
int ExecuteNonQuery(String commandText, params TParameter[] parameters)
where TParameter : DbParameter;
int ExecuteNonQuery(String commandText, CommandType type, params TParameter[] parameters)
where TParameter : DbParameter;
TCommand GetCommand()
where TCommand : DbCommand;
}
public interface IDALTUser
{
TUser SelectFirst(params ConditionPairs[] conditionPairs);
TUser SelectFirst(int index, params ConditionPairs[] conditionPairs);
TUser SelectFirst(OrderPair orderPair, params ConditionPairs[] conditionPairs);
TUser SelectFirst(OrderPair orderPair, int index, params ConditionPairs[] conditionPairs);
TUser SelectFirst(OrderPair[] orderPairs, params ConditionPairs[] conditionPairs);
TUser SelectFirst(OrderPair[] orderPairs, int index, params ConditionPairs[] conditionPairs);
List Select(params ConditionPairs[] conditionPairs);
List Select(int count, params ConditionPairs[] conditionPairs);
List Select(int index, bool all, params ConditionPairs[] conditionPairs);
List Select(int index, int count, params ConditionPairs[] conditionPairs);
List Select(OrderPair orderPair, params ConditionPairs[] conditionPairs);
List Select(OrderPair orderPair, int count, params ConditionPairs[] conditionPairs);
List Select(OrderPair orderPair, int index, bool all, params ConditionPairs[] conditionPairs);
List Select(OrderPair orderPair, int index, int count, params ConditionPairs[] conditionPairs);
List Select(OrderPair[] orderPairs, params ConditionPairs[] conditionPairs);
List Select(OrderPair[] orderPairs, int count, params ConditionPairs[] conditionPairs);
List Select(OrderPair[] orderPairs, int index, bool all, params ConditionPairs[] conditionPairs);
List Select(OrderPair[] orderPairs, int index, int count, params ConditionPairs[] conditionPairs);
int Delete(params ConditionPairs[] conditionPairs);
int Insert(TUser user);
int Update(SetPair setPair, params ConditionPairs[] conditionPairs);
int Update(SetPair[] setPairs, params ConditionPairs[] conditionPairs);
int GetCount(params ConditionPairs[] conditionPairs);
TUser GetModel(String commandText);
TUser GetModel(String commandText, CommandType type);
TUser GetModel(String commandText, params TParameter[] parameters)
where TParameter : DbParameter;
TUser GetModel(String commandText,CommandType type, params TParameter[] parameters)
where TParameter : DbParameter;
List GetModels(String commandText);
List GetModels(String commandText, CommandType type);
List GetModels(String commandText, params TParameter[] parameters)
where TParameter : DbParameter;
List GetModels(String commandText,CommandType type, params TParameter[] parameters)
where TParameter : DbParameter;
}
IDALTRole和IDALTUser是类似的。
公共类说明:
///
/// 判断的操作符
///
public enum ConditionOperation
{
Equal = 1,
GreaterThan,
GreaterOrEqual,
LessThan,
LessOrEqual,
NotEqual
}
public enum LogicalOperation
{
And=1,
Or
}
ConditionPair,该类的每个实例表示一个条件,如login_name='king'这个条件可用该实例new ConditionPair("login_name","king",ConditionOperation.Equal )表示.
ConditionPairs表示多个条件放在一起,如login_name='king' and password='123'可用实例new ConditionPairs(LogicalOperation.And,new ConditionPairs("login_name","king"),new ConditionPair("password","123"))表示
SetPair表示一个排序规则,如order by login_name desc可用实例new SetPair("login_name",true)表示
调用举例:
String c />
using (IDALContext dalContext = new DALContext(connStr))
{
IDALTUser dalUser=dalContext.GetDAL();
gv1.DataSource = dalUser.Select();
gv1.DataBind();
gv2.DataSource = dalUser.Select(2, 5);
gv2.DataBind();
gv3.DataSource = dalUser.Select(new OrderPair("create_datetime",true));
gv3.DataBind();
gv4.DataSource = dalUser.Select(new ConditionPairs(new ConditionPair[]{new ConditionPair("id",11,ConditionOperation.GreaterThan),
new ConditionPair("id",15,ConditionOperation.LessThan)}));
gv4.DataBind();
gv5.DataSource=dalUser.Select(new ConditionPairs(new ConditionPair[]{
new ConditionPair("id",11,ConditionOperation.GreaterOrEqual),
new ConditionPair("id",15,ConditionOperation.LessOrEqual)}),
new ConditionPairs(LogicalOperation.Or,new ConditionPair[]{
new ConditionPair("login_name","king")}),
new ConditionPairs(LogicalOperation.Or,new ConditionPair[]{
new ConditionPair("login_name","magic")}));
gv5.DataBind();
gv6.DataSource=dalUser.Select(new ConditionPairs(new ConditionPair[]{
new ConditionPair("id",15,ConditionOperation.GreaterThan,LogicalOperation.Or),
new ConditionPair("id",3,ConditionOperation.LessThan,LogicalOperation.Or)}),
new ConditionPairs(LogicalOperation.And,new ConditionPair[]{
new ConditionPair("create_datetime",new DateTime(2011,7,25,11,19,10),ConditionOperation.GreaterThan)}
));
gv6.DataBind();
gv7.DataSource = dalUser.Select(new OrderPair[] { new OrderPair("id"), new OrderPair("bh", true) }, 2, 3,
new ConditionPairs(new ConditionPair[]{new ConditionPair("id",17,ConditionOperation.GreaterOrEqual),
new ConditionPair("id",20,ConditionOperation.LessOrEqual)}),
new ConditionPairs(LogicalOperation.Or, new ConditionPair("login_name", "king")),
new ConditionPairs(LogicalOperation.Or, new ConditionPair("login_name", "magic")));
gv7.DataBind();
gv8.DataSource =new List(){ dalUser.SelectFirst(new ConditionPairs(new ConditionPair[]{
new ConditionPair("login_name","king")}))};
gv8.DataBind();
IDALBase dalBase = dalContext.GetDAL();
gv9.DataSource = dalBase.GetDataTable("select * from t_user");
gv9.DataBind();
}
还不能实现的功能:不支持表间连接查询,不支持事务,执行具体的sql语句时传递数据库参数时不能和具体的数据库参数类型解耦。请大家赐教参数解耦的问题,接口设计的可行性,合理性,如果成熟了计划写一个生成该设计中实体类和具体数据库实现的代码生成器
解决方案1: 贴一段代码:
protected DataTable GetData_MaterialSearch() {
//调用视图驱动器更新Model
ViewDrv.MethodViewDrv.UpdateParams(this, this.Model.MethodMaterialSearch);
//调用DAL获取数据,当然你可以使用JsonTable做为数据传送载体
DataTable _DT = DAHelper.ExecuteMethod(this.Model.MethodMaterialSearch);
if(_DT == null) throw new MyException("操作失败,请稍后重试");
return _DT;
}//end GetData_MaterialSearch
解决方案2: 楼主,你的DAL包含太多BLL的东西了
要自己写DAL的话,仿照ADO写个先
解决方案3: 数据访问层建议用NHiberate配置数据库访问配置文件,以达到数据访问层的通用,从而与底层的数据库系统无关。
解决方案4:
解决方案5: 看起来一点也不轻量...甚至包含了很多业务逻辑的东西,想来通用性也不怎么样...
解决方案6: mysqlHelper.
解决方案7: 太长,帮顶
解决方案8: 可是一到实践,就又回到原始社会了。
只是只要看你如何抽象化查询功能,就明白了。
解决方案9: 好像是一个SQLHelper。这有很多了
理论上还不错。可是一到事件,就又回到原始社会了。
解决方案10: 看了下结构,如果lz要支持切换数据库的话在加个工厂类,依赖配置文件进行实例化dal
这样当要切换数据库时不用去改动bll
以上介绍了“JDBC访问数据库 一个轻量级的通用数据库访问层接口设计,请大家赐教。”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2183006.html