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

 <?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 类型别名,允许你使用一个短的别名代替完整的类名 -->
<alias>
<typeAlias alias="TbUser" type="IbatisPlatform.Model.TbUser,IbatisPlatform.Model"/>
</alias> <!-- 【缓存】缓存常用数据,避免多次查询数据库 -->
<!--
<cacheModels>
<cacheModel id="productCache" implementation="LRU">
<flushInterval hours=""/>
<property name="CacheSize" value="" />
</cacheModel>
</cacheModels>
--> <!-- 【结果映射】将查询结果映射到实体的属性 -->
<resultMaps>
<resultMap id="SelectAllTbUserResult" class="TbUser">
<result property="UserId" column="UserId"/>
<result property="UserName" column="UserName"/>
<result property="Pwd" column="Pwd"/>
<result property="Gender" column="Gender"/>
<result property="Note" column="Note"/>
</resultMap>
</resultMaps> <!-- 【语句映射】使用参数映射和结果映射定义的信息,对Sql语句的输入输出参数进行映射。Statements包含6种语句元素: Statement,Insert,Update,Delete,Query,procedure -->
<statements> <select id="SelectAllTbUser" resultMap="SelectAllTbUserResult">
<![CDATA[SELECT
UserId,UserName,Pwd,Gender,Note
FROM dbo.TbUser]]>
</select>
<!--简单的传参-->
<select id="SelectAllTbUserById" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult">
<![CDATA[
where UserId =#dictUserId#
]]>
</select>
<!--
like语句:'$name$%'可以通用语各类数据库,但是以'$name$%'会引入被注入的风险
不同数据库可以采用下面的方式传参:
、oracle:#name#||'%'
、mssql:#name#+'%'
、mysql:concat(#name#, '%')
对于一些特殊字符的传参,可以在程序中过滤或者组装
-->
<select id="SelectAllTbUserByName" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult">
<![CDATA[
where UserName like #dictUserName#+'%'
]]>
</select>
<!--
in 参数传递中当以对象传递时 需要指明property="ArrValue" 其中ArrValue为数组类型
例如
<iterate open="(" close=")" conjunction=",">
#ArrValue[]#
</iterate>
-->
<select id="SelectAllTbUserByIds" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult">
<![CDATA[
where UserId in
]]>
<iterate open="(" close=")" conjunction=",">
#[]#
</iterate>
</select>
<!--
动态查询条件:dynamic中的prepend在会覆盖成立的第一个条件的中的prepend
也就是where会强制的覆盖一个And,所以无需写where1=
-->
<select id="SelectAllTbUserByDynamic" extends="SelectAllTbUser" resultMap="SelectAllTbUserResult">
<dynamic prepend="where">
<isNotEmpty prepend="AND" property="UserId">
UserId=#UserId#
</isNotEmpty>
<isNotEmpty prepend="And" Property="UserName">
UserName=#UserName#
</isNotEmpty>
</dynamic>
</select> <!--特殊:针对Oracle使用序列
<insert id="AddTbUser">
<selectKey resultClass="decimal" property="Userid" type="pre">
SELECT LenQ.SEQ_USERID.NEXTVAL AS Userid FROM DUAL
</selectKey>
<![CDATA[
insert into dbo.TbUser(UserId,UserName,Pwd,Gender,Note)
values(#Userid#,#UserName#,#Pwd#,#Gender#,#Note#)
]]>
</insert>
-->
<insert id="AddTbUser">
<![CDATA[
insert into dbo.TbUser(UserId,UserName,Pwd,Gender,Note)
values(#UserId#,#UserName#,#Pwd#,#Gender#,#Note#)
]]>
</insert>
<update id="UpdateTbUser">
update dbo.TbUser set UserName=#UserName#
where UserId=#UserId#
</update>
<delete id="DeleteTbUser">
delete dbo.TbUser WHERE UserId=#UserId#
</delete>
<!--用于查询datatable 仅测试....-->
<select id="QueryAllToTable" resultMap="SelectAllTbUserResult">
<![CDATA[
SELECT UserId,UserName,Pwd,Gender,Note FROM dbo.TbUser
]]>
</select>
</statements> <!-- 【参数映射】映射Sql语句的参数 -->
<!--
<parameterMaps>
<parameterMap id="productParam" class="Product">
<parameter property="ProductId"/>
</parameterMap>
<parameterMaps>
--> </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,今天就写这些了,瞓觉!

IBatis增删改差的实现以及注意点的更多相关文章

  1. mybatis06 增删改差 源码

    user.java package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id; p ...

  2. android 35 ListView增删改差

    MainActivity package com.sxt.day05_11; import java.util.ArrayList; import java.util.List; import and ...

  3. python与mongodb的交互 增删改差

    首先引入包: pip install pymongo需要用到如下对象: MongoClient对象:用于与MongoDB服务器建立连接 client=MongoClient('主机ip',端口) Da ...

  4. mangodb的基本操作:增删改差

    MongoDB三元素: 1 数据库: 和关系型数据库中数据库的层次相同,内部可以有多个集合. 2 集合: 相当于关系型数据库中的表,存储若干文档,结构不固定 3 文档: 相当于关系型数据库中的行,是J ...

  5. EntityFrameWork简单操作 EF数据上下文对象操作数据增删改差及批处理

    /// <summary> /// EF针对 留言数据库 的 数据上下文对象!!!! /// </summary> static LeaveWordBoradEntities ...

  6. mybatis实现MySQL数据库的增删改查

    环境: jdk1.8 mysql5.7 maven3.6.0 IDEA 什么是mybatis框架? MyBatis 是一款优秀的持久层框架, 它支持自定义 SQL.存储过程以及高级映射. MyBati ...

  7. Python教程:连接数据库,对数据进行增删改查操作

    各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...

  8. JDBC 1 利用Statement对数据库进行增删改查

    准备工作 1新建po类:User private int id; private String name; private String pwd; set,get方法省略 2  新建UserDao类, ...

  9. EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

    其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...

随机推荐

  1. hdu 5056Boring count

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5056 题目大意:就是问在子串中每一个小写字母出现次数不超过k次的个数,注意子串是连续的子串.. . ...

  2. Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49

    Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49 Diesel Time 9150-1 Quartz Wrist wat ...

  3. SurfaceView的一个小应用:开发示波器

    SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的.所以对于View组件,如 ...

  4. Android圆弧形ListView的实现

    本文带大家来实现ListView的圆弧形的分布排列,原理非常easy,就是依据ListView的每个Item的高度来对每个item进行偏移. 首先自己定义一个LinearLayout,这是ListVi ...

  5. 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

    想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...

  6. 【JAVA得知】struts2 于 Actionsupport 任务

    尊重原创:http://xumiao900.iteye.com/blog/469760     Action 跟 Actionsupport 的差别      当我们在写action的时候,能够实现A ...

  7. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  8. (hdu step 7.1.3)Lifting the Stone(求凸多边形的重心)

    题目: Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  9. 样品GA的良好理解

    遗传算法演示样本手册模拟 为了更好地理解遗传算法的计算过程,法的各    个主要运行步骤.       例:求下述二元函数的最大值: (1) 个体编码           遗传算法的运算对象是表示个体 ...

  10. Windows Phone 如果你把Pivot控件当成主页面,那么这篇文章你值得看。

    原文:Windows Phone 如果你把Pivot控件当成主页面,那么这篇文章你值得看. 现在很多App都用到了Pivot视图 来当作 整个App主页面.如果你的Pivot视图主页面承载了大量数据的 ...