Ibatis.Net 各种配置说明(二)
一、各个配置文件的作用说明
providers.config:指定数据库提供者,.Net版本等信息。
xxxxx.xml:映射规则。
SqlMap.config:大部分配置一般都在这里,如数据库连接等等。
二、默认配置文件的存放位置
在Windows应用项目或者类库项目中,需要放在项目的/bin/debug/目录下。
在Web应用程序中,需要放在应用程序根目录。
当然,这也不是强制性的,也可以很灵活地配置
public IList<PersonModel> GetList()
{
//ISqlMapper mapper = Mapper.Instance();
DomSqlMapBuilder builder = new DomSqlMapBuilder();
ISqlMapper mapper = builder.Configure(@"C:\Users\Administrator\Desktop\Ibatis.Net测试\Ibatis.Net测试\SqlMap.config");
IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null); //这个"SelectAllPerson"就是xml映射文件的Id
return ListPerson;
}
例如以上代码,就从指定的位置去加载了SqlMap.config。注意,虽然SqlMap.config是从指定的位置,但是要注意里面的resource引入的资源,还是从原来的默认目录开始找,例如
<providers resource="providers.config"/>
SqlMap.config里面的providers.config这个东西,还是需要在原来默认位置。
三、SqlMap.config
下面先放上一个在官网直接下载后的sample.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"> <properties resource="../../../Files/properties.config"/> <settings>
<setting useStatementNamespaces="false"/>
</settings> <providers resource="../../../Files/providers.config"/> <!-- Database connection information -->
<database>
<provider name="OleDb2.0"/>
<dataSource name="Blogs" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=../../../Files/Blogs.mdb"/>
</database> <sqlMaps>
<sqlMap resource="../../../Files/Maps/Access/Post.xml" />
<sqlMap resource="../../../Files/Maps/Access/Blog.xml" />
<sqlMap resource="../../../Files/Maps/Access/Author.xml" />
</sqlMaps> </sqlMapConfig>
1、properties节点
properties节点通常用于引入在外部定义一些键值对配置文件,以方便在后面统一调用,这样修改的时候,只修改就可以了。
它的引入方式有3种:
- resource: 通过相对路径来确定文件的位置。
- url: 通过绝对路径来确定文件位置。
- embedded:通过嵌入资源方式来确定文件位置。
<sqlMap embedded = "命名空间.文件名.后缀名, 命名空间"/>
例如,你在外部的config文件中,定义了一个数据库连接
<?xml version="1.0" encoding="utf-8" ?>
<setting>
<add key="connectionString" value="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/>
</setting>
这样在SqlMap.config文件就可以这样写:
<!--数据库连接字符串-->
<database>
<provider name="sqlServer2008"/>
<dataSource name="Test" connectionString="${DataSource}"/>
</database>
2、Settings节点
Settings节点里,可以配置以下5个信息:
- useStatementNamespaces:默认flase,是否使用全局完整命名空间。
- cacheModelsEnabled :默认true,是否启用缓存。
- validateSqlMap:默认false,使用启用SqlMapConfig.xsd来验证映射XML文件。
- useReflectionOptimizer:默认true,是否使用反射机制访问C#中对象的属性。
- useEmbedStatementParams 是否使用嵌入的方式声明可变参数
示例:
<settings>
<setting useStatementNamespaces="false"/> --使用全局完整命名空间
</settings>
使用全局命名空间时,不同的xml映射文件,id互不影响。如果出现提示出现 重复的sql Id的情况,大多是没启用。如果启用,则执行sql语句时,要用命名空间.id的方式。这个理所当然要启用的。区分清楚点好,否则很容易出现xml 的 sql id重复的情况。
3、Providers节点
示例:
<providers resource="providers.config"/>
这里使用引入外部配置文件的方式实现。
4、alias节点
alias节点用于为类指定一个别名,通常用于为一些很长的类名指定一个别名,这样可以减少一些代码。
<typeAlias alias="Person" type="iBatis.Domain.Person,iBatisSample"/>
以上代码的意思是,为iBatis.Domain.Person类指定一个别名Person。Person就代表iBatis.Domain.Person这个类。
起初我以为别名只是起了缩短配置类的作用,但后来我发现别名是还有其他作用的,它还指明了IBatis.net应该到哪个程序集去找实体类。
如果程序偶尔报如下错误,那么你就要考虑加上别名了。
“/”应用程序中的服务器错误。
Could not load type from string value 'xxx'
<alias>
<typeAlias alias="Field" type="Nx.Domain.Common.Field, Nx.Domain" />
</alias>
Ibatis.Net有很多默认的别名:

