此次进讲述对表操作的实现细节。废话不多说,代码见真章。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4 5 <!-- 类型别名,允许你使用一个短的别名代替完整的类名 --> 6 <alias> 7 <typeAlias alias="TbUser" type="IbatisPlatform.Model.TbUser,IbatisPlatform.Model"/> 8 </alias> 9 10 <!-- 【缓存】缓存常用数据,避免多次查询数据库 --> 11 <!-- 12 <cacheModels> 13 <cacheModel id="productCache" implementation="LRU"> 14 <flushInterval hours="24"/> 15 <property name="CacheSize" value="1000" /> 16 </cacheModel> 17 </cacheModels> 18 --> 19 20 <!-- 【结果映射】将查询结果映射到实体的属性 --> 21 <resultMaps> 22 <resultMap id="SelectAllTbUserResult" class="TbUser"> 23 <result property="UserId" column="UserId"/> 24 <result property="UserName" column="UserName"/> 25 <result property="Pwd" column="Pwd"/> 26 <result property="Gender" column="Gender"/> 27 <result property="Note" column="Note"/> 28 </resultMap> 29 </resultMaps> 30 31 <!-- 【语句映射】使用参数映射和结果映射定义的信息,对Sql语句的输入输出参数进行映射。Statements包含6种语句元素: Statement,Insert,Update,Delete,Query,procedure --> 32 <statements> 33 34 <select id="SelectAllTbUser" resultMap="SelectAllTbUserResult"> 35 <![CDATA[SELECT 36 UserId,UserName,Pwd,Gender,Note 37 FROM dbo.TbUser]]> 38 </select> 39 <!--简单的传参--> 40 <select id="SelectAllTbUserById" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult"> 41 <![CDATA[ 42 where UserId =#dictUserId# 43 ]]> 44 </select> 45 <!-- 46 like语句:'$name$%'可以通用语各类数据库,但是以'$name$%'会引入被注入的风险 47 不同数据库可以采用下面的方式传参: 48 1、oracle:#name#||'%' 49 2、mssql:#name#+'%' 50 3、mysql:concat(#name#, '%') 51 对于一些特殊字符的传参,可以在程序中过滤或者组装 52 --> 53 <select id="SelectAllTbUserByName" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult"> 54 <![CDATA[ 55 where UserName like #dictUserName#+'%' 56 ]]> 57 </select> 58 <!-- 59 in 参数传递中当以对象传递时 需要指明property="ArrValue" 其中ArrValue为数组类型 60 例如 61 <iterate open="(" close=")" conjunction=","> 62 #ArrValue[]# 63 </iterate> 64 --> 65 <select id="SelectAllTbUserByIds" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult"> 66 <![CDATA[ 67 where UserId in 68 ]]> 69 <iterate open="(" close=")" conjunction=","> 70 #[]# 71 </iterate> 72 </select> 73 <!-- 74 动态查询条件:dynamic中的prepend在会覆盖成立的第一个条件的中的prepend 75 也就是where会强制的覆盖一个And,所以无需写where1=1 76 --> 77 <select id="SelectAllTbUserByDynamic" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult"> 78 <dynamic prepend="where"> 79 <isNotEmpty prepend="AND" property="UserId"> 80 UserId=#UserId# 81 </isNotEmpty> 82 <isNotEmpty prepend="And" Property="UserName"> 83 UserName=#UserName# 84 </isNotEmpty> 85 </dynamic> 86 </select> 87 88 <!--特殊:针对Oracle使用序列 89 <insert id="AddTbUser"> 90 <selectKey resultClass="decimal" property="Userid" type="pre"> 91 SELECT LenQ.SEQ_USERID.NEXTVAL AS Userid FROM DUAL 92 </selectKey> 93 <![CDATA[ 94 insert into dbo.TbUser(UserId,UserName,Pwd,Gender,Note) 95 values(#Userid#,#UserName#,#Pwd#,#Gender#,#Note#) 96 ]]> 97 </insert> 98 --> 99 <insert id="AddTbUser"> 100 <![CDATA[ 101 insert into dbo.TbUser(UserId,UserName,Pwd,Gender,Note) 102 values(#UserId#,#UserName#,#Pwd#,#Gender#,#Note#) 103 ]]> 104 </insert> 105 <update id="UpdateTbUser"> 106 update dbo.TbUser set UserName=#UserName# 107 where UserId=#UserId# 108 </update> 109 <delete id="DeleteTbUser"> 110 delete dbo.TbUser WHERE UserId=#UserId# 111 </delete> 112 <!--用于查询datatable 仅测试....--> 113 <select id="QueryAllToTable" resultMap="SelectAllTbUserResult"> 114 <![CDATA[ 115 SELECT UserId,UserName,Pwd,Gender,Note FROM dbo.TbUser 116 ]]> 117 </select> 118 </statements> 119 120 <!-- 【参数映射】映射Sql语句的参数 --> 121 <!-- 122 <parameterMaps> 123 <parameterMap id="productParam" class="Product"> 124 <parameter property="ProductId"/> 125 </parameterMap> 126 <parameterMaps> 127 --> 128 129 </sqlMap>
代码仅为一个示例的xml数据操作文件,其中已经对实现以及注意点进行了描述。下面再对其进行概述
1、resultMap为实体与查询结果的映射,可以在一个xml映射文件中定义多个resultMap
2、查询statement中需都应该设定resultMap或者resultClass,不然在到调用时转不到你需要的实体,默认返回object。
3、参数的传递,可以是直接实体、基本类型或者是字典方式传递,在使用中参数名大小写区分,例如where UserID=#UserId#中的UserId必须对应传参命名为UserId,不然无法识别。
4、依赖注入问题,例如
'$name$%'可以通用语各类数据库,但是以'$name$%'会引入被注入的风险 不同数据库可以采用下面的方式传参:
1、oracle:#name#||'%'
2、mssql:#name#+'%
3、mysql:concat(#name#, '%')
5、In条件查询的使用,这个比较特殊。建议使用代码中的那种方式。当然也可以在程序中组装好,再通过参数的方式统一传递,例如in(1,2,3),直接组装(1,2,3)然后直接传递,但是这个不是通用的,因为##方式会多加‘’号,而且也不便于程序的可读性。
6、动态查询条件:dynamic中的prepend在会覆盖成立的第一个条件的中的prepend 也就是where会强制的覆盖一个And,所以无需多写where1=1(开始使用的时候经常犯这个错,当然加上这句的话dynamic那就不用加Prepend=“where”)
7、针对Oracle使用序列实现递增,默认返回当前序列的值。详细写法请看代码。
注:详细的调用就不贴出来了,因为我实现都是通过业务层层调用的,感觉贴不清楚。
下面只给出一个不是很完整的调用基类吧,仅实现增删改查功能,待有空再完善上传个完整的
public class HisBaseDal<T> { public HisBaseDal() { } public virtual object Insert(string insertString, object t) { //DomSqlMapBuilder domSqlMapBuilder = new DomSqlMapBuilder(); //ISqlMapper sqlMapper = domSqlMapBuilder.Configure() as SqlMapper; //if (sqlMapper != null) //{ // try // { // sqlMapper.Insert(insertString, t); // } // catch (Exception ex) // { // throw ex; // } //} ISqlMapper mapper = HisMapper.Instance(); try { IDbCommand cmd = GetDbCommand(mapper, insertString, t); System.Diagnostics.Debug.WriteLine(cmd.CommandText); //尝试手动输出,其实ibatis本身配置可以实现输出,是为手贱了。 return mapper.Insert(insertString, t); } catch (Exception ex) { throw ex; } } public virtual int Update(string statement, object parameter) { ISqlMapper mapper = HisMapper.Instance(); try { string str = GetSql(mapper, statement, parameter); System.Diagnostics.Debug.WriteLine(str); return mapper.Update(statement, parameter); } catch (Exception ex) { throw new Exception("update faile!", ex); } } public virtual int Delete(string statement, object parameter) { ISqlMapper mapper = HisMapper.Instance(); try { return mapper.Delete(statement, parameter); } catch (Exception ex) { throw new Exception("Delete faile!", ex); } } public virtual IList<T> QueryForList(string statement) { ISqlMapper mapper = HisMapper.Instance(); try { return mapper.QueryForList<T>(statement, null); } catch (Exception ex) { throw ex; } } }
ok,今天就写这些了,瞓觉!