IBatis学习总结_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > IBatis学习总结

IBatis学习总结

 2013/9/16 12:46:34  常思不罔  博客园  我要评论(0)
  • 摘要:使用IBatis的一些优点和一些原理在网上都能搜得到,而且说的挺详细的,这里我就不在说了。这篇文章主要讲的是如何一步步的使用Ibatis技术及一些属性是干什么的。当初公司的一个项目要使用IBatis让我负责的编写。当时我是第一次听说IBatis,无人讲解只能自学了,在网上看各种相关的文章和代码。网上的文章把原理和属性都介绍的挺详细,但是都没有说出具体在程序中如何一步步的操作的,看完后自己动手操作不知道从哪开始,所以在这里我也不把一些原理介绍了,只说自己如何写IBatis
  • 标签:总结 学习总结 学习

     使用IBatis的一些优点和一些原理在网上都能搜得到,而且说的挺详细的,这里我就不在说了。这篇文章主要讲的是如何一步步的使用Ibatis技术及一些属性是干什么的。当初公司的一个项目要使用IBatis让我负责的编写。当时我是第一次听说IBatis,无人讲解只能自学了,在网上看各种相关的文章和代码。网上的文章把原理和属性都介绍的挺详细,但是都没有说出具体在程序中如何一步步的操作的,看完后自己动手操作不知道从哪开始,所以在这里我也不把一些原理介绍了,只说自己如何写IBatis,希望都给初学者一些帮助吧。IBatis技术要想完全理解或高级的运用还是的仔细研究原理和一些帮助文档,这里只是一些IBatis简单的运用。

      IBatis基本的运行环境配置主要由两个文件组成,分别是SqlMap.config和Provider.config。它们是必需的两个配置文件,其中SqlMap.config的功能类似于web.config或者app.config,是iBatis核心的配置文件,它的存放路径也跟应用程序配置文件一样,必须放在应用程序的运行目录下并且它的文件名是保留的,不可改变的。而Provider.config是一个数据驱动提供类的配置,它的文件名是可以随意改变的,因为通过SqlMap.config的一个配置节可以配置它的引用。
一般情况下Provider.config文件是不用进行修改的,只要复制过去就行了。而SqlMap.config文件需要改动的不是太多。

以下是SqlMap.config文件里的一些代码:

<properties resource="database.config"/>  
    <settings>
        <setting useStatementNamespaces="${useStatementNamespaces}"/>
        <setting cacheModelsEnabled="true"/>
        <setting validateSqlMap="false"/>   
    </settings>
<providers resource="providers.config"/>

database.config是存放数据库连接的一些信息的配置文件,一般与SqlMap.config文件放在一起。 resource="providers.config"是引用providers.config文件,只要providers.config文件的名字不改,这里也不需要修改。

<sqlMaps>
        <sqlMap resource="bin\Map\Craft.xml"/>
</sqlMaps>

其中<sqlMap resource="bin\Map\Craft.xml"/>这是引用DAO里自己创建的xml,需要用到那几个xml文件这里就写几个<sqlMap resource="bin\Map\*.xml"/>
SqlMap.config、Provider.config、database.config文件一般放在web服务应用程序里。

DAO层
需要导入三个引用
IBatisNet.Common.dll、IBatisNet.Common.Logging.Log4Net.dll(日志)、IBatisNet.DataMapper.dll

一般要建立Map文件夹,里面创建xml文件,并且需要复制两个文件(nhibernate-mapping-2.0.xsd和SqlMap.xsd)

另外需要在Map文件夹外部复制进来两个类MyBatis.cs和BaseDao.cs,其中MyBatis和BaseDao类不用修改。

MyBatis.cs是里是个用简单工厂模式进行创建MyBaits的对象的实例,BaseDao.cs是访问数据库的。这两个文件不需要自己手写,直接复制过来就行了,注意要修改名称空间。

另外还需添加一个类(后缀为DAO)里写一些方法供web服务程序调用,需要继承BaseDao类。

