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

 <?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. Java对象序列化/反序列化的注意事项

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  2. sys_refcursor的使用方法实例

    --创建过程,參数为sys_refcursor,为out型 create or replace procedure aabbsys_refcursor(o out sys_refcursor) is ...

  3. Swift编程语言学习10—— 枚举属性监视器

    属性监视器 属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器.甚至新的值和如今的值同样的时候也不例外. 能够为除了延迟存储属性之外的其它存储属性加入属性监视器,也能够通过重载 ...

  4. [IOS]UIWebView实现保存页面和读取服务器端json数据

    如何通过viewView保存访问过的页面?和如何获取并解析服务器端发送过来的json数据?通过一个简单的Demo来学习一下吧! 操作步骤: 1.创建SingleViewApplication应用,新建 ...

  5. Java EE (10) - 资源服务器的整合

    加密(Encryption)和数字签名(Digital Signature)通常被用于保护通讯--加密用来防止数据传输过程中的窃听--数字签名用来防止数据传输过程中的篡改 JDBC: 整合关系型数据库 ...

  6. Hibernate 配置详解(11)

    hibernate.session_factory_name_is_jndi 配置hibernate.cfg.xml中SessionFactory的name属性是否作为JNDI名称绑定.默认是true ...

  7. 《深入理解mybatis原理》 Mybatis初始化机制具体解释

    对于不论什么框架而言.在使用前都要进行一系列的初始化,MyBatis也不例外. 本章将通过下面几点具体介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XM ...

  8. javascript面向对象之闭包

    javascript面向对象之闭包 学习javascript一段时间了,自己对闭包作出如下总结,如有某点不妥,请君指出,不胜感激! 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量 ...

  9. windows phone (26) ApplicationBar应用程序栏

    原文:windows phone (26) ApplicationBar应用程序栏 在应用程序中,如果需要几个按钮或者菜单来执行一些普通的命令,就应该考虑使用ApplicationBar,因为silv ...

  10. SQL Server中的查询

          本博文简介一下SQL Server中经常使用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCom ...