IBatis增删改差的实现以及注意点

此次进讲述对表操作的实现细节。废话不多说,代码见真章。

  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,今天就写这些了,瞓觉!

Top
收藏
关注
评论
原文地址:https://www.cnblogs.com/Joy-et/p/4922224.html