class="code_img_closed" src="/Upload/Images/2013091612/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('8a4c229d-aa6f-42ee-a860-48fc48857ecd',event)" src="/Upload/Images/2013091612/2B1B950FA3DF188F.gif" alt="" />
 1 public class StudentDAO : BaseDao
 2     {
 3         /// <summary>
 4         /// 查询全部信息
 5         /// </summary>
 6         /// <returns></returns>
 7         public static IList<Student> GetAllStudent()
 8         {
 9             return SqlMap.QueryForList<Student>("SelectAllCraft", null);
10         }
11 
12         /// <summary>
13         /// 添加信息
14         /// </summary>
15         /// <param name="stu"></param>
16         public static void InsertStudent(Student stu)
17         {
18             SqlMap.Insert("InsertInfo", stu);
19         }
20 
21         /// <summary>
22         /// 修改信息
23         /// </summary>
24         /// <param name="sex"></param>
25         /// <param name="age"></param>
26         /// <param name="score"></param>
27         public static void UpdateStudent(Student stu)
28         {
29             SqlMap.Update("UpdateStudent", stu);
30         }
31 
32         /// <summary>
33         /// 删除信息
34         /// </summary>
35         /// <param name="name"></param>
36         public static void DeleteStudent(string name)
37         {
38             SqlMap.Delete("DeleteStudent", name);
39         }
40 
41     }
View Code

其中的return SqlMap.QueryForList<Student>("SelectAllCraft", null);第一个参数是XML文件中查询语句的id的值,表示这个方法要使用哪个sql语句;第二个参数是要给sql语句传入的参数,如没有参数传null。
注意:DAO\Map里建立的xml文件的属性中的复制到输出目录的值改为始终复制。

Model层与一般程序的model层一样存放对象

UI层与普通的UI一样,添加web服务引用就能调用web服务程序里的方法了。

IBatis项目最主要的是自己写的xml文件,其他的类或者文件一般是不会出错的,最容易出错的就是自己写xml文件。

xml示例

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 
 3 <sqlMap namespace="Student" xmlns="http://ibatis.apache.org/mapping"
 4         xmlns:n="http://ibatis.apache.org/SqlMap.xsd"
 5         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6         xsi:noNamespaceSchemaLocation="SqlMap.xsd">
 7 
 8   <alias>
 9     <typeAlias alias="Student" type="Model.Student,Model" />
