当前位置:编程学习 > JAVA >>

自己动手写ORM框架(二):AdoHelper支持多数据库操作的封装(2)

“奋斗”前辈在这一章继续进行AdoHelper进行数据库操作的分析
在上一篇文章中已经分析了AdoHelper的部分代码,接下来将继续分析剩余的部分代码,这里分析ExecuteNonQuery方法的实现,代码块1-1:
 
// <summary>
//通过提供的参数,执行无结果集的数据库操作命令
// 并返回执行数据库操作所影响的行数。
// </summary>
// <param name="connectionString">数据库连接字符串</param>
// <param name="commandType">执行命令的类型(存储过程或T-SQL,等等)</param>
// <param name="commandText">存储过程名称或者T-SQL命令行<</param>
// <param name="commandParameters">执行命令所需的参数数组</param>
// <returns>返回通过执行命令所影响的行数</returns>
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
{
    IDbCommand cmd = DbFactory.CreateDbCommand();
 
    using (IDbConnection conn = DbFactory.CreateDbConnection(connectionString))
    {
        PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
        int val = cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
        return val;
    }
}
//=============================================================================================
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText)
{
    IDbCommand cmd = DbFactory.CreateDbCommand();
 
    using (IDbConnection conn = DbFactory.CreateDbConnection(connectionString))
    {
        PrepareCommand(cmd, conn, null, cmdType, cmdText, null);
        int val = cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
        return val;
    }
}
//=============================================================================================
public static int ExecuteNonQuery(IDbConnection connection, CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
{
    IDbCommand cmd = DbFactory.CreateDbCommand();
 
    PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
}
//=============================================================================================
public static int ExecuteNonQuery(IDbConnection connection, CommandType cmdType, string cmdText)
{
    IDbCommand cmd = DbFactory.CreateDbCommand();
 
    PrepareCommand(cmd, connection, null, cmdType, cmdText, null);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
}
//=============================================================================================
// <summary>
//通过提供的参数,执行无结果集返回的数据库操作命令
//并返回执行数据库操作所影响的行数。
// </summary>
// <remarks>
// e.g.:  
//  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
// </remarks>
// <param name="trans">sql事务对象</param>
// <param name="commandType">执行命令的类型(存储过程或T-SQL,等等)</param>
// <param name="commandText">存储过程名称或者T-SQL命令行<</param>
// <param name="commandParameters">执行命令所需的参数数组</param>
// <returns>返回通过执行命令所影响的行数</returns>
public static int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
{
    IDbConnection conn = null;
    if (trans == null)
    {
        conn = DbFactory.CreateDbConnection(ConnectionString);
    }
    else 
    {
        conn = trans.Connection;
    }
 
    IDbCommand cmd = DbFactory.CreateDbCommand();
    PrepareCommand(cmd, conn, trans, cmdType, cmdText, commandParameters);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
}
//=============================================================================================
public static int ExecuteNonQuery(IDbTransaction trans, CommandType cmdType, string cmdText)
{
    IDbCommand cmd = DbFactory.CreateDbCommand();
    PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, null);
    int val = cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    return val;
}
//=============================================================================================
上面都是对ExecuteNonQuery方法的重载,仅仅是参数有所变化,下面将第一个方法进行逐行的分析。
 
line 1:public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
 
参数1: string connectionString =>  数据库连接所需连接字符串
 
参数2: CommandType cmdType=> 执行命令的类型(存储过程或T-SQL,等等)
 
参数3: string cmdText=> 存储过程名称或者T-SQL命令行
 
参数4: params IDbDataParameter[] commandParameters=>执行命令所需的参数数组
 
 
 
line 2:IDbCommand cmd = DbFactory.CreateDbCommand();
 
    这里通过DbFactory类创建IDbCommand接口的实现类对象,这里为什么使用IDbCommand接口呢,如果我们项目中使用的SqlServer数据库的时候,我们习惯这样创建:
 
SqlCommand cmd = new SqlCommand();
 
    但是如果这个项目上线了一阵,客户突然说要换成Oracle数据库,那么所有写成SqlCommand的地方都要改成OracleCommand,但要改的并不仅仅这些,计划所有ADO.NET与数据库相关的,比如SqlConnection、SqlDataAdapter、SqlParameter、SqlTransaction等等全部都要改,这工作量是很大的,还不说改动这么多会出现什么问题,所以我们可以通过工厂模式,采用面向接口编程来解决这个问题!
 
    下面我们看看DbFactory是如何工作的,代码块1-2:
 
// <summary>
// 根据配置文件中所配置的数据库类型
// 来创建相应数据库命令对象
// </summary>
// <returns></returns>
public static IDbCommand CreateDbCommand()
{
    IDbCommand cmd = null;
    switch (AdoHelper.DbType)
    {
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,