MyBatis For .NET学习笔记[2]:配置环境
2011-03-21 18:24
435 查看
最近这几天一直看MyBatis相关资料.配置一下开发环境,在上一篇MyBatis For .NET学习笔记:开篇大概介绍一下MyBatis框架开源项目版本以及起源. 其实MyBatis的前身是IBatis. 而对应的.NET版本也是从Java版本中移植过来.这点更是体现在官方把MyBatis移植到Google Code上之后体现出来文档之间差异: Java文档和编码实例完整而实用. 而对应MyBatis 的.NEt 版本你会发现除了两个提供的User Guid和iBATIS.NET SDK for .NET 2.0文档 整个My Batis for Google Code中很难再发现有点价值的资料.
另外一个就是MyBatis版本问题. 作为开源项目MyBatis[.NET]目前官方提供最新版本DataMapper 1.6.2./ DataAccess 1.9.2与以前版本类似DataMapper 1.6.1中部分隐射实体的配置文件的语法发生改变. 也就是高版本在语法上有些不想下兼容味道.这也就导致各个版本之间实例异常问题和相对应实例各不相同,版本间参考性具有差距. 这让人情何以堪啊. 这也是我最近看官方文档摸索时一个很头疼的问题. 当然到目前为止对MyBatis原理了解尚未深入.可能目前看法并不可取.只是最近摸索MyBatis出现众多问题而无法找到相关参考资料解决问题.
既然是一个成熟的ORM框架.可以先快速项目中使用.来从实际项目中从全局角度来大体预览一下MyBatis框架的特点.会更加速理解MyBatis. 可能这篇文章写得有点长[只是估计].这个过程也是初学者角度摸索MyBatis的整个过程.难免会有纰漏 还望指正.当然也遇到很多大大小小的问题.本篇将详细讲述如何配置MyBais并构建项目采用MyBatis实现数据的CRUD操作.更深层原理将在后面章节讲述.先让我们会如何使用MyBatis.
如果你对MyBatis了解还不够多.可以参考MyBatis For Wiki,另外当然就是官方.在开始使用MyBatis之前需要在My Batis for Google Code上下载四个文件:
其中DataMapper和DataAccess是核心的引用文件.而另外两个分别对应说明官方提供UserGuid文档.其实可以从文件可以看出MyBaits框架有两个核心的组成部分,一个是SQL Maps,另一个是Data Access Objects也就是常说的[DAO].当然官方在USer Guid做了很经典解释[后篇会翻译出来].这里简述一下个人使用后理解.相对于ORM框架中Nhibernate中把实体EntityModel与数据库表Table通过XML文件建立映射关系.而MyBatis的不同是MyBatis用一个简单的XML文件来实现从实体到SQL statements[SQL]的映射.这就意味什么呢?
首先DataTable数据库表结构和实体彻底的失去关联.数据库表结构改动将不再直接体现在EntityModel. 实体Model把这种依赖关系转移到一个人为可控因素的SQL Statements[sql语句]上来.也就没有Nhibernate中存在的Scheme概念.这也说明另外一个问题.Myibatis 并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定Model.相对NHibernate等“一站式”ORM机制而言Myibatis 以SQL开发的工作量和数据库移植性上的灵活性,为系统设计提供了更大的自由空间. 这也是看了诸多ORM后选择MyBatis一个原因之一. 当然关于MyBatis与Nhibernate之间特点讨论会专门拿出一片文章来阐述.
很明显DataMapper是MyBatis框架的核心.DataAccess Objects[DAO]将动态的、可插入的 DAO 组件很容易地换入换出,可以使用 iBATIS Data Access Objects API 帮助隐藏持久性层实现的细节.创建简单的组件,提供对数据的访问,而无需将实现的详细说明展示给应用程序的其余部分.
解压文件发现6个可用DLL:
根据官方的文档说明如下:
IBatisNet.Common.DLL-[Assembly of classes shared by DataAccess and DataMapper]
IBatisNet.DataAccess.Dll-[核心的DataAccess组件DLL]
IBatisNet.DataMapper.DLL-[核心的数据隐射DataMap组件DLL]
Castyle.DynamicProxy.DLL-[实现为DataMapper动态生成代理]
Log4Net.Dll-[Log4日志组件.]
有了这些引用DLL组件如下来看MyBatis For .Net在项目中如何工作使用,.实现数据的对象的CRUD操作.
快速了解MyBatis构造和原理 来用一个实现项目来实现MyBatis框架数据基础CRUD操作.更加直观的体现MyBatis构建的原理.为了演示理解方便这里做了一个项目架构最简单纯净的三层. 项目结构如下:
简单介绍External-Bin中需要引用的DLL. 为了区别在命名详见下划线后缀不再赘述.EntityModel需要添加IBatisNet.Common.DLL引用.首先演示前需要一个独立数据库以及一个独立数据表Prodcut Tables 创建SQL 语句:
在EntityModel项目中构建实体Product操作对象.:
走到这往往让我们联想到NhiBernate中实现实体对象与数据库表之间映射关系的XML文件.但在MyBatis中则提出来出来对应操作的SQL语句之间映射.这时实现数据映射关系的核心部分.定义个在CustomerWeb_UI中定义对应ProductMap.XML:格式如下
有必要说说这个定义实体操作与对应操作的SQl Statement语句之间隐射文件的语法规则.首先<SQlMap>标签是用来表示映射关系. NameSpace最好指定对应实体命名空间.<Statements>则对应定义CRUD四种类型的操作SQL语句. 其中Id作为操作间的唯一标识.ParameterClass则指定操作参数的类型. ResultsClass这个下面会说到.参数可以是对应实体的属性.也可以是程序中执行SQL语句中传递的参数.但是参数大小写敏感必须一致. 对应参数采用#Paramter#格式进行区分. 如上定义CRUD四个操作外加一个获得所有数据操作.共5个SQL语句.
其实针对MyBatis中需要提供的配置文件共有4种[Important Level]:
Dao.config- 数据访问配置文件 用来指定配置DAO以及指定providers.config文件的位置和数据源的信息
Providers.config-由框架使用的文件来查找你选定的数据库提供的定义访问参数. 这个通用的官方支持数据已达到10种.文件定义固定.[提前写好数据库访问配置 与Dao.Config进行关联.]
SqlMap.config和数据映射定义XML文件[实体映射文件ProductMap.xml] -这是一个有关当前数据库信息及实体映射文件配置的文件。在这个文件里可以指定数据库连接的信息[用户名、密码及主机等),还可以指定实体映射文件.类似[ProductMap.xml]
如上三个配置文件为了演示目的 放到CustomerWeb_UI项目根目录:.
如上配置中其中Privoiders.Config需要作为资源文件嵌入项目:
建立操作的实体以及对应的映射文件后.来看一下Provide.Config其实就是指定项目要支持的数据配置参数.这个相对比较固定.是配置文件中变化最小的一个配置文件.在项目中可以通过配置文件操作类动态切换底层支持的数据库.底层数据库支持已经不再成为项目移植的瓶颈.目前支持12中数据库采用的是SQlServer 2005版本配置:
在这个配置参数需要说明的是Enable属性,默认情况是设置为False的.如果要启用某个数据库驱动就要将它的值设为true,还有一个就是parameterPrefix属性,表示参数化SQL语句中参数的前缀,在SQlServer中参数前缀就是@标识. 细节容易导致编程出线一些很奇怪的 异常.大多数情况下需要检查配置文件. 在来说所这个SQLMap.则是指定当前数据库连接信息和当前实体映射文件.具体配置如下:
对应标识标签SQlMapConfig下. Settings对应全局设置. useStatementNamespaces属性则是指定是否使用命名空间方式来识别.对于初学者而言.为了保证快速上手.建议先把这些细节概念放置一边.建议设置成FAlse.不启用. Provider节点则是指定Provide.Config的文件路劲. DataBase节点则会使找到Provide.Config中指定数据配置.目前项目中采用的是Sql2005即SQlServer2.0. SqlMaps节点这时指定了映射文件的路径. 到了这儿忘了说一下CustomerWeb_UI项目需要添加的引用:
在MyBatis同样支持Log4Net组件方式来查看执行整个过程.当然测试框架也对Nunit很好的支持.可以在执行时启用Log4日志记录.找到项目的Web.Config添加如下Log4支持配置:
支持Log4之后我们基本完成对一个Product实体操作对象全部配置.如下就来编写数据访问类.添加DataAccess.DLL引用:
数据访问对象Product对象底层数据库操作类ProductService.采用SqlMapper对象来进行数据封装操作.其实了解过项目源码的人应该知道.MyBatis曾使用NPetShop中病开放相关的源码.在源码你会看到一个另外一层对SQlmapper应用动态封装. 然后与数据访问层进行隔离开来.其实作者是对Sqlmapper进行一定重写. 这里暂时用最为简单SQlMapper对象进行数据操作.类似我们要插入一条Product记录:
执行插入操作:
插入结果:
ok.来完整分析一下这条数据插入流程.通过Instace()方法初始化SqlMapper对象 在执行插入数据时.在来回来同看看.ProductMap.xml映射文件中关于InsertProduct配置:
执行InsertOperator方法时sqlMapper对象通过查找配置中的InsertProduct下SQL语句进行执行插入操作. 当然配置则指定参数的类型是EntityModel.Product.这里要说一下.如果单一写一个Product类名.可能在执行是爆出异常提示不识别该参数类型.所以对于分层架构来说最好带上命名空间.
当然在初步调试尝试建立SQlMaper初始化时会碰见如下无法找到DAo.Config文件异常:
Dao.config用来建立数据库连接信息.另外一个就是用来识别SQlMap.Config文件.Dao.Config设置路劲对外可执行程序是可见的.设置Dao.Config文件作为编译内容:
如下来更新一下这条记录.更新操作中当然可以使用SQlMapper实例的Update方法进行操作.:
参数依然指定一个Product对象.但在数据更新过程中加入MyBatis的事务处理.当更新数据时发生异常则回滚当前操作保持原来数据.另外一个增加返回值.string类型.执行代码:
执行结果:
对应的配置的ProductMap.XML隐射配置附带返回值Update:
当然在初步调试时也出现各种各样的异常.当你调试会发现的大多出现异常源自于配置文件中出现错误,类似我们在实例化SqlMapper对象时提示:
SQlMap.Config的重要职能之一就是指定当前项目使用数据库连接具体配置信息. 另外一个就是Dao.Config使其配置可见.这很重要.这里需要在SQlMap.config中添加一个<DataBase>节点用来配置数据库连接.当然异常信息在MyBatis中初步调试时很常见.
以上只是说明如何让MyBatis在一个简单纯净的三层架构如何去进行基础数据的CRUd操作. 让它快速工作起来.你会发现.从定义一个操作实体到编写隐射文件.指定数据库连接 操作.都异常简单.最终所有数据操作都交给对应数据操作的SQL Statement[sql语句来完成].在一定程度上增加灵活性.MyBatis中提出的新概念比较少.相对NhiberNate学习曲线较小.容易上手使用.
这篇文章整整采用一周业余时间来验证. 验证的源码见附件。
附件:http://down.51cto.com/data/2359670
另外一个就是MyBatis版本问题. 作为开源项目MyBatis[.NET]目前官方提供最新版本DataMapper 1.6.2./ DataAccess 1.9.2与以前版本类似DataMapper 1.6.1中部分隐射实体的配置文件的语法发生改变. 也就是高版本在语法上有些不想下兼容味道.这也就导致各个版本之间实例异常问题和相对应实例各不相同,版本间参考性具有差距. 这让人情何以堪啊. 这也是我最近看官方文档摸索时一个很头疼的问题. 当然到目前为止对MyBatis原理了解尚未深入.可能目前看法并不可取.只是最近摸索MyBatis出现众多问题而无法找到相关参考资料解决问题.
既然是一个成熟的ORM框架.可以先快速项目中使用.来从实际项目中从全局角度来大体预览一下MyBatis框架的特点.会更加速理解MyBatis. 可能这篇文章写得有点长[只是估计].这个过程也是初学者角度摸索MyBatis的整个过程.难免会有纰漏 还望指正.当然也遇到很多大大小小的问题.本篇将详细讲述如何配置MyBais并构建项目采用MyBatis实现数据的CRUD操作.更深层原理将在后面章节讲述.先让我们会如何使用MyBatis.
如果你对MyBatis了解还不够多.可以参考MyBatis For Wiki,另外当然就是官方.在开始使用MyBatis之前需要在My Batis for Google Code上下载四个文件:
其中DataMapper和DataAccess是核心的引用文件.而另外两个分别对应说明官方提供UserGuid文档.其实可以从文件可以看出MyBaits框架有两个核心的组成部分,一个是SQL Maps,另一个是Data Access Objects也就是常说的[DAO].当然官方在USer Guid做了很经典解释[后篇会翻译出来].这里简述一下个人使用后理解.相对于ORM框架中Nhibernate中把实体EntityModel与数据库表Table通过XML文件建立映射关系.而MyBatis的不同是MyBatis用一个简单的XML文件来实现从实体到SQL statements[SQL]的映射.这就意味什么呢?
首先DataTable数据库表结构和实体彻底的失去关联.数据库表结构改动将不再直接体现在EntityModel. 实体Model把这种依赖关系转移到一个人为可控因素的SQL Statements[sql语句]上来.也就没有Nhibernate中存在的Scheme概念.这也说明另外一个问题.Myibatis 并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定Model.相对NHibernate等“一站式”ORM机制而言Myibatis 以SQL开发的工作量和数据库移植性上的灵活性,为系统设计提供了更大的自由空间. 这也是看了诸多ORM后选择MyBatis一个原因之一. 当然关于MyBatis与Nhibernate之间特点讨论会专门拿出一片文章来阐述.
很明显DataMapper是MyBatis框架的核心.DataAccess Objects[DAO]将动态的、可插入的 DAO 组件很容易地换入换出,可以使用 iBATIS Data Access Objects API 帮助隐藏持久性层实现的细节.创建简单的组件,提供对数据的访问,而无需将实现的详细说明展示给应用程序的其余部分.
解压文件发现6个可用DLL:
根据官方的文档说明如下:
IBatisNet.Common.DLL-[Assembly of classes shared by DataAccess and DataMapper]
IBatisNet.DataAccess.Dll-[核心的DataAccess组件DLL]
IBatisNet.DataMapper.DLL-[核心的数据隐射DataMap组件DLL]
Castyle.DynamicProxy.DLL-[实现为DataMapper动态生成代理]
Log4Net.Dll-[Log4日志组件.]
有了这些引用DLL组件如下来看MyBatis For .Net在项目中如何工作使用,.实现数据的对象的CRUD操作.
快速了解MyBatis构造和原理 来用一个实现项目来实现MyBatis框架数据基础CRUD操作.更加直观的体现MyBatis构建的原理.为了演示理解方便这里做了一个项目架构最简单纯净的三层. 项目结构如下:
简单介绍External-Bin中需要引用的DLL. 为了区别在命名详见下划线后缀不再赘述.EntityModel需要添加IBatisNet.Common.DLL引用.首先演示前需要一个独立数据库以及一个独立数据表Prodcut Tables 创建SQL 语句:
CREATE DATABASE BaseCardDB GO USE BaseCardDB GO CREATE TABLE Product ( ProductID INT PRIMARY KEY IDENTITY(1,1) NOT NULL, Product_Name VARCHAR(50) NOT NULL, Product_Company VARCHAR(100) NOT NULL, SignOn_Data DATETIME NOT NULL DEFAULT(GETDATE()), Update_Data DATETIME ) GO
在EntityModel项目中构建实体Product操作对象.:
namespace EntityModel { public class Product { public int ProductId { get; set; } public string ProductName { get; set; } public string ProductCompany { get; set; } public DateTime SignDate { get; set; } public DateTime UpdateData { get; set; } } }
走到这往往让我们联想到NhiBernate中实现实体对象与数据库表之间映射关系的XML文件.但在MyBatis中则提出来出来对应操作的SQL语句之间映射.这时实现数据映射关系的核心部分.定义个在CustomerWeb_UI中定义对应ProductMap.XML:格式如下
<?xml version="1.0" encoding="utf-8" ?> <sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <statements> <select id="GetAllProducts" parameterClass="string" resultClass="hashtable"> SELECT * FROM Product WHERE Product_Company=#companyname# </select> <insert id="InsertProduct" parameterClass="EntityModel.Product"> INSERT dbo.Product ( Product_Name ,Product_Company) VALUES (#ProductName# , #ProductCompany#) </insert> <delete id="DeleteProduct" parameterClass="int" restultClass="int"> DELETE FROM dbo.Product WHERE ProductID=#ProductId# </delete> <update id="UpdateProduct" parameterClass="EntityModel.Product" restltClass="int"> UPDATE Product SET Product_Name=#ProductName# WHERE ProductID=#ProductId# </update> <select id="SelectAllProduct" resultClass="List"> SELECT * FROM Product </select> </statements> </sqlMap>
有必要说说这个定义实体操作与对应操作的SQl Statement语句之间隐射文件的语法规则.首先<SQlMap>标签是用来表示映射关系. NameSpace最好指定对应实体命名空间.<Statements>则对应定义CRUD四种类型的操作SQL语句. 其中Id作为操作间的唯一标识.ParameterClass则指定操作参数的类型. ResultsClass这个下面会说到.参数可以是对应实体的属性.也可以是程序中执行SQL语句中传递的参数.但是参数大小写敏感必须一致. 对应参数采用#Paramter#格式进行区分. 如上定义CRUD四个操作外加一个获得所有数据操作.共5个SQL语句.
其实针对MyBatis中需要提供的配置文件共有4种[Important Level]:
Dao.config- 数据访问配置文件 用来指定配置DAO以及指定providers.config文件的位置和数据源的信息
Providers.config-由框架使用的文件来查找你选定的数据库提供的定义访问参数. 这个通用的官方支持数据已达到10种.文件定义固定.[提前写好数据库访问配置 与Dao.Config进行关联.]
SqlMap.config和数据映射定义XML文件[实体映射文件ProductMap.xml] -这是一个有关当前数据库信息及实体映射文件配置的文件。在这个文件里可以指定数据库连接的信息[用户名、密码及主机等),还可以指定实体映射文件.类似[ProductMap.xml]
如上三个配置文件为了演示目的 放到CustomerWeb_UI项目根目录:.
如上配置中其中Privoiders.Config需要作为资源文件嵌入项目:
建立操作的实体以及对应的映射文件后.来看一下Provide.Config其实就是指定项目要支持的数据配置参数.这个相对比较固定.是配置文件中变化最小的一个配置文件.在项目中可以通过配置文件操作类动态切换底层支持的数据库.底层数据库支持已经不再成为项目移植的瓶颈.目前支持12中数据库采用的是SQlServer 2005版本配置:
<!--SqlServer 2.0 SQl--> <provider name="sqlServer2.0" enabled="true" description="Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0" assemblyName="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection" commandClass="System.Data.SqlClient.SqlCommand" parameterClass="System.Data.SqlClient.SqlParameter" parameterDbTypeClass="System.Data.SqlDbType" parameterDbTypeProperty="SqlDbType" dataAdapterClass="System.Data.SqlClient.SqlDataAdapter" commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder" usePositionalParameters = "false" useParameterPrefixInSql = "true" useParameterPrefixInParameter = "true" parameterPrefix="@" allowMARS="false" />
在这个配置参数需要说明的是Enable属性,默认情况是设置为False的.如果要启用某个数据库驱动就要将它的值设为true,还有一个就是parameterPrefix属性,表示参数化SQL语句中参数的前缀,在SQlServer中参数前缀就是@标识. 细节容易导致编程出线一些很奇怪的 异常.大多数情况下需要检查配置文件. 在来说所这个SQLMap.则是指定当前数据库连接信息和当前实体映射文件.具体配置如下:
<?xml version="1.0" encoding="utf-8"?> <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!--BAsic Setting About Configuration--> <settings> <setting useStatementNamespaces="false"/> <setting cacheModelsEnabled="true"/> </settings> <providers resource="providers.config"/> <!--DataBase Connection Configuration--> <database> <provider name="sqlServer2.0" /> <dataSource connectionString="data source=(local);database=BaseCardDB;user id=sa;password=chenkai;" /> </database> <sqlMaps> <sqlMap resource="Maps/CustomerMap.xml"/> <sqlMap resource="Maps/ProductMap.xml"/> </sqlMaps> </sqlMapConfig>
对应标识标签SQlMapConfig下. Settings对应全局设置. useStatementNamespaces属性则是指定是否使用命名空间方式来识别.对于初学者而言.为了保证快速上手.建议先把这些细节概念放置一边.建议设置成FAlse.不启用. Provider节点则是指定Provide.Config的文件路劲. DataBase节点则会使找到Provide.Config中指定数据配置.目前项目中采用的是Sql2005即SQlServer2.0. SqlMaps节点这时指定了映射文件的路径. 到了这儿忘了说一下CustomerWeb_UI项目需要添加的引用:
在MyBatis同样支持Log4Net组件方式来查看执行整个过程.当然测试框架也对Nunit很好的支持.可以在执行时启用Log4日志记录.找到项目的Web.Config添加如下Log4支持配置:
<log4net> <!-- Define some output appenders --> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="log.txt"/> <param name="AppendToFile" value="true"/> <param name="MaxSizeRollBackups" value="2"/> <param name="MaximumFileSize" value="100KB"/> <param name="RollingStyle" value="Size"/> <param name="StaticLogFileName" value="true"/> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header]\r\n"/> <param name="Footer" value="[Footer]\r\n"/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n"/> </layout> </appender> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="DEBUG"/> <appender-ref ref="RollingLogFileAppender"/> <appender-ref ref="ConsoleAppender"/> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.DataMapper.LazyLoadList"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.DataAccess.DaoSession"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.DataMapper.SqlMapSession"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.Common.Transaction.TransactionScope"> <level value="DEBUG"/> </logger> <logger name="IBatisNet.DataAccess.Configuration.DaoProxy"> <level value="DEBUG"/> </logger> </log4net>
支持Log4之后我们基本完成对一个Product实体操作对象全部配置.如下就来编写数据访问类.添加DataAccess.DLL引用:
//添加引用 using IBatisNet.Common; using IBatisNet.DataMapper; using IBatisNet.DataMapper.Configuration; using IBatisNet.Common.Utilities; using IBatisNet.DataAccess; using IBatisNet.DataAccess.Configuration; using IBatisNet.DataAccess.Interfaces; using IBatisNet.Common.Logging;
数据访问对象Product对象底层数据库操作类ProductService.采用SqlMapper对象来进行数据封装操作.其实了解过项目源码的人应该知道.MyBatis曾使用NPetShop中病开放相关的源码.在源码你会看到一个另外一层对SQlmapper应用动态封装. 然后与数据访问层进行隔离开来.其实作者是对Sqlmapper进行一定重写. 这里暂时用最为简单SQlMapper对象进行数据操作.类似我们要插入一条Product记录:
public void InsertProduct(Product getproduct) { ISqlMapper _getsqlManager = null; DomSqlMapBuilder getdombuilder = new DomSqlMapBuilder(); if (getdombuilder != null) ProductService._getsqlmapper = getdombuilder.Configure() as SqlMapper; _getsqlManager = Mapper.Instance(); if (_getsqlManager!=null) _getsqlManager.Insert("InsertProduct", getproduct); }
执行插入操作:
//插入一条数据 ProductService_BL getproductBl = new ProductService_BL(); getproductBl.InsertProduct(new Product() { ProductName = "Deskshop-54", SignDate=DateTime.Now, ProductCompany = "Auto-Desk" });
插入结果:
ok.来完整分析一下这条数据插入流程.通过Instace()方法初始化SqlMapper对象 在执行插入数据时.在来回来同看看.ProductMap.xml映射文件中关于InsertProduct配置:
<!--Insert Product--> <insert id="InsertProduct" parameterClass="EntityModel.Product"> INSERT dbo.Product ( Product_Name ,Product_Company) VALUES (#ProductName# , #ProductCompany#) </insert>
执行InsertOperator方法时sqlMapper对象通过查找配置中的InsertProduct下SQL语句进行执行插入操作. 当然配置则指定参数的类型是EntityModel.Product.这里要说一下.如果单一写一个Product类名.可能在执行是爆出异常提示不识别该参数类型.所以对于分层架构来说最好带上命名空间.
当然在初步调试尝试建立SQlMaper初始化时会碰见如下无法找到DAo.Config文件异常:
Dao.config用来建立数据库连接信息.另外一个就是用来识别SQlMap.Config文件.Dao.Config设置路劲对外可执行程序是可见的.设置Dao.Config文件作为编译内容:
如下来更新一下这条记录.更新操作中当然可以使用SQlMapper实例的Update方法进行操作.:
//更新操作 public string UpdateProductById(Product getproduct) { string getresult = string.Empty; if (_getsqlManager == null) _getsqlManager = Mapper.Instance(); else { _getsqlManager.BeginTransaction(); try { getresult = _getsqlManager.Update("UpdateProduct", getproduct).ToString(); _getsqlManager.CommitTransaction(); } catch { _getsqlManager.RollBackTransaction(); throw; } } return getresult; }
参数依然指定一个Product对象.但在数据更新过程中加入MyBatis的事务处理.当更新数据时发生异常则回滚当前操作保持原来数据.另外一个增加返回值.string类型.执行代码:
ProductService_BL getproductBl = new ProductService_BL(); string getresult = getproductBl.UpdateProduct(new Product { ProductId = 1, ProductName = "Widows phone 7 Device", ProductCompany = "Tommy Frank and MS Team" });
执行结果:
对应的配置的ProductMap.XML隐射配置附带返回值Update:
<update id="UpdateProduct" parameterClass="EntityModel.Product" restltClass="int"> UPDATE Product SET Product_Name=#ProductName# WHERE ProductID=#ProductId# </update>
当然在初步调试时也出现各种各样的异常.当你调试会发现的大多出现异常源自于配置文件中出现错误,类似我们在实例化SqlMapper对象时提示:
SQlMap.Config的重要职能之一就是指定当前项目使用数据库连接具体配置信息. 另外一个就是Dao.Config使其配置可见.这很重要.这里需要在SQlMap.config中添加一个<DataBase>节点用来配置数据库连接.当然异常信息在MyBatis中初步调试时很常见.
以上只是说明如何让MyBatis在一个简单纯净的三层架构如何去进行基础数据的CRUd操作. 让它快速工作起来.你会发现.从定义一个操作实体到编写隐射文件.指定数据库连接 操作.都异常简单.最终所有数据操作都交给对应数据操作的SQL Statement[sql语句来完成].在一定程度上增加灵活性.MyBatis中提出的新概念比较少.相对NhiberNate学习曲线较小.容易上手使用.
这篇文章整整采用一周业余时间来验证. 验证的源码见附件。
附件:http://down.51cto.com/data/2359670
相关文章推荐
- MyBatis For .NET学习笔记[2]:配置环境
- MyBatis For .NET学习笔记
- Ext.net mvc 入门学习笔记(一) 环境配置
- Spring 、SpringMVC、Mybatis、MySQL、Maven、Tomcat搭建JavaWeb项目流程---学习笔记(一)工具准备及环境配置
- MyBatis For .NET学习笔记[3]:工作原理解析
- MyBatis For .NET学习笔记:开篇
- MyBatis For .NET学习笔记[3]:工作原理解析
- MyBatis For .NET学习笔记:开篇
- MyBatis学习笔记(一)----简单的环境搭建及测试Demo
- Spring.NET学习笔记2--环境搭建(基础篇)
- PHP学习笔记----IIS7下安装配置php环境
- Maven学习笔记---配置eclipse中maven环境
- Ext.NET学习笔记之1(环境搭建)
- shell编程学习笔记4--环境变量配置文件
- MyBatis学习笔记(一):MyBatis configuration和mapper xml配置总结
- coolite1.0 学习笔记(一) -- 配置coolite开发环境
- 阿里云服务器一键WEB环境配置---Linux学习笔记(3)
- OOP编程iBatis 学习笔记之- 环境配置及简单例子测试
- Computer Vision & Image Processing - 国外opencv学习笔记01-环境配置:在Visual Studio2017中配置
- ASP.NET 3.5核心编程学习笔记(9):用户配置文件