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& ...
 
随机推荐
- asp.net出现正在中止线程解决方案
			
刚才又再次遇到了一个之前遇到的问题,在这里记录一下. 起因: 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAb ...
 - unix解释器文件详解
			
exec执行普通文件和解释器文件的区别 2014-11-15 23:52:45 分类: LINUX exec执行普通文件和解释器文件的区别 ——lvyilong316 1. 从一个问题开始 首先要从项 ...
 - javamail发送邮件的简单实例(转)
			
javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码 ...
 - CSDN博客的一些问题(友好的吐槽)--后记,有一点点改进
			
近期,CSDN博客真的非常不稳定,时常会出现503错误. 昨天.我发现自己的博客的訪问量仅仅有4万多,今天最终发现它变回原来的6万多了. 我写博客不是为了这个訪问量,可是,CSDN这点使用问题啦. 或 ...
 - zoj1610(线段树)
			
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 题意:在0-8000长的线段里面,按先后次序依次覆盖颜色, ...
 - ORACLE 实验二
			
实验二:数据操纵 实验学时:4学时 实验类型:综合型 实验要求:必修 一.实验目的 1.掌握SQL数据查询语句: 2.掌握SQL聚集函数的使用. 3.掌握SQL插入.改动.删除语句的使用. 二.实验内 ...
 - Ubuntu 12.04 安装 Tomcat8 遇到的问题
			
问题: :/tomcat8/bin$ sudo ./configtest.sh Using CATALINA_BASE: /home/yyb/android/tomcat8 Using CATAL ...
 - iText操作word文档总结
			
操作word文档的工具有很多,除了iText之外还有POI,但是POI擅长的功能是操作excel,虽然也可以操作word,但是能力有限,而且还有很多的bug,技术并不成熟,下面就重点介绍一种操作wor ...
 - 去掉windows文件末尾的^M:  %s/\r//g
			
去掉windows文件末尾的^M: %s/\r//g
 - Java命令参数说明
			
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令 JAVA_HOME"bin"java –option 来启动,-option为虚 ...