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& ...
随机推荐
- sql server2012附加的数据库问题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM2NzUxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- hdu5119(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5119 分析:dp[i][j]表示由前i个数组成异或和为j的方法数,则dp[i][j]=d[i-1][j ...
- unity3D的FingerGestures小工具
夹 FingerGestures包结构 FingerGestures样例列表 设置场景 教程:识别一个轻敲手势 教程:手势识别器 教程:轻击手势识别器 教程:拖拽手势识别器 教程:滑动手势识别器 教程 ...
- Volley该框架使用了大量的请求图片
尊重原创 http://write.blog.csdn.net/postedit/26142025 代码下载:http://download.csdn.net/detail/yuanzeyao2008 ...
- SE 2014年5月5日
如图配置 某企业网络规划图(三台交换设备/三台路由设备) 接入层 SW1 连接终端用户 汇聚层 SW2 SW3 核心层 R1 R2 R5 1. 如图 SW1 SW2 SW3 物理链路两两相连接,网络中 ...
- 【PLSQL】绑定变量,活跃SQL,软硬解析解析
************************************************************************ ****原文:blog.csdn.net/clar ...
- 仿CSDN Blog返回页面顶部功能
只修改了2个地方: 1,返回的速度-->改成了慢慢回去.(原来是一闪而返回) 2,返回顶部图标出现的时机-->改成了只要不在顶部就显示出来.(原来是向下滚动500px后才显示) 注意:JS ...
- windows phone (25) Canvas元素B
原文:windows phone (25) Canvas元素B ZIndex 这也是一个附加属性,表示canvas的children集合内的子元素的显示顺序,在canvas中的元素默认情况下是后面的 ...
- javascript - 浏览TOM大叔博客的学习笔记
part1 ---------------------------------------------------------------------------------------------- ...
- Java 执行四则运算
四种基本的操作原理是将被转换成后缀缀表达式表达.然后计算. 转换思路和原则.可以参考将中缀表达式转化为后缀表达式 import java.math.BigDecimal; import java.ut ...