Ibatis.Net 数据库操作学习(四)
一、查询select
还记得第一篇示例中是如何读出数据库里3条数据的吗?就是调用了一个QueryForList方法,从方法名就知道,查询返回列表。
1、QueryForList 返回List<T>强类型数据集合
来看看方法重载:
从重载可以看出,其实只是3个参数不同的方法,分为泛型与非泛型两个版本而已。
主要说说,参数skipResults,表示从结果行中跳过skipResults行后返回,maxResults表示返回的行数。这个在分页中会用到。
下面来看一个最简单的示例:
xml映射文件(就是之前写的那个没有改动):
<statements>
<select id="SelectAllPerson" resultMap="PersonModel">
<!--id在程序中会被SqlMapper实体类所调用,resultMap就是resultMap节点的id-->
select * from person
</select>
</statements>
对DAO层稍微改造下:
public class PersonDAO
{
//public IList<PersonModel> GetList()
//{
// ISqlMapper mapper = Mapper.Instance();
// //DomSqlMapBuilder builder = new DomSqlMapBuilder();
// //ISqlMapper mapper = builder.Configure(@"D:\SqlMap.config");
// IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null);//这个"SelectAllPerson"就是xml映射文件的Id
// return ListPerson;
//} ISqlMapper mapper = MapperHelper.Instance();//通过MapperHelper获得SqlMapper实例 public IList<PersonModel> GetList(int skipResults, int maxResults)
{
IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null, skipResults, maxResults);//这个"SelectAllPerson"就是xml映射文件的Id
return ListPerson;
}
}
Main方法:
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO();
IList<PersonModel> listPerson = dao.GetList(,);//跳过1条取最多10条
foreach (PersonModel p in listPerson)
{
Console.WriteLine(p.PersonId +" - "+ p.PersonName);
} Console.ReadKey();
}
跳过了第一条数据“刘备”,查询出2条(数据库只有3条记录)。
2、QueryForObject 返回一行数据,对应程序的实体类实例
xml映射文件:
<select id="SelectOnePerson" resultMap="PersonModel">
<!--其中#Id就是传入的参数-->
select * from person where Id = #Id#
</select>
DAO层:
public PersonModel SelectOnePerson(int id)
{
PersonModel p = mapper.QueryForObject<PersonModel>("SelectOnePerson", );//1就是传入Sql语句的参数
return p;
}
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); PersonModel person = dao.SelectOnePerson();
Console.WriteLine(person.PersonId + " - " + person.PersonName);
Console.ReadKey();
}
3、QueryWithRowDelegate 通过委托过滤返回的数据
4、QueryForDictionary
5、QueryForMap
二、Insert
xml映射文件:
<insert id="InsertOne" resultMap="PersonModel">
insert into person(Name) values(#PersonName#)
<selectKey type="post" resultClass="int" property="PersonId">
SELECT @@IDENTITY
</selectKey>
</insert>
selectKey可以获取到插入记录的Id。
selectKey有3个主要的属性:
1)resultClass:返回主键的数据类型
2)type:表示主键在insert之前或之后生成(取决于数据库的主键生成策略),取值分别为[pre|post],非必须,未填写时如果在insert之前表示pre,否则表示post
2)property:返回值保存到的属性,非必须
DAO层:
public int InsertOne(PersonModel p)
{
return (int)mapper.Insert("InsertOne", p);//插入一条数据,返回主键Id
}
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); PersonModel personModel = new PersonModel();
personModel.PersonName = "曹操";
personModel.PersonId = ;
int res = dao.InsertOne(personModel);
if (res > )
{
Console.WriteLine("插入成功,Id为" + res);
}
Console.ReadKey();
}
三、Update
xml映射文件:
<update id="UpdateOne" resultMap="PersonModel">
update person set Name = #PersonName# Where Id = #PersonId#
</update>
DAO层:
public int UpdateOne(PersonModel p)
{
return (int)mapper.Update("UpdateOne", p);
}
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); PersonModel personModel = new PersonModel();
personModel.PersonId = ;
personModel.PersonName = "张三";
int res = dao.UpdateOne(personModel);
if (res > )
{
Console.WriteLine("修改成功");
}
Console.ReadKey();
}
四、Delete
xml映射文件:
<delete id="DeleteOne" resultMap="PersonModel">
Delete Person Where Id = #PersonId#
</delete>
DAO层:
public int UpdateOne(PersonModel p)
{
return (int)mapper.Delete("DeleteOne", p);
}
public int UpdateOne(int id)
{
return (int)mapper.Delete("DeleteOne", id);
}
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); PersonModel personModel = new PersonModel();
personModel.PersonId = ;
personModel.PersonName = "张三";
int res = dao.UpdateOne(personModel);
//int res = dao.UpdateOne(10);//这样也可以
if (res > )
{
Console.WriteLine("删除成功");
}
Console.ReadKey();
}
Ibatis.Net事务处理
BeginTransaction(); CommitTransaction(); RollBackTransaction();这里就不详细介绍了。
提供一个封装的方法:
/// <summary>
/// 执行事务
/// </summary>
/// <param name="fun"></param>
/// <returns></returns>
public bool DoTransaction(Func<bool> fun)
{
Instance().BeginTransaction();
try
{
bool result = fun();
if (result)
{
Instance().CommitTransaction();
}
else
{
Instance().RollBackTransaction();
}
return result;
}
catch (Exception ex)
{
Instance().RollBackTransaction();
throw;
}
finally
{
}
}
参考:http://www.cnblogs.com/caoyc/category/873268.html
Ibatis.Net 数据库操作学习(四)的更多相关文章
- Java数据库操作学习
JDBC是java和数据库的连接,是一种规范,提供java程序与数据库的连接接口,使用户不用在意具体的数据库.JDBC类型:类型1-JDBC-ODBC桥类型2-本地API驱动类型3-网络协议驱动类型4 ...
- c# 数据库操作学习
一. 如何处理数据库连接 1. 数据库连接可以分为“物理连接”和“逻辑连接”(默认使用连接池的情况下Pooling=true): 物理连接:创建数据库连接时,默认会有一定数量的物理连接(默认Min P ...
- Hapi+MySql项目实战数据库操作(四)
数据库访问 下面以Node的ORM框架Sequelize来操作数据库,Mysql为例. 配置数据库连接信息config/db_config.js: //db_config.js module.expo ...
- Ibatis.Net 数据库操作(四)
一.查询select 还记得第一篇示例中的是如何读出数据库里的3条数据吗? 就是调用了一个QueryForList方法,从方法名就知道,查询返回列表. 1.QueryForList 返回List< ...
- 【转】Mybatis/Ibatis,数据库操作的返回值
该问题,我百度了下,根本没发现什么有价值的文章:还是看源代码(详见最后附录)中的注释,最有效了!insert,返回值是:新插入行的主键(primary key):需要包含<selectKey&g ...
- 【转】 Mybatis/Ibatis,数据库操作的返回值
该问题,我百度了下,根本没发现什么有价值的文章:还是看源代码(详见最后附录)中的注释,最有效了!insert,返回值是:新插入行的主键(primary key):需要包含<selectKey&g ...
- Mybatis/Ibatis,数据库操作的返回值
该问题,我百度了下,根本没发现什么有价值的文章:还是看源代码(详见最后附录)中的注释,最有效了!insert,返回值是:新插入行的主键(primary key):需要包含<selectKey&g ...
- Oracle 数据库基础学习 (四) group by的使用
group by分组查询 示例:要求查询出每个部门的编号,人数,以及最高和最低工资 select deptno, count(empno), max(sal), min(sal) from em ...
- C# SQLite 数据库操作
C# SQLite 数据库操作学习 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0 参考: SQLite 官网 SQL As Understood By SQL ...
随机推荐
- Windows 2019 激活教程
Study From https://blog.csdn.net/cssxn/article/details/83743662 1. 原文里面提到了 几个序列号 Windows Server Data ...
- jsonp 接口
一.请求接口 <script type="text/javascript" src="js/jquery.min.js"></script&g ...
- poj2082 Terrible Sets(单调栈)
Description Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all re ...
- Good Bye 2018 没打记
场外选手赛时只口胡出了CD感觉非常惨.只看了E并且还没看到题面里的wiki我能咋办 C:f只与gcd(n,k)有关. D:考虑每种起始位置,对于跨越的两个排列,只有前一个排列的后缀单减时不产生贡献.答 ...
- BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...
- MT【185】$\max$的表示
已知$f(x)=x^2+(a-4)x+1+|x^2-ax+1|$的最小值为$\dfrac{1}{2}$,则$a$=______ 提示:$f(x)=\max\{2(x-1)^2,2(a-2)x\}$,从 ...
- CentOS安装git及使用Gitolite来管理版本库
首先吐槽一下网上的各种教程,大部分都扯蛋,估计都是些所谓的"编辑"在网上瞎抄来的-- 以下内容都是基于CentOS的服务器端,Mac OS X的客户端. 如果是使用的Windows ...
- JAVA AES CBC PKCS5Padding加解密
package com.hzxc.groupactivity.util; /** * Created by hdwang on 2019/1/17. */ import org.slf4j.Logge ...
- bzoj 4464 : [Jsoi2013]旅行时的困惑
网络流建图. 从S向每个点连边,从每个点向T连边. 每条树边反向连一条下界为1,上界inf的边. 跑最小流. 注意加当前弧优化. #include<cstdio> #include< ...
- c++桥接模式
可以简记为pointer to implement:”指向实现的指针”. [DP]书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化.考虑装操作系统,有多种配置的计算机,同样也有多款操作系 ...