zoukankan      html  css  js  c++  java
  • 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
    收藏
    关注
    评论
  • 相关阅读:
    [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
    [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
    [程序员代码面试指南]数组和矩阵-未排序数组中累加和为给定值的最长子数组长度
    浅谈RDD
    Java中的移位操作符
    Boolean类源码分析
    IntegerCache详解
    Java Integer类分析
    ArrayList LinkedList Vector
    java的"=="与"equals"
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4922224.html
Copyright © 2011-2022 走看看