IBatis.Net 表连接查询(五)
IBatis.Net之多表查询:
一、定制实际对应类的方式
首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置:
首先新建两张表如下:


为两张表建立外键:
ALTER TABLE Person
ADD CONSTRAINT FK_COUNTRY_PERSON FOREIGN KEY(CountryId)
REFERENCES Country(Id);
程序中,建立一个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="Ibatis.Net.Domain.PersonCountryModel"> <!--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.Id
</select>
</statements>
</sqlMap>
再建立一个对应结果的Model类
namespace Ibatis.Net.Domain
{
public class PersonCountryModel
{
public int Id { get; set; }
public string Name { get; set; }
public string CountryName { get; set; }
}
}
建立一个Dao类:
public class PersonCountryDao
{
public IList<PersonCountryModel> GetList()
{
ISqlMapper mapper = Mapper.Instance();
IList<PersonCountryModel> ListPC = mapper.QueryForList<PersonCountryModel>("SelectAllPersonWithCountry", null);
return ListPC;
}
}
执行代码:
static void Main(string[] args)
{
PersonCountryDao dao = new PersonCountryDao();
IList<PersonCountryModel> ListPC = dao.GetList();
foreach (PersonCountryModel p in ListPC)
{
Console.WriteLine(p.Id + p.Name + p.CountryName);
}
Console.ReadKey();
}
输出如下:

二、AS转换的方式
下面,我们还是用同样的例子。但是,这次我只想查Person.Id与CountryName。那么这次不用定制类的方式,应该怎样弄呢?
Person.xml如下:
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
<resultMaps>
<resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel"> <!--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,CountryName AS Name FROM Person INNER JOIN Country ON Person.CountryId = Country.Id
</select>
</statements>
</sqlMap>
注意此时的Person还是与Person表对应,只有两个字段,Id和Name,不用特别定制。
输出如下:

这里的例子较为简单,因为CountryName和Name都是字符串类型。如果复杂点,可能在写SQL语句的时候需要使用SQL函数转换类型,例如要查询的列是整型,但是能够接收返回结果的只有浮点型或字符串类型,这个时候就只有在SQL中转换类型了。但如果想查的是DateTime类型,能用于接收结果的属性只有int,那就没办法转了,只有定制对应类。
三、关联实体类
其实IBatis.net也支持NHibernate的那种方式,实体类关联的方式来支持表与表之间的关系:
如,这次我想查询Person,Country所有的信息:
public class PersonModel
{
public int Id
{
get;
set;
} public string Name
{
get;
set;
}
//在Person之中加入一个CountryModel
public CountryModel Country
{
get;
set;
}
}
配置文件:
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
<resultMaps>
<resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel">
<result property="Id" column="Id"/>
<result property="Name" column="Name"/>
<result property="Country" resultMapping="Ibatis.Country"/><!--Ibatis是关联类所在xml文件的namespace,Country是下两行的那个id-->
</resultMap>
<resultMap id="Country" Class="Ibatis.Net.Domain.CountryModel">
<result property="Id" column="Id"/>
<result property="CountryName" column="CountryName"/>
</resultMap>
</resultMaps>
<statements>
<select id="SelectPersonWithCountryName" resultMap="Person">
SELECT * FROM Person INNER JOIN Country ON Person.CountryId = Country.Id
</select>
</statements>
</sqlMap>
运行输出如下:

IBatis.Net 表连接查询(五)的更多相关文章
- Ibatis.Net 表连接查询学习(五)
IBatis.Net之多表查询 一.定制实际对应类的方式 首先配置多表的测试数据库,在之前Person表中增加一列"CountryId",新建一张Country表,两张表关系如下: ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
- MyBatis数据持久化(七)多表连接查询
本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的.例如我们有两张表,分别为用户表Us ...
- MybatisPlus多表连接查询
一.序言 (一)背景内容 软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题.时 ...
- 5月10日 python学习总结 单表查询 和 多表连接查询
一. 单表查询 一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...
- 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(...=...)) --选出雇员的名字和雇员所 ...
随机推荐
- JavaWeb学习总结(十四)--Apache的DBUtils
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- AngularJS中service,factory,provider的区别(转载:http://my.oschina.net/tanweijie/blog/295067)
目录[-] 一.service引导 二.service 1.factory() 2.service() 3.provider() 一.service引导 刚开始学习Angular的时候,经常 ...
- 转!!java泛型概念(泛型类,接口,方法)
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...
- Eclipse 配置Tomcat
1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...
- object-c NSString 转成特定编码格式如utf8、gbk等
有两种方式 第一种是先转换成特定编码格式NSDATA 第二种是先转换成特定编码格式char *(cString) 转成gbk: 第一种: - (NSString *) utf82gbk:(NSStri ...
- program testy data
做项目得用数据吧,拿去.... 1.Data.gov搜索 美国政府去年承诺使所有政府数据都能在网上免费获得.这个网站是第一阶段,作为一个门户网站,囊括了从气候到犯罪的一切惊人的信息. 2. 美 ...
- Cmd Markdown 高阶语法手册
『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 高阶语法手册 1. 内容目录 在段落中填写 [TOC] 以显示全文内容的目录结构. [TOC] 2. 标签分类 在编辑 ...
- IE9以上 CSS文件因Mime类型不匹配而被忽略 其他浏览器及IE8以下显示正常
什么是Mime类型? MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名 ...
- 素定位器(ElementLocators)
元素定位器(ElementLocators)告诉Selenium是向HTML中的哪一个元素发送命令.一个定位器的格式如下:locatorType=argument 我们支持如下写法用于定位元素:ide ...
- 如何使用Retrofit获取服务器返回来的JSON字符串
有关Retrofit的简单集成攻略,大家可以参考我此前的一篇文章有关更多API文档的查阅请大家到Retrofit官网查看. 在大家使用网络请求的时候,往往会出现一种情况:需要在拿到服务器返回来的JSO ...