ibatis是一个基于SQL映射支持Java和.NET的持久层框架:
1.如下所示id是对应程序的statement,resultClass需要填写SQL查询到的字段对应的类的命名空间+类名(DAO.QueryForList<实体类>),以此完成持久层和业务逻辑层的交互;
<select id="GetIncomeMonth" resultClass="XXXX.Model.StatistMonth">
<![CDATA[
/*我是一条注释*/
]]>
</select>
可以这样映射到常用的类型:
<select id="SelectDetailViewByParam" resultType="System.String">
2.一般标签有select,Insert,Update,Delete,Query,procedure??
3.数据库查询的字段要和实体类对应,不对应的SQL语句要用AS起别名统一,否则映射失败。
<!-- 起别名的SQL,要包起来 例如:SELECT A.NAME,B.PLACE FROM TABLE A LEFT JOIN B ON A.ID=B.ID-->
<!-- 需要改为SELECT * FROM (SELECT A.NAME,B.PLACE FROM TABLE A LEFT JOIN B ON A.ID=B.ID) AS T-->
4.占位符,通过字典键值对传递,命名要一致,dic.Add(“ID”,”123”):
- ID=#ID# ?
- ID LIKE '%$ID$%' ?
- ID NOT IN ($ID$)?
- ID NOT IN ('$ID$')
区别:#默认给两边加单引号,$不会,传进来是什么就是什么
5.配置xml位置:Config\SqlMap.config,注意先后顺序,先写T4模板生成的xml,再写自己写的xml
出现以下符号需要用CDATA包裹:“<”“>”“?”“&”等符号
【说明】不为空则执行包裹的SQL,其中prepend可以是and、or、空
<select id="省略" resultClass="省略">
select * from table
<isNotEmpty prepend="and" property="ID">
ID = #ID#
</isNotEmpty>
</select>
假如ID是空的,那么将执行
select * from table
假如ID不是空的,那么将执行
select * from table and ID='123456'
一般来讲SQL中的like,不用写isNotEmpty,即使输入空的,比如以下情况,也会默认查到所有
select * from table where ID like '%%'
【情景】
有一个成绩表:scoreid,studentid,score,testnum
有一个学生表:studentid,studentname
假如传入1,2显示出studentid,studentname,'testnum=1的成绩','testnum=2的成绩'
假如传入1,2,3显示出studentid,studentname,'testnum=1的成绩','testnum=2的成绩','testnum=3的成绩'
解答:其中入参testnum=1,2,3
<select id="getStudentScores" resultClass="FitsWeb.Model.StudentDetails">
? ? ? ? SELECT s.studentid, s.studentname,
? ? ? ? ? ? <foreach collection="testnums" item="item" separator=",">
? ? ? ? ? ? ? ? MAX(CASE WHEN sc.testnum = #{item} THEN sc.score END) AS 'testnum=${item}的成绩'
? ? ? ? ? ? </foreach>
? ? ? ? FROM 学生表 s
? ? ? ? LEFT JOIN 成绩表 sc ON s.studentid = sc.studentid
? ? ? ? WHERE sc.testnum IN (#{testnum})
? ? ? ? GROUP BY s.studentid, s.studentname
</select>