写完第一篇,有朋友给我发邮件,说想让我配合实例写会不会更好一些,可是呢,我觉得这就相当于那些北大的什么鸟给无辜的孩子们吃快餐一样,我是坚决反对那样的,知其然不知其所以然,可能你当下可以从那里学点东西然后找到个工作,但是那样的知识体系是不适合我们发展的,当然了,这也是小白的个人观点,毕竟人那什么鸟比我飞的漂亮的多,至于iBatis这东西,说简单不简单,说难不难,很多基础的概念配置的东西,还是很有必要研究一下的,至于他的使用倒是很简单,所以也希望朋友们能真正吃透他,您的功力如何,并不在于您有多么锋利的武器,而在于您能把它的锋利发挥到一个什么程度,好了 闲话少说,书归正传
iBaits的配置是以SqlMap.config的XML描述为核心,该文件提供了详细的数据源配置,数据映射以及一些其他的配置,在程序执行的时候,这个文件将首先被分析,确定数据库提供者,数据源等等的内容,然后返回一个应用程序中的DataMapper对象,sqlMapper类是DataMapper框架的核心,他是程序与DataMapper框架的API,通过创建SqlMapper类完成DataMapper客户的创建,每种配置文件对应一个数据源,但是在一个应用程序中可以使用多个DataMapper客户,通过创建多个配置文件,并在初始化DataMapper客户的时候把配置文件名作为参数传入,就可以在一个应用程序中使用多个DataMapper客户,对于多个DataMapper客户应用程序的这些配置来说,可以使用不通的配置命名,而数据源却是同一个数据库,这是完全可以的
勘误:在上一篇中我把xsd文件的存放路径写错啦,正确的应该是 “VS2008安装路径\Xml\Schemas ”,其他版本的VS我没有注意过有没有区别,大家可以自己试一下啦,如果找不到的话可以@我
SqlMap.config配置
在整个iBatis应用中,这个文件起着一个中枢的作用,是最关键的一个配置文件,这一篇我主要写一下他详细的配置方式,这里我先给出一个示例,然后详细的解释一下他的配置方式
<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<properties>
<property resource="DataAccessInfo.config"/>
</properties>
<settings>
<setting useStatementNamespaces="false"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="false"/>
</settings>
<providers embedded="providers.cinfig"/>
<!-- Database connection information -->
<database>
<provider name="sqlServer2005"/>
<dataSource name="NorthWind" connectionString="Data Source=${DataSource};Initial Catalog=aspnetdb;Persist Security Info=True;User ID=sa;Password=123123."/>
</database>
<alias>
<typeAlias alias="Customers" type="iBatisSample.Domain.Customers,iBatisSample"/>
</alias>
<sqlMaps>
<sqlMap resource="Maps/Customers.xml" />
<sqlMap resource="Maps/Orders.xml"/>
</sqlMaps>
</sqlMapConfig>
在你的iBatis组件包里,你应该可以找到一个sample.sqlmap.config的文件,这是一个示例性的文件
首先properties节点,在它下面可以定义若干个property节点来引用文件或者配置一些键值对,这些,这些键值对或者引用文件中的键值对会在所有的配置中经常使用,而也会有频繁更改的可能,比如数据库连接串,所以我们就可以把它定义为一个键值对,或者定义在引用的文件里,起到统一管理的作用,引用的方式有以下三种
resource:通过相对路径来确定文件的位置
url:通过绝对路径来确定文件位置
embedded:通过嵌入资源方式来确定文件位置
被引用的文件示例如下(DataAccessInfo.config)
<?xml version="1.0" encoding="utf-8" ?>
<setting>
<add key="DataSource" value="XIAOYAOJIAN"/>
</setting>
这样我们就可以使用“${DataSource}”的方式在其他位置使用它了,而要更改他的值的时候,只许要更改一处
然后是Settings节点,在这个节点里,可以设置一些iBatis的属性,根据我们项目的需求,分别配置,达到我们对DataMapper的最优化,我们可以添加的设置项和含义我下面给出
useStatementNamespaces | 默认为false,如果为true在程序中通过名称访问数据查询语句的时候,需要使用他的全局完整命名空间 |
cacheModelsEnabled | 默认为true ,是否启动缓存,这只是一个全局设定,也就是说还可以在以后临时更改 |
validateSqlMap | 默认为false,是否启用SqlMapConfig.xsd来验证工程中的映射文件 |
useReflectionOptimizer | 默认为true,是否使用c#的reflection机制来访问c#中对象的属性 |
useEmbedStatementParams | 这个我暂时还不知道是什么意思#24 |
然后是providers节点,这个节点定义了我么需要使用的数据库提供者和数据库提供者的连接信息,说是“定义”倒不如说是“指定”,因为所有的“定义”都是在providers.config中,我们在SqlMap.config中只需要指定使用哪种数据库和提供一些连接信息就可以啦,不过不要忘记了在proviers.config把我们要使用的那种数据库名后面紧跟着的enabled属性设置为true,在SqlMap.config中指定的提供者名称一定要与providers.config中的提供者名称完全一致,例如,我在这里使用的就是sqlServer2005,另外,也可以把providers.config中某个provider的default设置为true或者1,就不需要在SqlMap.config中指定要使用的提供者啦,不过这就只可以使用一种数据提供者啦,在iBatis中,提供了很多中数据库提供者,已经完全可以满足我们使用啦
接下来是alias节点,通过这个节点可以给一些很长的类名指定一个别名,这样,在iBatis的使用过程中就省去和很多麻烦,让我们的使用更方便也更直接,例如
<typeAlias alias="Customers" type="iBatisSample.Domain.Customers,iBatisSample"/>
这里,我为我项目(iBatisSample)下的Domain下的Customers类指定了一个别名Customers,
在iBatis中,已经为我们预设了很多的别名,我们可以直接使用他们,同时在定义我们自己的别名的时候注意不要与预定义的重名,具体内容如下图所示
接下来是database节点了,我想这个的意义就不用我说了吧,在这个节点下需要一个provider和一个datasource元素,如果我们使用默认的数据库提供者,可以不添加这个provider元素,datasource元素用来确定数据源连接字符串,并给它指定一个名称,在SqlMap.config中,可以有多个database节点,在最上面的示例用数据库连接字符串我通过${DataSource}的方式使用了我们在DataAccessInfo.config中的DataSource的值“XIAOYAOJIAN “
最后就是SqlMaps节点啦,在基于数据映射的情况下,应用程序的映射文件定义了SQL语句和存储过程,同时也定义了输入参数和返回对象的类型,随着应用程序的复杂化,我们就需要把很多映射文件放在不同的文件中分别管理和使用,所以就有了这个SqlMaps节点,在他下面可以有若干个<SqlMap/>节点来分别指定要引用的映射文件,同样引用方式也有三种 就是resource、url和embedded
至于映射文件的配置和写法,我会在下一篇以及以后配合实例讲的,这一篇就写到这里啦