10   </alias>
11 
12   <resultMaps>
13     <resultMap id="StudentMap" class="Student">
14       <!--<result property="ID" column="CR_ID"/>
15   <result property="Name" column="CR_Name"/>-->
16       <result property="Id" column="Id"/>
17       <result property="Name" column="Name"/>
18       <result property="Age" column="Age"/>
19       <result property="Address" column="Address"/>
20       <result property="ClassID" column="ClassID"/>
21     </resultMap>
22   </resultMaps>
23 
24   <statements>
25     <!--查询所有信息-->
26     <select id="SelectAllCraft" resultMap="StudentMap">
27       SELECT
28       Id,
29       Name,
30       Age,
31       Address,
32       ClassID
33       FROM student
34     </select>
35     
36     <!--添加信息-->
37     <insert id="InsertInfo" parameterclass="Student" >
38       INSERT INTO Student(Name,Age,Address,ClassID)
39       VALUES(#Name#,#Age#,#Address#,#ClassID#)
40     </insert>
41 
42 
43     <!--更新信息-->
44     <update id="UpdateStudent" parameterclass="Student">
45       UPDATE Student
46       <!--数据库列名=#实体类名#-->
47       SET Age=#Age#,
48       Address=#Address#,
49       ClassID=#ClassID#
50       WHERE name=#Name#
51     </update>
52 
53     <!--删除信息DeleteStudent   指定类型-->
54     <delete id="DeleteStudent"  parameterclass="String">
55       DELETE Student
56       WHERE name=#name#
57     </delete>
58   </statements>
59 </sqlMap>
View Code

其中

     <alias>
      <typeAlias alias="Student" type="Model.Student,Model" />
  </alias>

这是给引用的类型起个别名,方便映射时调用对象类。type属性里逗号前面的是对象类的名称空间加对象类的名称,逗号后面是对象的名称空间。

这里的别名相当于定义了一个全局的变量所以必须是唯一的,在其他的xml也可以使用该xml里定义的别名。

<resultMaps>
    <resultMap id="StudentMap" class="Student">
      <!--<result property="ID" column="CR_ID"/>
  <result property="Name" column="CR_Name"/>-->
      <result property="Id" column="Id"/>
      <result property="Name" column="Name"/>
      <result property="Age" column="Age"/>
      <result property="Address" column="Address"/>
      <result property="ClassID" column="ClassID"/>
    </resultMap>
  </resultMaps>

  这是对数据库的列名和实体类做印射的。id="StudentMap"是给这段代码起个名字用于下面写查询时resultMap属性调用,class="Student" 实体类的对象的别名。
 

<statements>
    <!--查询所有信息-->
    <select id="SelectAllCraft" resultMap="StudentMap">
      SELECT
      Id,
      Name,
      Age,
      Address,
      ClassID
      FROM student
    </select>
    
    <!--添加信息-->
    <insert id="InsertInfo" parameterclass="Student" >
      INSERT INTO Student(Name,Age,Address,ClassID)
      VALUES(#Name#,#Age#,#Address#,#ClassID#)
    </insert>


    <!--更新信息-->
    <update id="UpdateStudent" parameterclass="Student">
      UPDATE Student
      <!--数据库列名=#实体类名#-->
      SET Age=#Age#,
      Address=#Address#,
      ClassID=#ClassID#
      WHERE name=#Name#
    </update>

    <!--删除信息DeleteStudent   指定类型-->
    <delete id="DeleteStudent"  parameterclass="String">
      DELETE Student
      WHERE name=#name#
    </delete>
  </statements>
</sqlMap>

这里面的id="DeleteStudent" 用于在StudentDAO类中调用方法时传的第一个参数,相当于一个方法名。
parameterclass="String"属性是出入参数的类型,可以是string、int,Hashtable也可以是实体类对象。
resultMap="StudentMap"属性是返回的数据在resultMaps里映射给实体类。
增删查改语句选中对应的标签,当有参数时:数据库列名=#实体类名# 例如 WHERE name=#name#

查询时如要按照姓名进行模糊查询时:name like %$name$%;

进行排序时:order by $age$

拼接sql语句:

 <statements>
    <sql id ="SelectALL">
      SELECT
      Student.Id,
      Name,
      Age,
      Address
      from student
    </sql>
    <!--查询所有信息-->
    <select id="SelectAllCraft" resultMap="StudentMap">
      <include refid ="SelectALL"/>
    </select>
  </statements>
</sqlMap>

动态拼接sql语句的条件

 <statements>
    <sql id ="SelectALL">
      SELECT
      Student.Id,
      Name,
      Age,
      Address,
      ClassID,
      
    </sql>
    <sql id="s">
      ClassName
      FROM Student
      Inner join Class
      On Class.Id=Student.ClassID
    </sql>
    <sql id ="c">
      Student.Id,
      Name,
      Age,
      Address,
      ClassID,ClassName
    </sql>
    <!--动态加载sql语句-->
    <select id ="SelectByWhere" resultMap="StudentMap" resultClass="Hashtable">
      <include refid ="SelectALL"/>
      <include refid="s"></include>
      <dynamic prepend="where">
        <isParameterPresent>
          <isNotEmpty prepend="and" property="Name">
            Name like '%$Name$%'
          </isNotEmpty>
          <isNotEmpty prepend="and" property="Address">
            Address like '%$Address$%'
          </isNotEmpty>
          <isGreaterThan prepend="and" property="ClassID" compareValue="0">
            <!--大于-->
            ClassID=#ClassID#
          </isGreaterThan>
          <isNotEqual prepend="and" property="Age" compareValue="0">
            <!--不等于-->
            Age=#Age#
          </isNotEqual>
        </isParameterPresent>
      </dynamic>
      order by Id $Orderby$ 
    </select>
  </statements>
</sqlMap>

其中的 <isParameterPresent>标签下面还有许多标签,有空时可以看一下。

下面是自己写的一个xml,里面包含上面的代码和调用有参或无参的存储过程的写法:

  1 <?xml version="1.0" encoding="utf-8" ?>
  2 
  3 <sqlMap namespace="" xmlns="http://ibatis.apache.org/mapping"
  4         xmlns:n="http://ibatis.apache.org/SqlMap.xsd"
  5         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6         xsi:noNamespaceSchemaLocation="SqlMap.xsd">
  7 
  8   <alias>
  9     <typeAlias alias="Student" type="Model.Student,Model" />
 10     <typeAlias alias="Class" type="Model.Classs,Model" />
 11   </alias>
 12 
 13   <resultMaps>
 14     <resultMap id="StudentMap" class="Student">
 15       <result property="Id" column="Id"/>
 16       <result property="Name" column="Name"/>
 17       <result property="Age" column="Age"/>
 18       <result property="Address" column="Address"/>
 19       <result property="ClassID" column="ClassID"/>
 20       <result property="ClassName" column="ClassName"/>
 21     </resultMap>
 22     <resultMap id ="counts" class="Student">
 23       <result property="Id" column="Id"/>
 24     </resultMap>
 25     <!--<resultMap id="ParameterMap" class="Student">
 26       <result property="ClassID" column="ClassID"/>
 27     </resultMap>-->
 28     
 29     <!--查询学生信息联查班级名称 方法二-->
 30     <!--
 31     <resultMap id="StudentMap" class="Student">
 32       <result property="Id" column="Id"/>
 33       <result property="Name" column="Name"/>
 34       <result property="Age" column="Age"/>
 35       <result property="Address" column="Address"/>
 36       <result property="ClassID" column="ClassID"/>
 37       <result property="Class" column="ClassID" select="SelectClass"/>
 38     </resultMap>-->
 39     <!--查找所有班级下的所有学生-->
 40     <!--
 41     <resultMap id ="ClassMap" class="Class">
 42       <result property ="Id" column="Id"/>
 43       <result property ="ClassName" column="ClassName"/>
 44       <result property ="Student" column="Id" select="SelectStudent"/>
 45     </resultMap>-->
 46   </resultMaps>
 47   
 48   <parameterMaps>
 49     <!--注意:parameterMap中的参数个数和顺序要和存储过程中的一致-->
 50     <parameterMap id="ParameterMap" class="Student">
 51       <parameter property="ClassID"/>
 52     </parameterMap>
 53   </parameterMaps>
 54   
 55   <statements>
 56     <sql id ="SelectALL">
 57       SELECT
 58       Student.Id,
 59       Name,
 60       Age,
 61       Address,
 62       ClassID,
 63       
 64     </sql>
 65     <sql id="s">
 66       ClassName
 67       FROM Student
 68       Inner join Class
 69       On Class.Id=Student.ClassID
 70     </sql>
 71     <sql id ="c">
 72       Student.Id,
 73       Name,
 74       Age,
 75       Address,
 76       ClassID,ClassName
 77     </sql>
 78     <!--查询所有信息-->
 79 
 80     <!--联查 一对一对联查 -->
 81     <!--查询学生信息联查班级名称 方法一 -->
 82     <select id="SelectAllCraft" resultMap="StudentMap">
 83       <!--<include refid ="SelectALL"/>
 84       <include refid="s"/>-->
 85       select 
 86       <include refid="c"></include>
 87       FROM Student
 88       Inner join Class
 89       On Class.Id=Student.ClassID
 90     </select>
 91     <!--动态加载sql语句-->
 92     <select id ="SelectByWhere" resultMap="StudentMap" resultClass="Hashtable">
 93       <include refid ="SelectALL"/>
 94       <include refid="s"></include>
 95       <dynamic prepend="where">
 96         <isParameterPresent>
 97           <isNotEmpty prepend="and" property="Name">
 98             Name like '%$Name$%'
 99           </isNotEmpty>
100           <isNotEmpty prepend="and" property="Address">
101             Address like '%$Address$%'
102           </isNotEmpty>
103           <isGreaterThan prepend="and" property="ClassID" compareValue="0">
104             <!--大于-->
105             ClassID=#ClassID#
106           </isGreaterThan>
107           <isNotEqual prepend="and" property="Age" compareValue="0">
108             <!--不等于-->
109             Age=#Age#
110           </isNotEqual>
111         </isParameterPresent>
112       </dynamic>
113       order by Id $Orderby$ 
114     </select>
115     <!--获取行数-->
116     <select id ="SelectByWhereName" resultMap="counts" resultClass="Hashtable">
117       select COUNT(*) as Id
118       FROM Student
119       Inner join Class
120       On Class.Id=Student.ClassID
121       <dynamic prepend="where">
122         <isParameterPresent>
123           <isNotEmpty prepend="and" property="Name">
124             Name like '%$Name$%'
125           </isNotEmpty>
126           <isNotEmpty prepend="and" property="Address">
127             Address like '%$Address$%'
128           </isNotEmpty>
129           <isGreaterThan prepend="and" property="ClassID" compareValue="0">
130             <!--大于-->
131             ClassID=#ClassID#
132           </isGreaterThan>
133           <isNotEqual prepend="and" property="Age" compareValue="0">
134             <!--不等于-->
135             Age=#Age#
136           </isNotEqual>
137         </isParameterPresent>
138       </dynamic>
139     </select>
140     <!--调用有参的存储过程-->
141     <procedure id="SelectAllCraft2" resultMap="StudentMap" parameterMap="ParameterMap">
142       p_SelectAll
143     </procedure>
144     <!--调用无参的存储过程-->
145     <!--<procedure id="SelectAllCraft" resultMap="StudentMap">
146       --><!--无参的存储过程也可以用select标签写--><!--
147       p_SelectStudent 
148     </procedure>-->
149     <!--查询学生信息联查班级名称 方法二--><!--
150     
151     <select id="SelectAllCraft" resultMap="StudentMap">
152       SELECT
153       Id,
154       Name,
155       Age,
156       Address,
157       ClassID
158       FROM Student
159     </select>
160     <select id ="SelectClass" resultClass="Class">
161       Select Id,ClassName from Class where Id=#Id#
162     </select>-->
163 
164     <!--联查 一对多 -->
165     <!--查找所有班级下的所有学生--><!--
166     
167     <select id ="SelectAllClass" resultMap="ClassMap">
168       select * from Class
169     </select>
170     <select id ="SelectStudent" resultClass="Student">
171       select * from Student where ClassID=#Id#
172     </select>-->
173     
174     <!--添加信息-->
175     <insert id="InsertInfo" parameterClass="Student">
176       INSERT INTO Student(Name,Age,Address,ClassID)
177       VALUES(#Name#,#Age#,#Address#,#ClassID#)
178     </insert>
179 
180 
181     <!--更新信息-->
182     <update id="UpdateStudent" parameterClass="Student">
183       UPDATE Student
184       <!--数据库列名=#实体类名#-->
185       SET Age=#Age#,
186       Address=#Address#,
187       ClassID=#ClassID#
188       WHERE name=#Name#
189     </update>
190 
191     <!--删除信息DeleteStudent   指定类型-->
192     <delete id="DeleteStudent"  parameterClass="String">
193       DELETE Student
194       WHERE name=#name#
195     </delete>
196   </statements>
197 </sqlMap>
View Code

IBatis主要就是这些了,如果有要相关的文档或者代码的朋友,可以联系我。

 

发表评论
用户名: 匿名