基于C#的.Net下整合IBatis

Posted DotNet开发跳槽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C#的.Net下整合IBatis相关的知识,希望对你有一定的参考价值。

. 准备工作

  1. 点击此下载支持.Net4.0iBatis.Net,工程中引用release文件夹下的dll

最新版(目前已不再更新),有稍作修改使其支持.NET4.0  https://pan.baidu.com/s/1sna8zKT#list/path=%2F

  2. 点击此可查看 iBatis.Net 的帮助文档 http://ibatis.apache.org/docs/dotnet/dataaccess/

  3. 点击此下载 iBatis in Action 的中文版电子书,作为参考https://pan.baidu.com/s/1eSRlkXk

  4. 点击此可查看适用于.NET,基于 iBatis in Action 的中文翻译,作为参考https://www.cnblogs.com/anderslly/archive/2007/09/07/ibatisinactionpreface.html

 

. 相关代码文件介绍

  1. dao.configdao支持配置

<?xml version="1.0" encoding="utf-8"?><daoConfig  xmlns="http://ibatis.apache.org/dataAccess" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<providers resource="./config/ibatisNet/providers.config" />

<context id="SqlMapDao">

  <properties embedded="psi.properties.config, psi"/>

    

  <database>

    <provider name="mysql"/>

    <dataSource name="psi" connectionString="${connectionString}" />

  </database>

 

  <daoSessionHandler id="SqlMap">

    <property name="resource" value="./config/ibatisNet/SqlMap.config"/>

  </daoSessionHandler>

 

  <daoFactory>

    <dao interface="psi.Persistence.MapperDao.Interfaces.IUserDao, psi"

         implementation="psi.Persistence.MapperDao.Implementations.UserDao, psi"/>

  </daoFactory></context>

</daoConfig>     

 2. providers.config  配置数据库驱动

<?xml version="1.0" encoding="utf-8"?><providers

  xmlns="http://ibatis.apache.org/providers" 

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<clear/><provider

    name="MySql" 

    description="MySQL, MySQL provider 6.7.9.0" 

    enabled="true" 

    assemblyName="MySql.Data, Version=6.7.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection" 

    commandClass="MySql.Data.MySqlClient.MySqlCommand" 

    parameterClass="MySql.Data.MySqlClient.MySqlParameter" 

    parameterDbTypeClass="MySql.Data.MySqlClient.MySqlDbType" 

    parameterDbTypeProperty="MySqlDbType" 

    dataAdapterClass="MySql.Data.MySqlClient.MySqlDataAdapter" 

    commandBuilderClass="MySql.Data.MySqlClient.MySqlCommandBuilder" 

    usePositionalParameters="false" 

    useParameterPrefixInSql="true" 

    useParameterPrefixInParameter="true" 

    parameterPrefix="?"

    allowMARS="false"    

  />

</providers>


  3. 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>

    <setting useStatementNamespaces="true"/>

    <setting cacheModelsEnabled="true"/>

    <setting validateSqlMap="false"/>

  </settings>

 

  <sqlMaps>

    <sqlMap embedded="psi.Persistence.Maps.User.xml, psi"/>    

  </sqlMaps> </sqlMapConfig>


4. properties.config  数据库连接等对安全性有要求的配置



<?xml version="1.0" encoding="utf-8" ?><settings>

  <!--   User application and configured property settings go here.-->

  <!--   Example: <add key="settingName" value="settingValue"/> -->

  <add

        key="connectionString"

        value="Host=localhost;UserName=root;Password=123456;Database=psi;Port=3306;" /></settings>

 5. DaoConfigManager.cs  程序启动时调用 DaoConfigManager.Instance(); 进行初始化

using IBatisNet.DataAccess;using IBatisNet.DataAccess.Configuration;using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace psi.Persistence

{

    public class DaoConfigManager

    {

        private static IDaoManager daoManager = null;

 

        public static IDaoManager GetSqlMapDao()

        {

            return Instance();

        }

 

        public static IDaoManager Instance()

        {

            if (daoManager == null)

            {

                lock (typeof(DaoManager))

                {

                    if (daoManager == null) // double-check                    {

                        InitDao();

                    }

                }

            }

            return daoManager;

        }

 

        protected static void InitDao()

        {

            DomDaoManagerBuilder builder = new DomDaoManagerBuilder();

            builder.Configure(".//config//ibatisNet//dao.config");

            daoManager = DaoManager.GetInstance("SqlMapDao");

        }

    }

}

 6. BaseSqlMapDao.cs  对SqlMapDao操作进行的封装

