您的位置:首页 > 数据库

ibatis 快速上手

2009-04-11 17:42 176 查看
简介

    iBATIS Data Mapper framework 使JACA和。NET应用程序在使用数据库上变的更容易。
IBATIS通过XML描述把对象(Hashtable、java/.NET object   int 、string等)作为输入或者输出跟SQL语句或者存储过程联系起来。
    iBATIS Data Mapper 最大的优势是把相关联的对象映射起来.使用iBATIS Data Mapper,你只要知道对象、XML、SQL,你只需要学习很少的东西便可以上手。  使用iBATIS Data Mapper,你可以把你的精力放在SQL和存储过程上面。



 
例子

     现在我们我们通过一个简单的案例,了解如何通过iBATIS解决数据访问问题。
现在有有一个数据库,数据库里面有一张人员信息表
需求是这样:
   “通过一个WEB应用程序显示人员信息表里面的信息,并且可以添加、修改、删除人员记录”
     一个并不复杂的案例,但是它覆盖所有开发首先要学习的内容。

 

 第1步:The SQL

    我们从案例中的数据表开始,为了简单起见,我们假设数据是ACCESS数据库。表的定义如下:

 

NameTypeSize
PER_IDLong Integer4
PER_FIRST_NAMEText40
PER_LAST_NAMEText40
PER_BIRTH_DATE Date/Time8
PER_WEIGHT_KG Double8
PER_HEIGHT_M Double8
第2步 The.NET Class

 

 

Person.cs
 

 
using System;
namespace iBatisTutorial.Model
{
public class Person
{
private int _id;
private string _firstName;
private string _lastName;
private DateTime _birthDate;
private double _weightInKilograms;
private double _heightInMeters;

public int Id
{
get{ return _id; }
set{ _id = value; }
}

// Other public properties for the private fields ...

}
}
  

 

第3步 The Nunit test

    这里测试案例的第一个需求,显示人员列表。

 

PersonTest.cs
using System.Collections;
using IBatisNet.DataMapper;
using NUnit.Framework;

namespace iBatisTutorial.Model
{
[TestFixture]
public class PersonTest
{
[Test]
public void PersonList ()
{
// try it
IList people = Mapper.Instance().QueryForList("SelectAll",null);

// test it
Assert.IsNotNull(people,"Person list not returned");
Assert.IsTrue(people.Count>0,"Person list is empty");
Person person = (Person) people[0];
Assert.IsNotNull(person,"Person not returned");
}
}
}


     Assert是NUnit的一个类,如此编译,我们只需要MAPPER对象和QueryForList方法。Mapper是 iBATIS 框架里面的一个类,所以我们只需要调用它们。QueryForList方法执行我们的SQL语句(或者储存过程)并且返回一个list类型的结果。

 

    结果中的每一行成为列表中条目。除了QueryForList,这里还有Delete, Insert, Select, QueryForObject等方法在iBATIS API中。
    通过PersonTest类,可以看到 QueryForList 方法的输入参数里面有我们想要运行的SQL语句(或者存储过程)的映射值的Key(我们假设这个映射分为Key和Value)和SQL语句(或者存储过程)需要的运行参数。因为"SelectAll" 不需要任何任何运行参数,我们输入的是null值.

 

    足够简单吧!但是这是我们有一个问题!iBATIS是怎么获取"SelectAll"这个键对应的值(值为sql语句或者储存过程)的呢?
    这里就要提到iBATIS的特色数据映射,不需要把SQL写在代码里面。这个任务可以是我们的,也可以是管理数据库。现在我们把这些映射的的描述写在XML元素里面,如下:

    

  Step 4 :The mapping file

 

Person.xml
<alias>
<typeAlias alias="Person" type="iBatisTutorial.Model.Person, iBatisTutorial.Model" />
</alias>

<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>

<select id="SelectAll" resultMap="SelectAllResult">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
</select>


     iBATIS映射文档可以包含多个象上面一样关联元素集,如果需要还可以写多个映射文档。多映射文档方便多个开发者同时开发一个工程。
  就这样,框架通过解析映射文档获得了SQL语句并放进准备好的环境中。但是,这里又有一个问题! iBATIS怎么找到数据源的。

    这里,你可以为你的应用程序用到的每一个数据源定义一个配置文件。下面是为我们的ACCESS数据库定义的一个配置文件。

 

 Step 5 :The configuration file

  

SqlMap.Config - A configuration file for our Access database
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMapConfig
xmlns="http://ibatis.apache.org/dataMapper"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

<database>
<provider name="OleDb1.1"/>
4000

<dataSource name="iBatisTutorial"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./Resources/iBatisTutorial.mdb"/>
</database>

<sqlMaps>
<sqlMap resource="Resources/Person.xml" />
</sqlMaps>

</sqlMapConfig>


 

     当然,除了Access,还支持ADO.NET的其他providers包括 SqlServer, Oracle, MySQL, PostgreSQL, DB2 and generic OLEDB, ODBC providers. 
     配置文件的最后一部分("sqlMaps")描述了映射文档(第4部对映射有所描述)所在位置。这里我们可以列举多个我们需要的映射文档,在解析配置文件的时候它们都会被读到。

 

    怎么解析配置文件呢?

 

    回过去看第3部的PersonTest类。代码的重点放在"Mapper"对象上面,"Mapper"对象是一个单件。在它第一次被调用之前,读取配置文件创建Mapper对象。Mapper的一系列调用过程及一系列的重用过程。所以在一系列调用过程除非配置文件改不会多次读取。

 

    ibatis框架携带了多个不同的Mapper类。如果你想用一个不同名字的配置文件,或者需要多个数据库,你同样可以用过复制修改标准版本的Mapper类拥有你自定义的Mapper类。

 

   下面是框架里面标准Mapper类的代码。

Mapper.cs
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper;

namespace IBatisNet.DataMapper
{
public class Mapper
{
private static volatile SqlMapper _mapper = null;

protected static void Configure (object obj)
{
_mapper = (SqlMapper) obj;
}
protected static void InitMapper()
{
ConfigureHandler handler = new ConfigureHandler (Configure);
_mapper = SqlMapper.ConfigureAndWatch (handler);
}

public static SqlMapper Instance()
{
if (_mapper == null)
{
lock (typeof (SqlMapper))
{
if (_mapper == null) // double-check
InitMapper();
}
}
return _mapper;
}

public static SqlMapper Get()
{
return Instance();
}
}
}


     你可以根据需要访问多个不同的数据配置,通过设置附加的Mapper类。每一个Mapper的配置对应一个数据库,对我们的应用程序来说,MAPPER就是数据库。透过Mapper门户,你可以在不修改应用程序代码的情况下 修改数据库的位置和完成SQL语句和储存过程的转换

 

   Step 5 :Running the test

   如果我们上面的所有代码和配置文件映射文件放进解决方案。我们可以"蓝色进度条"我们的测试。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息