5、database节点
指定一个你选择使用的数据库,和数据库连接。
示例:
<database>
<provider name="sqlServer2008"/>
<dataSource name="Test" connectionString="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/>
</database>
6、SqlMaps节点
SqlMaps节点,用于配置映射信息。通常在映射信息写在外部,在这个节点引入。
四、映射文件
映射文件与NHibernate类似,都是指定哪个属性名,对于哪个列名。不过貌似没有NHibernate那么复杂,东西貌似不多,不过也可能只是我了解得太少。
下面来看看省略的写法(当property与column完全相同时,可以这样写):
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
<statements>
<select id="SelectAllPerson" resultClass="Ibatis.Net.Domain.PersonModel">
select * from person
</select>
</statements>
</sqlMap>
下面再来看看全部写全的写法,为了展示不同,我将Id和Name的属性名改为PersonId,PersonName:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
<resultMaps>
<resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel"> <!--id会被statements节点所用,Class实体类所在位置-->
<result property="PersonId" column="Id"/> <!--property实体类的属性名,column对应的列名-->
<result property="PersonName" column="Name"/>
</resultMap>
</resultMaps>
<statements>
<select id="SelectAllPerson" resultMap="Person"> <!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
select * from person
</select>
</statements>
</sqlMap>
resultMaps部分:定义了数据库字段名与实体类属性名之间的关系。当然,如果你数据库字段名与实体类属性名完全一样,那么resultMaps部分是可以省略的。另外要注意一点,ResultMap的列比你查询的列不能少,也不能多。它不会说,ResultMap里映射的列多了,该属性就自动将select返回的列自动置null,而是直接所有列都不映射赋值。也就是说,Person表有Id,Name,Age3列,如果你只想要SELECT两个列(Id,Name),那么ResultMap里面的3列映射没用了,你必须另外搞一个ResulpMap只映射两列的。不爽。
statements部分:用于定义你需要执行的语句,在程序中通过select的id调用。
|
属性 |
说明 |
|
parameterMap |
参数映射,需结合parameterMap节点对映射关系加以定义,对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现更加出色 |
|
parameterClass |
参数类。指定了参数类型的完整类名(包括命名空间),可以通过别名避免每次书写冗长的类名 |
|
resultMap |
结果映射,需结合resultMap节点对映射关系加以定义 |
|
resultClass |
结果类。指定了结果类型的完整类名(包括命名空间),可以通过别名避免每次书写冗长的类名 |
|
cacheModel |
Statement对应的Cache模块 |
|
extends |
重复使用SQL子句 |
1、extends
extends用于提取一段重复使用的SQL语句而避免重复书写
<select id="SelectAllCustomers" resultMap="Customer">
SELECT * FROM Customers
</select> <select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer" extends="SelectAllCustomers">
ORDER BY CustomerID
</select>
2、parameterMap的属性
它可以接受三个属性,id/class/extends,其中是有id是必须的,class用于声明使用的实体类名称,可以是别名,也可以是全名,extends,可想而知,不解释
在它下一级节点中应该包含若干个parameter元素,来指定对象属性与当前变量的映射规则,parameter有如下常用属性:
- property:指定类中的一个属性
- columu:定义的参数名称
- direction:用于声明存储过程的参数方向(input,output,inputoutput)
- dbType:用于指定property映射到数据库中的数据类型
- type:用于为参数的对象指定CLR类型
- nullValue:指定在property为何值时,将会在存储数据时候,替换为null,这是经常会被用到的
- size:用于指定最大值
3、resultMap的属性
它的属性很多是和parameterMap想对应的,但是值得一提的是它下面可以添加一个constructor元素来匹配一个构造函数。当然,这个的前提是Customers类中有这样一个构造函数。例如:
<resultMaps>
<resultMap id="Customer" class="Customers">
<constructor>
<argument argumentName="PersonId" column="PersonID"/>
<argument argumentName="PersonName" column="PersonName"/>
</constructor>
<result property="PersonId" column="PersonID"/>
<result property="PersonName" column="PersonName"/>
</resultMap>
</resultMaps>
4、存储过程
这里有一点区别就是,只可以使用parameterMap,而不可以使用parameterClass,其实想一想,您难道还会为每一个存储过程定义个传入的实体类吗?还有一点,就是他的参数完全是按照 parameterMap中的定义自动匹配的。
<procedure id="demoProcedure" parameterMap="procedureDemo">
CustOrderHist
</procedure>
5、对SQL片段的引用
在编写SqlMaps的时候,经常需要把一个SQL语句进行拆分,然后在不通的地方引用它我们可以使用sql和include的组合来完成。
<sql id="order">
ORDER BY PersonID
</sql>
<select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer">
SELECT * FROM Person
<include refid="test"/>
</select>
五、$与#的区别
- SELECT * FROM TABLE WHERE Id = #id# 其中如果字段id为字符串类型,那么#id#表示的就是'id',也就是说会自动加引号。如果id为整型,那么#id#就是整型;
- SELECT * FROM TABLE WHERE Id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符串类型,那么Sql语句应该写成 SELECT * FROM TABLE WHERE Id = '$id$',否则会出错,因为它不会自动增加单引号。
Ibatis.Net 各种配置说明(二)的更多相关文章
- Ibatis.Net 各种配置说明学习(二)
1.各个配置文件的配置说明 providers.config:指定数据库提供者,.Net版本等信息. xxxxx.xml:映射规则. SqlMap.config:大部分配置一般都在这里,如数据库连接等 ...
- ibatis 批量更新(二)
1.情景展示 oracle数据库中,需要根据指定字段内容调用加密程序后,根据主键id进行更新其对应的字段mindex_id的值: 加密通过Java实现,然后通过Java对其进行更新: Java使用 ...
- Java数据持久层框架 MyBatis之背景知识二
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- ibatis 批量更新(一)
1.4.2.3 批量修改 支持单个动态更新.批量动态更新 <update id="updateCONSULT_SCHEDULEDynamic" parameterClas ...
- 将vim打造成php的IDE开发环境
将vim打造成IDE开发环境 本文主要介绍将vim打造成IDE开发环境,如代码补全,高亮显示,函数跳转,函数自动注释等 首先介绍2款VIM插件管理器:Vbundle,Pathogen 本文中的vim插 ...
- Spring Boot 系列(三)属性配置&自定义属性配置
在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...
- Kafka设计解析(六)Kafka高性能架构之道
转载自 技术世界,原文链接 Kafka设计解析(六)- Kafka高性能架构之道 本文从宏观架构层面和微观实现层面分析了Kafka如何实现高性能.包含Kafka如何利用Partition实现并行处理和 ...
- Spring Boot 属性配置&自定义属性配置
在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...
- 第一次Scrum冲刺(云医院)
一.小组第一次冲刺任务 1.小故事 小故事1 有一天,A牙齿突然开始痛,想着去医院看看,但是去了医院发现排队挂号的人很多,不知道什么时候才能轮到B.于是A想着能不能提前预约,免去排队的时间.正好云医院 ...
随机推荐
- Object Pascal 语言基础
Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...
- ios中javascript直接调用oc代码而非通过改变url回调方式(转)
之前一个ios项目中,需要通过UIWebview来打开一个静态页面,并在静态页面中 调用相关object-c代码. 一.以前使用js调用object-c的方法 关于如何使用javascript调用ob ...
- dshow,Sample Grabber 从摄像头采集
char* CCameraDS::QueryFrame() { long evCode, size = 0; #if CALLBACKMODE static double lastSampleTime ...
- commonJS — 自定义事件处理(for CustomEvent)
for CustomEvent github: https://github.com/laixiangran/commonJS/blob/master/src/forCustomEvent.js 代码 ...
- java 反射机制的实例
[案例1]通过一个对象获得完整的包名和类名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /** * 通过一个对象获得完整的包名和类名 ...
- 《云中歌》孟石头泡妞大法独家放送,单身汪get起来!!
谁说古代文人雅士只会诗词歌赋.琴棋书画?作为“玉中之王”的公子哥——孟石头泡妞可是个中高手,总结起来都能出一本“泡妞宝典”了,单身的乃们还不赶紧学起来! 第一步:假装自来熟相识,马上开启约会模式 看到 ...
- 解析xml报classnotfound错误
使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速手册里也建议使 用这种方式, 方法是使用Document的selectNodes(String XP ...
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- jq实现楼层切换效果
<!DOCTYPE html> <html> <head> <style> * { margin: 0; padding: 0; box-sizing: ...
- robotframework笔记15
资源和变量文件 用户关键字和变量 测试用例文件 和 测试套件 初始化文件只能用于文件在哪里 了,但 资源文件 提供一种机制来分享它们. 自 资源文件结构非常接近测试用例文件,它是 容易创建它们. 变量 ...