IBatis增删改差的实现以及注意点
此次进讲述对表操作的实现细节。废话不多说,代码见真章。
<?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增删改差的实现以及注意点的更多相关文章
- mybatis06 增删改差 源码
user.java package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id; p ...
- android 35 ListView增删改差
MainActivity package com.sxt.day05_11; import java.util.ArrayList; import java.util.List; import and ...
- python与mongodb的交互 增删改差
首先引入包: pip install pymongo需要用到如下对象: MongoClient对象:用于与MongoDB服务器建立连接 client=MongoClient('主机ip',端口) Da ...
- mangodb的基本操作:增删改差
MongoDB三元素: 1 数据库: 和关系型数据库中数据库的层次相同,内部可以有多个集合. 2 集合: 相当于关系型数据库中的表,存储若干文档,结构不固定 3 文档: 相当于关系型数据库中的行,是J ...
- EntityFrameWork简单操作 EF数据上下文对象操作数据增删改差及批处理
/// <summary> /// EF针对 留言数据库 的 数据上下文对象!!!! /// </summary> static LeaveWordBoradEntities ...
- mybatis实现MySQL数据库的增删改查
环境: jdk1.8 mysql5.7 maven3.6.0 IDEA 什么是mybatis框架? MyBatis 是一款优秀的持久层框架, 它支持自定义 SQL.存储过程以及高级映射. MyBati ...
- Python教程:连接数据库,对数据进行增删改查操作
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...
- JDBC 1 利用Statement对数据库进行增删改查
准备工作 1新建po类:User private int id; private String name; private String pwd; set,get方法省略 2 新建UserDao类, ...
- EF(Entity Framework)通用DBHelper通用类,增删改查以及列表
其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...
随机推荐
- ZOJ 3635 Cinema in Akiba(线段树)
Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is ful ...
- [置顶] Guava学习之Immutable集合
Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...
- Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用
现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行 分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物 ...
- 对付"反盗链"
对付"反盗链" 某些站点有所谓的反盗链设置,其实说穿了很简单, 就是检查你发送请求的header里面,referer站点是不是他自己, 所以我们只需要像把headers的refer ...
- Java垃圾回收机制以及内存泄露
1.Java的内存泄露介绍 首先明白一下内存泄露的概念:内存泄露是指程序执行过程动态分配了内存,可是在程序结束的时候这块内存没有被释放,从而导致这块内存不可用,这就是内存 泄露,重新启动计算机能够解决 ...
- WPF界面设计技巧(4)—自定义列表项样式
原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...
- bat文件无法双击运行
问题: win7系统下新建txt文件,编辑脚本内容后,保存为test.bat.每次双击它,只会默认以txt格式打开它,而不是运行它. 解决: 1. 双击打开“我的电脑”,然后在“工具”下选择“文件夹选 ...
- HTML中心在页面上弹出自定义表单层(实现可能拖累)
使用DIV窗体来动态显示内容的原理:首先採用CSS和HTML隐藏弹窗中的内容,然后利用JavaScript(本教程中是JQuery)来动态显示它们.这样的效果不仅可以充分利用有限的版面空间,并且可以提 ...
- UVA 11427 - Expect the Expected(概率递归预期)
UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏.赢的概率p,一个晚上能玩n盘,假设n盘都没赢到总赢的盘数比例大于等于p.以后都不再玩了,假设有到p就结束 思 ...
- Oracle SQL Lesson (9) - 操作数据(增删改)
使用INSERT语句INSERT INTO table [(column [, column...])]VALUES (value [, value...]); INSERT INTO departm ...