• ASP.Net MVC+Ibaties架构


    1.配置Ibaties首先在DLL引用中添加Ibaties相关引用:IBatisNet.Common.dll;IBatisNet.Common.Logging.Log4Net.dll;IBatisNet.DataMapper.dll

    2.添加providers.config、sqlmap.config配置文件

    providers.config主要为数据库驱动

    sqlmap.config主要为数据库配置和路由映射,配置信息如下

    <?xml version="1.0" encoding="utf-8"?>
    <sqlMapConfig
      xmlns="http://ibatis.apache.org/dataMapper"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    
      <settings>
        <!--Mapping是否启用namespace-->
        <setting useStatementNamespaces="true"/>
        <!--Mapping是否缓存-->
        <setting cacheModelsEnabled="false"/>
      </settings>
    
      <providers resource="providers.config"/>
    
      <!-- Database connection information -->
      <database>
        <provider name="sqlServer2005"/>
        <dataSource name="iBatisNet" connectionString="Max Pool Size = 512;Data Source=.;
                    Initial Catalog=test;
                    User ID=sa;password=!test;Max Pool Size = 512;connect timeout = 20; "/>
      </database>
    
      <sqlMaps>
        <sqlMap resource="Mappings/LocalDB/TestMapping.xml"></sqlMap>
      </sqlMaps>
    
    </sqlMapConfig>

    3.在Mappings/LocalDB文件夹下建立映射XML文件TestMapping.xml,相关信息如下:

    <sqlMap namespace="TestMapping" xmlns="http://ibatis.apache.org/mapping"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
      <statements>
        <select id="GetByid"  resultClass="System.Data.DataSet">
          select * from test where id=#value#
        </select>
    
        <update id="UpdateNum" parameterClass="Hashtable">
          update test
          set num = #num#,
          where id = #id#
        </update>
    
        <insert id="CreatePurchaseOrder"  parameterClass="Hashtable" >
          INSERT INTO test
          (
          Num
          )
          VALUES
          (
          #Num#
          )
          <selectKey resultClass="int" type="post" property="id" >
            select @@IDENTITY as value
          </selectKey>
        </insert>
    
      </statements>
    
    </sqlMap>

    4.实例化SqlMap,对数据库进行操作

    IBaseDAL:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Collections;
    
    
    public interface IBaseDAL
    {
        /// <summary>
        /// 插入
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="statementName"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        int Insert<T>(string statementName, T t);
    
        int Update<T>(string statementName, T t);
    
        int Delete(string statementName, int primaryKeyId);
        int Delete(string statementName, string primaryKeyId);
        int Delete(string statementName, object parameterObject);
    
        T Get<T>(string statementName, int primaryKeyId) where T : class;
    
        T Get<T>(string statementName, string primaryKeyId) where T : class;
    
        T Get<T>(string statementName, object parameterObject) where T : class;
    
        object Get(string statementName, object parameterObject);
    
        IList<T> QueryForList<T>(string statementName, object parameterObject = null);
    
        int Add<T>(string statementName, T t);
    
        /// <summary>
        /// 获取DataTable主要针对存储过程
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="paramObject"></param>
        /// <param name="dictParam"></param>
        /// <param name="dictParamDirection"></param>
        /// <param name="htOutPutParameter"></param>
        /// <returns></returns>
        DataTable QueryForDataTable(string statementName, object paramObject, IDictionary dictParam, IDictionary<string, ParameterDirection> dictParamDirection, out Hashtable htOutPutParameter);
    
        /// <summary>
        /// 获取DataTable
        /// </summary>
        /// <param name="statementName"></param>
        /// <param name="paramObject"></param>
        /// <returns></returns>
        DataTable QueryForDataTable(string statementName, object paramObject);
    
    }
    View Code

    BaseDAL:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using IBatisNet.DataMapper;
    using System.Data;
    using IBatisNet.Common;
    using IBatisNet.DataMapper.Configuration.Statements;
    using IBatisNet.DataMapper.MappedStatements;
    using IBatisNet.DataMapper.Scope;
    using System.Collections;
    
    
    public class BaseDAL : IBaseDAL
    {
        ISqlMapper sqlMapper;
    
        public BaseDAL()
        {
    
            sqlMapper = Mapper.Instance();
        }
    
        public BaseDAL(ISqlMapper map)
        {
            sqlMapper = map;
        }
    
        public int Insert<T>(string statementName, T t)
        {
            if (sqlMapper != null)
            {
               IDbCommand cmd = GetDbCommand(statementName, t);//SQL text command
                object obj = sqlMapper.Insert(statementName, t);
                if (obj != null)
                {
                    return (int)obj;
                }
                else
                    return 0;
            }
            return 0;
        }
    
        public int Add<T>(string statementName, T t)
        {
            if (sqlMapper != null)
            {
                return sqlMapper.Update(statementName, t);
            }
            return 0;
        }
    
        public int Update<T>(string statementName, T t)
        {
            if (sqlMapper != null)
            {
              IDbCommand cmd = GetDbCommand(statementName, t);//SQL text command
                return sqlMapper.Update(statementName, t);
            }
            return 0;
        }
    
        public int Delete(string statementName, int primaryKeyId)
        {
            if (sqlMapper != null)
            {
                return sqlMapper.Delete(statementName, primaryKeyId);
            }
            return 0;
        }
    
        public int Delete(string statementName, string primaryKeyId)
        {
            if (sqlMapper != null)
            {
                return sqlMapper.Delete(statementName, primaryKeyId);
            }
            return 0;
        }
    
        public int Delete(string statementName, object parameterObject)
        {
            if (sqlMapper != null)
            {
                
                return sqlMapper.Delete(statementName, parameterObject);
            }
            return 0;
        }
    
        public T Get<T>(string statementName, int primaryKeyId) where T : class
        {
            if (sqlMapper != null)
            {
                return sqlMapper.QueryForObject<T>(statementName, primaryKeyId);
            }
            return null;
        }
    
        public T Get<T>(string statementName, string primaryKeyId) where T : class
        {
            if (sqlMapper != null)
            {
                return sqlMapper.QueryForObject<T>(statementName, primaryKeyId);
            }
            return null;
        }
    
        public T Get<T>(string statementName, object parameterObject) where T : class
        {
            if (sqlMapper != null)
            {
                IDbCommand cmd = GetDbCommand(statementName, parameterObject);//SQL text command
                return sqlMapper.QueryForObject<T>(statementName, parameterObject);
            }
            return null;
        }
    
        public object Get(string statementName, object parameterObject)
        {
            if (sqlMapper != null)
            {
                IDbCommand cmd = GetDbCommand(statementName, parameterObject);//SQL text command
                return sqlMapper.QueryForObject(statementName, parameterObject);
            }
            return null;
        }
    
        public IList<T> QueryForList<T>(string statementName, object parameterObject = null)
        {
            if (sqlMapper != null)
            {
                      IDbCommand cmd = GetDbCommand(statementName, parameterObject);//SQL text command
                return sqlMapper.QueryForList<T>(statementName, parameterObject);
            }
            return null;
        }
    
        /// <summary>
        /// 通用的以DataTable的方式得到Select的结果(xml文件中参数要使用$标记的占位参数)
        /// </summary>
        /// <param name="statementName">语句ID</param>
        /// <param name="paramObject">语句所需要的参数</param>
        /// <returns>得到的DataTable</returns>
        public DataTable QueryForDataTable(string statementName, object paramObject)
        {
            DataSet ds = new DataSet();
            bool isSessionLocal = false;
    
            IDalSession session = sqlMapper.LocalSession;
            if (session == null)
            {
                session = new IBatisNet.DataMapper.SqlMapSession(sqlMapper);
                session.OpenConnection();
                isSessionLocal = true;
            }
    
            IDbCommand cmd = GetDbCommand(statementName, paramObject);//SQL text command
    
            try
            {
                cmd.Connection = session.Connection;
                IDbDataAdapter adapter = session.CreateDataAdapter(cmd);
                adapter.Fill(ds);
            }
            finally
            {
                if (isSessionLocal)
                {
                    session.CloseConnection();
                }
            }
    
            return ds.Tables[0];
    
        }
    
        private IDbCommand GetDbCommand(string statementName, object paramObject)
        {
            IStatement statement = sqlMapper.GetMappedStatement(statementName).Statement;
    
            IMappedStatement mapStatement = sqlMapper.GetMappedStatement(statementName);
    
            ISqlMapSession session = new SqlMapSession(sqlMapper);
            if (sqlMapper.LocalSession != null)
            {
                session = sqlMapper.LocalSession;
            }
            else
            {
                session = sqlMapper.OpenConnection();
            }
    
            RequestScope request = statement.Sql.GetRequestScope(mapStatement, paramObject, session);
    
            mapStatement.PreparedCommand.Create(request, session as ISqlMapSession, statement, paramObject);
            IDbCommand cmd = session.CreateCommand(CommandType.Text);
            cmd.CommandText = request.IDbCommand.CommandText;
            return cmd;
    
        }
    
    
        /// <summary>
        /// 获取DbCommand,主要是针对存储过程
        /// </summary>
        /// <param name="sqlMapper"></param>
        /// <param name="statementName"></param>
        /// <param name="paramObject">参数</param>
        /// <param name="dictParam">参数字段</param>
        /// <param name="dictParmDirection">ParameterDirection字典</param>
        /// <param name="cmdType"></param>
        /// <returns></returns>
        protected virtual IDbCommand GetDbCommand(string statementName, object paramObject, IDictionary dictParam, IDictionary<string, ParameterDirection> dictParmDirection, CommandType cmdType)
        {
            if (cmdType == CommandType.Text)
            {
                return GetDbCommand(statementName, paramObject);
            }
    
            IStatement statement = sqlMapper.GetMappedStatement(statementName).Statement;
            IMappedStatement mapStatement = sqlMapper.GetMappedStatement(statementName);
            ISqlMapSession session = new SqlMapSession(sqlMapper);
    
            if (sqlMapper.LocalSession != null)
            {
                session = sqlMapper.LocalSession;
            }
            else
            {
                session = sqlMapper.OpenConnection();
            }
    
            RequestScope request = statement.Sql.GetRequestScope(mapStatement, paramObject, session);
            mapStatement.PreparedCommand.Create(request, session as ISqlMapSession, statement, paramObject);
            IDbCommand cmd = session.CreateCommand(cmdType);
            cmd.CommandText = request.IDbCommand.CommandText;
            if (cmdType != CommandType.StoredProcedure || dictParam == null)
            {
                return cmd;
            }
            foreach (DictionaryEntry de in dictParam) //存储过程 
            {
                string key = de.Key.ToString();
                IDbDataParameter dbParam = cmd.CreateParameter();
                dbParam.ParameterName = key;
                dbParam.Value = de.Value;
    
                if (dictParmDirection != null && dictParmDirection.ContainsKey(key))
                {
                    dbParam.Direction = dictParmDirection[key]; //ParameterDirection
                }
                cmd.Parameters.Add(dbParam);
            }
            return cmd;
        }
    
        /// <summary>
        /// 查询返回DataTable,对于包括OUTPUT参数的存储过程同样适用
        /// </summary>
        /// <param name="sqlMapper"></param>
        /// <param name="statementName"></param>
        /// <param name="paramObject">参数</param>
        /// <param name="dictParam">参数字典</param>
        /// <param name="dictParamDirection">ParameterDirection字典</param>
        /// <param name="htOutPutParameter">返回的Output参数值哈希表</param>
        /// <returns></returns>
        public DataTable QueryForDataTable(string statementName, object paramObject, IDictionary dictParam, IDictionary<string, ParameterDirection> dictParamDirection, out Hashtable htOutPutParameter)
        {
    
            DataSet ds = new DataSet();
            bool isSessionLocal = false;
            ISqlMapSession session = sqlMapper.LocalSession;
            if (session == null)
            {
                session = new SqlMapSession(sqlMapper);
                session.OpenConnection();
                isSessionLocal = true;
            }
    
            IDbCommand cmd = GetDbCommand(statementName, paramObject, dictParam, dictParamDirection, CommandType.StoredProcedure); //存储过程
    
            try
            {
                cmd.Connection = session.Connection;
                IDbDataAdapter adapter = session.CreateDataAdapter(cmd);
                adapter.Fill(ds);
            }
            finally
            {
                if (isSessionLocal)
                {
                    session.CloseConnection();
                }
            }
            htOutPutParameter = new Hashtable();
            foreach (IDataParameter parameter in cmd.Parameters)
            {
                if (parameter.Direction == ParameterDirection.Output)
                {
                    htOutPutParameter[parameter.ParameterName] = parameter.Value;
                }
            }
            return ds.Tables[0];
        }
    
    
    
    
    }
    View Code

    BLL调用:

    public DataTable GetTest(Hashtable hs)
            {
                DataTable dt = new DataTable();
                IBaseDAL dal = new BaseDAL();
                dt = dal.QueryForDataTable("TestMapping.GetByid", hs); return dt; 
         }

    至此,整个流程结束。

  • 相关阅读:
    JAVA多线程知识点
    RabbitMQ和Springboot集成RabbitMQ知识点
    JAVA动态代理cglib或jdk
    [转]解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题的一个方向
    [转]C#判断文档编码格式,并读取文档数据(防止出现乱码)
    create_linux命令写入到sh脚本并删除
    cmd cd切换到d盘
    sql 优化前后
    LISTAGG()WITHIN GROUP()
    使用shell递归遍历文件并打印所有文件名的绝对路径
  • 原文地址:https://www.cnblogs.com/byfcumt/p/6796890.html
Copyright © 2020-2023  润新知