IBatis.Net之多表查询:

一、定制实际对应类的方式

  首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置:

  首先新建两张表如下:

  

  

  为两张表建立外键:

  1. ALTER TABLE Person
  2.   ADD CONSTRAINT FK_COUNTRY_PERSON FOREIGN KEY(CountryId)
  3.   REFERENCES Country(Id);

  程序中,建立一个PersonCountry.xml

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
  3. <resultMaps>
  4. <resultMap id="PersonCountry" Class="Ibatis.Net.Domain.PersonCountryModel"> <!--id会被statements节点所用,Class实体类所在位置-->
  5. <result property="Id" column="ID"/> <!--property实体类的属性名,column对应的列名-->
  6. <result property="Name" column="NAME"/>
  7. <result property="CountryName" column="COUNTRYNAME"/>
  8. </resultMap>
  9. </resultMaps>
  10. <statements>
  11. <select id="SelectAllPersonWithCountry" resultMap="PersonCountry">
  12. SELECT p.Id,p.Name,c.CountryName FROM Person p INNER JOIN Country c ON p.CountryId = c.Id
  13. </select>
  14. </statements>
  15. </sqlMap>

  再建立一个对应结果的Model类

  1. namespace Ibatis.Net.Domain
  2. {
  3. public class PersonCountryModel
  4. {
  5. public int Id { get; set; }
  6.     public string Name { get; set; }
  7.      public string CountryName { get; set; }
  8. }
  9. }

  建立一个Dao类:

  1. public class PersonCountryDao
  2. {
  3. public IList<PersonCountryModel> GetList()
  4. {
  5. ISqlMapper mapper = Mapper.Instance();
  6. IList<PersonCountryModel> ListPC = mapper.QueryForList<PersonCountryModel>("SelectAllPersonWithCountry", null);
  7. return ListPC;
  8. }
  9. }

  执行代码:

  1. static void Main(string[] args)
  2. {
  3. PersonCountryDao dao = new PersonCountryDao();
  4. IList<PersonCountryModel> ListPC = dao.GetList();
  5. foreach (PersonCountryModel p in ListPC)
  6. {
  7. Console.WriteLine(p.Id + p.Name + p.CountryName);
  8. }
  9. Console.ReadKey();
  10. }

  输出如下:

  

二、AS转换的方式

  下面,我们还是用同样的例子。但是,这次我只想查Person.Id与CountryName。那么这次不用定制类的方式,应该怎样弄呢?

  Person.xml如下:

  1. <sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
  2. <resultMaps>
  3. <resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel"> <!--id会被statements节点所用,Class实体类所在位置-->
  4. <result property="Id" column="Id"/> <!--property实体类的属性名,column对应的列名-->
  5. <result property="Name" column="Name"/>
  6. </resultMap>
  7. </resultMaps>
  8. <statements>
  9. <select id="SelectPersonWithCountryName" ResultMap="Person">
  10. SELECT Person.Id,CountryName AS Name FROM Person INNER JOIN Country ON Person.CountryId = Country.Id
  11. </select>
  12. </statements>
  13. </sqlMap>

  注意此时的Person还是与Person表对应,只有两个字段,Id和Name,不用特别定制。

  输出如下:

  

  这里的例子较为简单,因为CountryName和Name都是字符串类型。如果复杂点,可能在写SQL语句的时候需要使用SQL函数转换类型,例如要查询的列是整型,但是能够接收返回结果的只有浮点型或字符串类型,这个时候就只有在SQL中转换类型了。但如果想查的是DateTime类型,能用于接收结果的属性只有int,那就没办法转了,只有定制对应类。

三、关联实体类

  其实IBatis.net也支持NHibernate的那种方式,实体类关联的方式来支持表与表之间的关系:

  如,这次我想查询Person,Country所有的信息:

  1. public class PersonModel
  2. {
  3. public int Id
  4. {
  5. get;
  6. set;
  7. }
  8.  
  9. public string Name
  10. {
  11. get;
  12. set;
  13. }
  14.      //在Person之中加入一个CountryModel
  15. public CountryModel Country
  16. {
  17. get;
  18. set;
  19. }
  20. }

  配置文件:

  1. <sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
  2. <resultMaps>
  3. <resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel">
  4. <result property="Id" column="Id"/>
  5. <result property="Name" column="Name"/>
  6. <result property="Country" resultMapping="Ibatis.Country"/><!--Ibatis是关联类所在xml文件的namespace,Country是下两行的那个id-->
  7. </resultMap>
  8. <resultMap id="Country" Class="Ibatis.Net.Domain.CountryModel">
  9. <result property="Id" column="Id"/>
  10. <result property="CountryName" column="CountryName"/>
  11. </resultMap>
  12. </resultMaps>
  13. <statements>
  14. <select id="SelectPersonWithCountryName" resultMap="Person">
  15. SELECT * FROM Person INNER JOIN Country ON Person.CountryId = Country.Id
  16. </select>
  17. </statements>
  18. </sqlMap>

  运行输出如下:

  

 
原文地址:http://www.cnblogs.com/kissdodog/p/3302619.html
 

IBatis.Net 表连接查询(五)的更多相关文章

  1. Ibatis.Net 表连接查询学习(五)

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

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

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

  3. Mysql表连接查询

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

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

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

  5. MybatisPlus多表连接查询

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

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

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

  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. hdu3124Arbiter(最小圆距离-扫描线)

    链接 详解http://blog.sina.com.cn/s/blog_6e7b12310100qnex.html #include <iostream> #include<cstd ...

  2. Python学习笔记13—错误和异常

    常见的异常:

  3. [Hibernate] - EAGER and LAZY

    Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZY Eager:全部抓取 Lazy:延迟抓取 如果在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关 ...

  4. ie、火狐、谷歌浏览器,光标定位问题

    IE:不管该行有没有文字,光标高度与font-size一致. FF:该行有文字时,光标高度与font-size一致.该行无文字时,光标高度与input的height一致. Chrome:该行无文字时, ...

  5. MM中如何更改物料的评估类

    在SAP MM模块中,一物料XXX ,由原来的外购,变成厂内自制:评估类也由原来的7901 改为:7900 : 注:物料的评估类,对应一些帐号,对发生的为业,产生的数据,记录在相对的帐号里: 如要更改 ...

  6. RESEACH PAPER

      个,proquest的username和password赫然在目,别急,再看第4个结 果"HB Thompson Subscription Online Databases", ...

  7. HTML5自学笔记[ 18 ]canvas绘图基础5

    获取图像数据:getImgData(x,y,w,h),返回的是一个ImageData对象,这个对象有三个属性保存图像信息:width/height/data.data是一个数组,保存了每个像素的信息, ...

  8. 如何使用java调用DLL运行C++(初篇)

    JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图:

  9. javaSE之如何将一个文件复制到另一个文件

    /* * (1). 文件字符输入,输出流 * 文件字节输入,输出流的read和write方法使用 * 字节数组读写数据,即以字节为单位处理数据,因此,字节流不能很好的操作Unicode字符 * ,比如 ...

  10. file类之目录

    可以解决的问题是:                有时需要列出目录下指定类型的文件,比如java,txt等扩展名的文件,可以使用File类的下述两个方法,列出指定类型的文件. /* file类实现两个 ...