using IBatisNet.Common.Pagination;using IBatisNet.DataAccess;using IBatisNet.DataAccess.DaoSessionHandlers;using IBatisNet.DataAccess.Exceptions;using IBatisNet.DataAccess.Interfaces;using IBatisNet.DataMapper;using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;

namespace psi.Persistence.MapperDao

{

    /// <summary>

    /// Summary description for BaseSqlMapDao.

    /// </summary>

    public class BaseSqlMapDao : IDao

    {

        protected const int PAGE_SIZE = 4;

        protected SqlMapper sqlMapper = null;

 

        /// <summary>

        /// Looks up the parent DaoManager, gets the local transaction

        /// (which should be a SqlMapDaoTransaction) and returns the

        /// SqlMap associated with this DAO.

        /// </summary>

        /// <returns>The SqlMap instance for this DAO.</returns>

        protected SqlMapper GetLocalSqlMap()

        {

            if (sqlMapper == null)

            {

                DaoManager daoManager = (DaoManager)DaoManager.GetInstance(this);

                SqlMapDaoSession sqlMapDaoSession = (SqlMapDaoSession)daoManager.LocalDaoSession;

                sqlMapper = (SqlMapper)sqlMapDaoSession.SqlMap;

            }

            return sqlMapper;

        }

 

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <returns></returns>

        protected IList<T> ExecuteQueryForList<T>(string statementName, object parameterObject)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

            try

            {

                return sqlMap.QueryForList<T>(statementName, parameterObject);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for list.  Cause: " + e.Message, e);

            }

        }

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <param name="skipResults"></param>

        /// <param name="maxResults"></param>

        /// <returns></returns>

        protected IList ExecuteQueryForList(string statementName, object parameterObject, int skipResults, int maxResults)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

            try

            {

                return sqlMap.QueryForList(statementName, parameterObject, skipResults, maxResults);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for list.  Cause: " + e.Message, e);

            }

        }

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <param name="pageSize"></param>

        /// <returns></returns>

        protected IPaginatedList ExecuteQueryForPaginatedList(string statementName, object parameterObject, int pageSize)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

            try

            {

                return sqlMap.QueryForPaginatedList(statementName, parameterObject, pageSize);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for paginated list.  Cause: " + e.Message, e);

            }

        }

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <returns></returns>

        protected object ExecuteQueryForObject(string statementName, object parameterObject)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

 

            try

            {

                return sqlMap.QueryForObject(statementName, parameterObject);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for object.  Cause: " + e.Message, e);

            }

        }

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <returns></returns>

        protected int ExecuteUpdate(string statementName, object parameterObject)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

 

            try

            {

                return sqlMap.Update(statementName, parameterObject);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for update.  Cause: " + e.Message, e);

            }

        }

 

        protected int ExecuteDelete(string statementName, object parameterObject)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

 

            try

            {

                return sqlMap.Delete(statementName, parameterObject);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for delete.  Cause: " + e.Message, e);

            }

        }

 

        /// <summary>

        /// Simple convenience method to wrap the SqlMap method of the same name.

        /// Wraps the exception with a DataAccessException to isolate the SqlMap framework.

        /// </summary>

        /// <param name="statementName"></param>

        /// <param name="parameterObject"></param>

        /// <returns></returns>

        protected object ExecuteInsert(string statementName, object parameterObject)

        {

            SqlMapper sqlMap = GetLocalSqlMap();

 

            try

            {

                return sqlMap.Insert(statementName, parameterObject);

            }

            catch (Exception e)

            {

                throw new DataAccessException("Error executing query '" + statementName + "' for insert.  Cause: " + e.Message, e);

            }

        }

    }

}



  7. User.xmlSql语句存放位置



<?xml version="1.0" encoding="UTF-8" ?>

<sqlMap namespace="User"

xmlns="http://ibatis.apache.org/mapping"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

 

  <resultMaps>

    <resultMap id="user" class="psi.Domain.User">

        <result property="guid" column="guid"/>

        <result property="userCode" column="userCode"/>

        <result property="userName" column="userName"/>

        <result property="password" column="password"/>

        <result property="isLocked" column="isLocked"/>

        <result property="flagOnline" column="flagOnline"/>

        <result property="lastLoginTime" column="lastLoginTime"/>

        <result property="loginCounter" column="loginCounter"/>

        <result property="createDate" column="createDate"/>

        <result property="createBy" column="createBy"/>

        <result property="updateDate" column="updateDate"/>

        <result property="updateBy" column="updateBy"/>

    </resultMap>

  

  </resultMaps>

  

  <statements>

    <select id = "getForLogin" parameterClass = "psi.Domain.User" resultMap="user">

        select * from tb_user WHERE userCode=#userCode# AND password=#password#

    </select>

 

    <update id="updateForLogin" parameterClass = "psi.Domain.User">

        update tb_user SET flagOnline='Y',lastLoginTime=NOW(),loginCounter=IFNULL(loginCounter,0)+1  

            WHERE userCode=#userCode# AND password=#password#

    </update>

  </statements>

 

