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 表连接查询学习(五)的更多相关文章

  1. IBatis.Net 表连接查询(五)

    IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...

  2. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  3. 5月10日 python学习总结 单表查询 和 多表连接查询

    一. 单表查询  一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...

  4. Mysql表连接查询

    原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...

  5. MyBatis数据持久化(七)多表连接查询

    本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的.例如我们有两张表,分别为用户表Us ...

  6. MybatisPlus多表连接查询

    一.序言 (一)背景内容 软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题.时 ...

  7. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  8. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  9. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

随机推荐

  1. ci test

    下载ci 版本 3.1.9 下载地址 https://www.codeigniter.com/ 怎么查看CI的版本信息?想看某个项目中使用的CI具体是哪个版本,怎么查看?system\core\cod ...

  2. Linux命令(二十三) 磁盘管理命令(一) df,du,tune2fs

    一. 查看磁盘占用空间情况 df df 命令用于查看硬盘空间的使用情况,还可以查看硬盘分区的类型或 inode 节点的使用情况等. df 命令常用参数如下: -a 显示所有文件系统的磁盘使用情况,包括 ...

  3. Java Servlet开发的轻量级MVC框架最佳实践

    在Servlet开发的工程实践中,为了减少过多的业务Servlet编写,会采用构建公共Servlet的方式,通过反射来搭建轻量级的MVC框架,从而加快应用开发. 关于Servlet开发的基础知识,请看 ...

  4. Spring MVC的路径匹配规则 Ant-style

    Spring默认的策略实现了 org.springframework.util.AntPathMatcher,即Apache Ant的样式路径,Apache Ant样式的路径有三种通配符匹配方法(在下 ...

  5. asp.net使用动态模版导出word

    具体思路: 1.先制作Word模版,使用文本框+书签的方式来设计模版: 2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件: 3.后台取得数据,参照网页渲染的方 ...

  6. 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  7. BZOJ2423 HAOI2010最长公共子序列(动态规划)

    大讨论.注意去重. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...

  8. (转)CS0016: 未能写入输出文件

    转自:http://www.pageadmin.net/article/20130305/537.html 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息 ...

  9. 【CF912E】Prime Game(meet in the middle)

    [CF912E]Prime Game(meet in the middle) 题面 CF 懒得翻译了. 题解 一眼题. \(meet\ in\ the\ middle\)分别爆算所有可行的两组质数,然 ...

  10. 【hdu3709】 Balanced Number

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 (题目链接) 题意 求范围${[a,b]}$之间的平衡数的个数,所谓平衡数就是以某一位为支点,两侧的力矩相 ...