Ibatis.Net 表连接查询学习(五)
IBatis.Net之多表查询
一、定制实际对应类的方式
首先配置多表的测试数据库,在之前Person表中增加一列"CountryId",新建一张Country表,两张表关系如下:

建立一个Model类:
public class PersonCountryModel
{
public int Id { get; set; } public string Name { get; set; } public string CountryName { get; set; }
}
在bin\Debug下建立一个PersonCountry.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance"> <resultMaps>
<resultMap id="PersonCountry" Class="PersonCountry">
<!--id会被statements节点所用,Class 实体类所在位置,这里使用别名-->
<result property="Id" column="Id"/>
<!--property实体类的属性名,column对应的列名-->
<result property="Name" column="Name"/>
<result property="CountryName" column="CountryName"/>
</resultMap>
</resultMaps> <statements>
<select id="SelectAllPersonWithCountry" resultMap="PersonCountry">
SELECT p.Id,p.Name,c.CountryName FROM Person p INNER JOIN Country c ON p.CountryId = c.CountryId
</select>
</statements> </sqlMap>
SqlMap.config:
<alias>
<!--为类指定一个别名-->
<typeAlias alias="Person" type="IbatisNetModel.PersonModel,IbatisNetModel"/>
<typeAlias alias="PersonCountry" type="IbatisNetModel.PersonCountryModel,IbatisNetModel"/>
</alias> <sqlMaps>
<!--这个是指定映射文件的位置-->
<sqlMap resource="Person.xml" />
<sqlMap resource="PersonCountry.xml" />
</sqlMaps>
在PersonDAO类下添加方法:
public IList<PersonCountryModel> GetList()
{
IList<PersonCountryModel> ListPC = mapper.QueryForList<PersonCountryModel>("SelectAllPersonWithCountry", null);
return ListPC;
}
Main:
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); IList<PersonCountryModel> ListPC = dao.GetList();
foreach (PersonCountryModel p in ListPC)
{
Console.WriteLine(p.Id + p.Name + p.CountryName);
}
Console.ReadKey();
}
输出如下:

二、AS转换的方式
我们还是用同样的例子。但是,这次我们只想查Person.Id与CountryName。那么这次不用定制类的方式,应该怎样弄呢?
<resultMaps>
<resultMap id="PersonModel" Class="Person">
<!--id会被statements节点所用,Class 实体类所在位置-->
<result property="Id" column="Id"/>
<!--property实体类的属性名,column对应的列名-->
<result property="Name" column="Name"/>
</resultMap>
</resultMaps>
<statements>
<select id="SelectPersonWithCountryName" ResultMap="Person">
SELECT Person.Id,Country.CountryName AS Name FROM Person INNER JOIN Country ON Person.CountryId = Country.CountryId
</select>
</statements>
我们依旧使用Person类,Person还是与Person表对应,只有两个字段,Id和Name,不用特别定制。
这里的例子较为简单,因为CountryName和Name都是字符串类型。如果复杂点,可能在写SQL语句的时候需要使用SQL函数转换类型,例如要查询的列是整型,但是能够接收返回结果的只有浮点型或字符串类型,这个时候就只有在SQL中转换类型了。但如果想查的是DateTime类型,能用于接收结果的属性只有int,那就没办法转了,只有定制对应类。
三、关联实体类
这次我们想查询Person,Country所有的信息
在Person类中加入一个CountryModel类型的属性Country:
public class PersonModel
{
public int PersonId { get; set; }
public string PersonName { get; set; }
//在Person之中加入一个CountryModel
public CountryModel Country { get; set; }
}
xml配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="PersonCountry" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance"> <resultMaps>
<resultMap id="PersonModel" Class="Person">
<result property="PersonId" column="Id"/>
<result property="PersonName" column="Name"/>
<result property="Country" resultMapping="PersonCountry.CountryModel"/>
<!--PersonCountry是关联类所在xml文件的namespace,Country是下面resultMap的id-->
</resultMap>
<resultMap id="CountryModel" Class="Country">
<result property="CountryId" column="CountryId"/>
<result property="CountryName" column="CountryName"/>
</resultMap>
</resultMaps> <statements>
<select id="SelectPersonWithCountryName" resultMap="PersonModel">
SELECT * FROM Person INNER JOIN Country ON Person.CountryId = Country.CountryId
</select>
</statements> </sqlMap>
在PersonDAO类下添加方法:
public IList<PersonModel> SelectPersonWithCountryName()
{
IList<PersonModel> ListPC = mapper.QueryForList<PersonModel>("SelectPersonWithCountryName", null);
return ListPC;
}
Main:
static void Main(string[] args)
{
PersonDAO dao = new PersonDAO(); IList<PersonModel> ListPC = dao.SelectPersonWithCountryName();
foreach (PersonModel p in ListPC)
{
Console.WriteLine(p.PersonId + p.PersonName + p.Country.CountryName);
}
Console.ReadKey();
}
输出结果:

参考:http://www.cnblogs.com/caoyc/category/873268.html
Ibatis.Net 表连接查询学习(五)的更多相关文章
- IBatis.Net 表连接查询(五)
IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- 5月10日 python学习总结 单表查询 和 多表连接查询
一. 单表查询 一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
- MyBatis数据持久化(七)多表连接查询
本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的.例如我们有两张表,分别为用户表Us ...
- MybatisPlus多表连接查询
一.序言 (一)背景内容 软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题.时 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
随机推荐
- Vue项目框架
Vue项目框架 基本组件的使用: new Vue({ el, //要绑定的DOM element data, //要绑定的资料 props, //可用来接收父原件资料的属性 template, //要 ...
- mybatis之一对一关联
MapperAsso.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper ...
- 一本通1656Combination
1656:Combination 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] 原题来自:BZOJ 2982 LMZ 有 n 个不同的基友,他每天晚上要选 ...
- MT【182】系数奇怪的二次函数
设函数$f(x)=3ax^2-2(a+b)x+b,$其中$a>0,b\in R$证明:当$0\le x\le 1$时,$|f(x)|\le \max\{f(0),f(1)\}$ 分析:由$a&g ...
- MT【112】单变量化
评:降维,单变量是我们不懈的追求
- MT【103】二阶递推找规律
评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- 【bzoj1089】严格n元树
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严格 ...
- 【BZOJ4870】组合数问题(动态规划,矩阵快速幂)
[BZOJ4870]组合数问题(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 显然直接算是没法做的.但是要求的东西的和就是从\(nk\)个物品中选出模\(k\)意义下恰好\(r\)个物品的方案数 ...
- 解题:HNOI 2015 开店
题面 根据树上距离的计算方法,可以先把答案化成$\sum dep_i+n*dep_u-\sum 2*dep[LCA(i,u)]$的形式,然后维护$\sum 2*dep[LCA(i,u)]$ 把妖怪们按 ...