</sqlMap>


8. UserDao  数据访问接口


using IBatisNet.DataMapper;using psi.Common;using psi.Domain;using psi.Persistence.MapperDao.Interfaces;using System;using System.Collections;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;

namespace psi.Persistence.MapperDao.Implementations

{

    public class UserDao : BaseSqlMapDao, IUserDao

    {

        public void Login(User user)

        {

            if (string.IsNullOrWhiteSpace(user.userCode))

            {

                throw new Exception("帐户不能为空!");

            }

 

            IList<User> list = ExecuteQueryForList<User>("User.getForLogin", user);

            if (list == null || list.Count == 0)

            {

                throw new Exception("用户名或密码错误!");

            }

            user = list[0];

            if (user.isLocked == 1)

            {

                throw new Exception("用户已经锁定,禁止该用户登录!");

            }

            ExecuteUpdate("User.updateForLogin", user);

            LoginLog log = new LoginLog();

            log.userCode = user.userCode;

            log.loginType = 'I';

            ExecuteInsert("LoginLog.insertLog", log);

 

        }

    }

}

. 测试

  1. 前端控制器代码

User user = new User();

user.userCode = userCode;

user.password = password;try

{

    _bllUser.BeginTransaction();

    _bllUser.Login(user);

    _bllUser.CommitTransaction();

}catch

{

    _bllUser.RollBackTransaction();

    throw new Exception();

}

2. bllBase  业务逻辑处理基类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using psi.Common;using IBatisNet.DataAccess;using psi.Persistence;

/*************************************************************************

 * 程序说明: 业务逻辑层基类

 **************************************************************************/namespace psi.Business

{

    /// <summary>

    /// 业务逻辑层基类

    /// </summary>

    public abstract class bllBase

    {

        private IDaoManager daoManager;

        protected IDaoManager DaoManager { get { return this.daoManager; } }

 

        public bllBase(){

            daoManager = DaoConfigManager.GetSqlMapDao();

        }

 

        public void BeginTransaction()

        {

            if (!daoManager.IsDaoSessionStarted())

                daoManager.BeginTransaction();

        }

 

        public void CommitTransaction()

        {

            daoManager.CommitTransaction();

        }

 

        public void RollBackTransaction()

        {

            daoManager.RollBackTransaction();

        }

    }

}

3. bllUser  业务逻辑处理代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using psi.Common;using System.Data;using psi.Persistence.MapperDao.Interfaces;using psi.Persistence;using IBatisNet.DataAccess;using psi.Persistence.MapperDao.Implementations;using psi.Domain;

/*************************************************************************

 * 程序说明: 用户管理的业务逻辑层

 **************************************************************************/namespace psi.Business

{

    /// <summary>

    /// 用户管理的业务逻辑层

    /// </summary>

    public class bllUser : bllBase

    {

        private IUserDao userDao;

 

        public bllUser()

            : base()

        {

            userDao = DaoManager[typeof(IUserDao)] as IUserDao;

        }

 

        public static void ValidateLogin(string userID, string password)

        {

            if (userID.Trim() == "")

                throw new Exception("用户编号不正确或不能为空!");

 

            if (password.Trim() == "")

                throw new Exception("密码不正确或不能为空!");

        }

 

        public void Login(User user)

        {           

            userDao.Login(user);                

            

            //用户实例,登录成功

            Loginer loginer = new Loginer();

            loginer.UserCode = user.userCode;

            loginer.UserName = user.userName;

            loginer.LoginTime = DateTime.Now;

 

            Loginer.CurrentUser = loginer;//保存当前用户            }

 

    }

}

 


以上是关于基于C#的.Net下整合IBatis的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET C# 如何合并DataTable中的重复数据(做数据整合)

C# 基于.NET6的CM+Fody+HC入门实战项目(经典)

C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”

C#调用短信接口(通过简单的工厂模式整合多个短信平台)

C# 人脸识别库

C#和Java交互相关研究