1、各个配置文件的配置说明

providers.config:指定数据库提供者,.Net版本等信息。

xxxxx.xml:映射规则。

SqlMap.config:大部分配置一般都在这里,如数据库连接等等。

2、默认配置文件的存放位置

在Windows应用项目或者类库项目中,需要将配置文件放在项目的bin/Debug/目录下。

在Web应用程序中,需要放在应用程序的根目录下。

当然,这也不是强制性的,也可以很灵活地配置。

例如以下代码,就从指定的位置去加载了SqlMap.config。注意,虽然SqlMap.config是从指定的位置,但是要注意里面的resource引入的资源,还是从原来的默认目录开始找

 public IList<PersonModel> GetList()
{
//ISqlMapper mapper = Mapper.Instance();
DomSqlMapBuilder builder = new DomSqlMapBuilder();
ISqlMapper mapper = builder.Configure(@"D:\SqlMap.config");
IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null);//这个"SelectAllPerson"就是xml映射文件的Id
return ListPerson;
}
  <providers resource="providers.config"/>

SqlMap.config里面的providers.config这个东西,还是需要在原来默认的位置。

3、SqlMap.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"> <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>

properties节点

properties节点通常用于引入在外部定义一些键值对配置文件,以方便在后面统一调用,这样修改的时候,只修改就可以了

它的引入方式有3种:

  •   resource:   通过相对路径来确定文件的位置。
  •   url:     通过绝对路径来确定文件位置。
  •   embedded:通过嵌入资源方式来确定文件位置。

  <sqlMap embedded = "命名空间.文件名.后缀名, 命名空间"/>

例如,你在bin/Debug/目录下添加了一个properties.config文件,里面定义了一个数据库连接

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <add key="connectionString" value="server=...;uid=...;pwd=...;database=Test"/>
</settings>

这样在SqlMap.config文件中就可以这样写:

 <properties resource="properties.config"/>
<!--通常用于引入在外部定义的一些键值对配置文件,以方便统一调用--> <!--数据库连接字符串-->
<database>
<provider name="sqlServer2.0"/>
<!--<dataSource name="Test" connectionString="server=...;uid=...;pwd=...;database=Test"/>-->
<dataSource name="Test" connectionString="${connectionString}"/>
</database>

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的方式。

如果为"true",示例:

<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
<resultMaps>
<resultMap id="PersonModel" Class="Person">
<!--id会被statements节点所用,Class实体类所在位置-->
<result property="PersonId" column="Id"/>
<!--property对应实体类的属性名,column对应数据库表的列名-->
<result property="PersonName" column="Name"/>
</resultMap>
</resultMaps>
<statements>
<select id="SelectAllPerson" resultMap="PersonModel">
<!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
select * from person
</select>

调用:

IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null);

这里就不能这样调用了,应该为: IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("Person.SelectAllPerson", null);

providers节点

  <providers resource="providers.config"/>

这里使用引入外部配置文件的方式实现。

database节点

指定一个你选择使用的数据库,和数据库连接。

<database>
<provider name="sqlServer2.0"/>
<!--<dataSource name="Test" connectionString="server=106.14.182.241;uid=sa;pwd=van;database=Test"/>-->
<dataSource name="Test" connectionString="${connectionString}"/>
</database>

SqlMaps节点

SqlMaps节点,用于配置映射信息。通常把映射信息写在外部,然后在这个节点引入。

 <sqlMaps>
<sqlMap resource="Person.xml" />
<!--这个是指定映射文件的位置-->
</sqlMaps>

4、映射文件

映射文件指定哪个属性名,对于哪个列名。

