使用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主要就是这些了,如果有要相关的文档或者代码的朋友,可以联系我。