下面来看看省略的写法(当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="IbatisNetModel.PersonModel">
select * from person
</select>
</statements>
</sqlMap>

下面再来看看全部写全的写法,为了展示不同,我将PersonModel实体的Id和Name的属性名改为PersonId,PersonName:

 public class PersonModel
{
public int PersonId { get; set; } public string PersonName { get; set; }
}
<?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="PersonModel" Class="IbatisNetModel.PersonModel">
<!--id会被statements节点所用,Class实体类所在位置-->
<result property="PersonId" column="Id"/>
<!--property对应实体类的属性名,column对应数据库表的列名-->
<result property="PersonName" column="Name"/>
</resultMap>
</resultMaps> <statements>
<select id="SelectAllPerson" resultMap="PersonModel" >
<!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
select * from person
</select>
</statements> </sqlMap>

alias节点可以为类指定一个别名,通常用于为一些很长的类名指定一个别名,这样可以减少一些代码。

<?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"> <alias>
<typeAlias alias="Person" type="IbatisNetModel.PersonModel,IbatisNetModel"/>
<!--为类指定一个别名-->
</alias> <resultMaps>
<resultMap id="PersonModel" Class="Person">
<!--id会被statements节点所用,Class实体类所在位置-->
<result property="PersonId" column="Id"/>
<!--property对应实体类的属性名,column对应数据库表的列名-->
<result property="PersonName" column="Name"/>
</resultMap>
</resultMaps> <statements>
<select id="SelectAllPerson" resultMap="PersonModel" >
<!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
select * from person
</select>
</statements> </sqlMap>

以上代码的意思是,为IbatisNetModel.PersonModel类指定一个别名Person。Person就代表IbatisNetModel.PersonModel这个类。

起初我以为别名只是起了缩短配置类的作用,但后来我发现别名是还有其他作用的,它还指明了IBatis.net应该到哪个程序集去找实体类。

如果程序偶尔报如下错误,那么你就要考虑加上别名了。

“/”应用程序中的服务器错误。Could not load type from string value 'xxx'

Ibatis.Net有很多默认的别名:

resultMaps部分定义了数据库字段名与实体类属性名之间的关系。当然,如果你数据库字段名与实体类属性名完全一样,那么resultMaps部分是可以省略的。另外要注意一点,resultMap的列比你查询的列不能多。它不会说,ResultMap里映射的列多了,该属性就自动将select返回的列设置为null,而是直接所有列都不映射赋值。但是可以少,也就是说,Person表有Id,Name 2列,select出所有列,但是你只想要Name列,那么ResultMap里面映射Name列就行了。

statements部分:用于定义你需要执行的语句,在程序中通过select的 id 调用。

属性说明:

属性

说明

parameterMap

参数映射,需结合parameterMap节点对映射关系加以定义,对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现更加出色

parameterClass

参数类。指定了参数类型的完整类名(包括命名空间),可以通过别名避免每次书写冗长的类名

resultMap

结果映射,需结合resultMap节点对映射关系加以定义

resultClass

结果类。指定了结果类型的完整类名(包括命名空间),可以通过别名避免每次书写冗长的类名

cacheModel

Statement对应的Cache模块

extends

重复使用SQL子句

extends

extends用于提取一段重复使用的SQL语句而避免重复书写

  <statements>

    <select id="SelectCommon" resultMap="PersonModel">
select * from person
</select> <select id="SelectAllPerson" resultMap="PersonModel" extends="SelectCommon">
<!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
order by Id desc
</select> </statements>

parameterMap的属性(后面详细介绍)

它可以接受三个属性,id/class/extends,其中是有id是必须的,class用于声明使用的实体类名称,可以是别名,也可以是全名,extends,可想而知,不解释
在它下一级节点中应该包含若干个parameter元素,来指定对象属性与当前变量的映射规则,parameter有如下常用属性:

  1. property:指定类中的一个属性
  2. columu:定义的参数名称
  3. direction:用于声明存储过程的参数方向(input,output,inputoutput)
  4. dbType:用于指定property映射到数据库中的数据类型
  5. type:用于为参数的对象指定CLR类型
  6. nullValue:指定在property为何值时,将会在存储数据时候,替换为null,这是经常会被用到的
  7. size:用于指定最大值

resultMap的属性(后面详细介绍)

它的属性很多是和parameterMap想对应的,但是值得一提的是它下面可以添加一个constructor元素来匹配一个构造函数。当然,这个的前提是Person类中有这样一个构造函数。例如:

<resultMaps>
<resultMap id="PersonModel" Class="Person">
<constructor>
<argument argumentName="personId" column="Id"/>
<argument argumentName="personName" column="Name"/>   
</constructor>
<!--id会被statements节点所用,Class实体类所在位置-->
<result property="PersonId" column="Id"/>
<!--property对应实体类的属性名,column对应数据库表的列名-->
<result property="PersonName" column="Name"/>
</resultMap>
</resultMaps>

执行存储过程(后面详细介绍)

这里有一点区别就是,只可以使用parameterMap,而不可以使用parameterClass,其实想一想,您难道还会为每一个存储过程定义个传入的实体类吗?还有一点,就是它的参数完全是按照 parameterMap中的定义自动匹配的。

 <procedure id="demoProcedure" parameterMap="procedureDemo">
  CustOrderHist
<!--执行存储过程-->
</procedure>

对SQL片段的引用(后面详细介绍)

在编写SqlMaps的时候,经常需要把一个SQL语句进行拆分,然后在不同的地方引用它,我们可以使用sql和include的组合来完成。

    <sql id="orderby">
  order by Id desc
</sql> <select id="SelectAllPerson" resultMap="PersonModel">
   select * from person
  <include refid="orderby"/>
</select>

5、$与#的区别

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$',否则会出错,因为它不会自动增加单引号。

参考:http://www.cnblogs.com/caoyc/category/873268.html

Ibatis.Net 各种配置说明学习(二)的更多相关文章

  1. Spring Boot 项目学习 (二) MySql + MyBatis 注解 + 分页控件 配置

    0 引言 本文主要在Spring Boot 基础项目的基础上,添加 Mysql .MyBatis(注解方式)与 分页控件 的配置,用于协助完成数据库操作. 1 创建数据表 这个过程就暂时省略了. 2 ...

  2. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  3. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  4. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  5. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  6. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  7. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  8. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  9. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

随机推荐

  1. 【Cf #290 C】Fox And Dinner(最大流)

    如果要相邻两个数(a[i] >= 2)相加为质数,显然它们的奇偶性不同,也就是说一个圆桌(环)必须是偶环. 也就是答案的若干个环组成了一张二分图,其中以奇偶分色. 考虑每个点的度数一定为2,用最 ...

  2. Linux内核设计与实现第八周读书笔记

    第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...

  3. 使用Dom4解析xml

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便. XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为 ...

  4. laravel 嵌套事务

    什么是嵌套事务? 一般情况下我们都是一个 begin, 一个 commit 或 rollBack, 但是有可能我们有种场景需要 begin 然后在事务里面再开一个事务, 这就是嵌套事务. MySQL ...

  5. GCC、GNU C、C99、ANSI C

    ANSI C ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准.ANSI C 标准同时规定了 C 标准库. ANSI C发展历史 C 的第一个标准是由ANS ...

  6. python 中的 %s,%r,__str__,__repr__

    1.%s,%r的区别 在进行格式化输出时,%r 与 %s 的区别就好比 repr() 函数处理对象与 str() 函数处理对象的差别. %s ⇒ str(),比较智能: %r ⇒ repr(),处理较 ...

  7. Spring知识总结

    一.Spring简述    Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架,Spring致力于提供一种方法管理你的业务对象,Spring的主要目的是使JavaE ...

  8. 转:NSString / NSData / char* 类型之间的转换

    1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...

  9. kibana做图表无法选取需要选的字段

    kibana做图表无法选取需要选的字段,即通过term的方式过滤选择某一个field时发现列表里无此选项. 再去discover里看,发现此字段前面带有问号,点击后提示这个字段未做索引,不能用于vis ...

  10. Spring boot 集成 mybaits plus(代码生成器)

    源码地址:https://github.com/YANGKANG01/Spring-Boot-Demo 代码生成操作 在pom.xml文件中引入以下包: <!-- mybatisplus与spr ...