Db4o数据库:细说查询[通俗易懂]

Db4o数据库:细说查询[通俗易懂]通过第一篇的介绍,相信大家也对Db4o有一定的了解,接下来就详细说一下有关查询的话题。Db4o原生支持3中查询模式:Query-By-Example:简称QBE,根据模板类进行匹配查询,这是最简单的一种模式NativeQuery:简称NQ,Db4o推荐的查询模式TheSODAAPI:这是Db4o底层查询API,官网文档解释,此API提供向后的兼容性,适用于动态

大家好,又见面了,我是你们的朋友全栈君。

通过第一篇的介绍,相信大家也对Db4o有一定的了解,接下来就详细说一下有关查询的话题。

Db4o原生支持3中查询模式:

  • Query-By-Example: 简称 QBE ,根据模板类进行匹配查询,这是最简单的一种模式
  • Native Query: 简称 NQ ,Db4o推荐的查询模式
  • The SODA API :这是Db4o底层查询API ,官网文档解释,此API提供向后的兼容性,适用于动态生成的查询
此外,.Net平台还可以通过LINQ进行快速的查询。

准备测试数据


下面给出一个职工类

	/// <summary>
	/// 职工
	/// </summary>
	class Employee
	{
		/// <summary>
		/// 姓名
		/// </summary>
		string _name;
		public string Name
		{
			set { _name = value; }
			get { return _name; }
		}

		/// <summary>
		/// 职位
		/// </summary>
		public Position Position { get; set; }

		public override string ToString()
		{
			return string.Format("姓名:{0},职位:{1}",this.Name,this.Position.PositionName);
		}
	}

	/// <summary>
	/// 职位
	/// </summary>
	class Position
	{
		/// <summary>
		/// 职称
		/// </summary>
		public string PositionName { get; set; }
	}

填充测试数据

		static List<Employee> GetEmployee()
		{
			List<Employee> _Employees = new List<Employee>();
			Employee _Employee = new Employee { Name = "Sunth", Position = new Position { PositionName = "CEO" } };
			_Employees.Add(_Employee);
			_Employee = new Employee { Name = "Jerry", Position = new Position { PositionName = "CTO" } };
			_Employees.Add(_Employee);
			_Employee = new Employee { Name = "Tom", Position = new Position { PositionName = "COO" } };
			_Employees.Add(_Employee);
			return _Employees;
		}

Query-By-Example


一种非常简单直观的查询方式,通过模板进行对比查询,比如说查一个名为Sunth的职工信息

		static void Main(string[] args)
		{
			string DbPath = "Pilot.yap";
			if (File.Exists(DbPath))
				File.Delete(DbPath);
			using (IObjectContainer Container = Db4oEmbedded.OpenFile(DbPath))
			{
				//对数据库进行初始化,并存入测试数据
				var Query = GetEmployee();
				Query.ForEach
					(
						(a) => { Container.Store(a); }
					);

				//查询一个叫做Sunth的职工
				Employee _Employee = new Employee();
				_Employee.Name = "Sunth";
				IObjectSet Result = Container.QueryByExample(_Employee);
				//打印结果
				PrintResult(Result);
			}
			Console.ReadKey();
		}
大家是否明白了QueryByExample()这个方法名的含义,根据你所给出指定类型的模板,Db4o进行属性值匹配查询。如果模板中属性被没有赋值,Db4o自动取默认值当做条件。如果想查询所有匹配此类型的数据,只需要实例化一个Employee对象,当做参数,传入就OK。
这种方法虽然很简单,但是它有很大的局限性,比如你不能直接使用 and , or ,like 等操作

NativeQuery


这是Db4o推荐的查询方式,但在.Net平台还是比较推荐使用LINQ的。还是那个例子,查询一个名为Sunth的职工信息
		static void Main(string[] args)
		{
			string DbPath = "Pilot.yap";
			if (File.Exists(DbPath))
				File.Delete(DbPath);
			using (IObjectContainer Container = Db4oEmbedded.OpenFile(DbPath))
			{
				//对数据库进行初始化,并存入测试数据
				var Query = GetEmployee();
				Query.ForEach
					(
						(a) => { Container.Store(a); }
					);

				//查询一个叫做Sunth的职工
				Employee _Employee = new Employee();
				var Result = Container.Query<Employee>
					(
						delegate(Employee employee)
						{
							return employee.Name == "Sunth";
						}
					);
				//打印结果
				PrintResult(Result);
			}
			Console.ReadKey();
		}
这样是不是灵活性更高点了呢。

The SODA API


Db4o底层的查询方式,使用便捷度肯定不如前两种,但是了解是必须的,当遇到不可解决的问题时,这可能就是一思路。
查询一个名为Sunth的职工信息,具体的注释请看代码

		static void Main(string[] args)
		{
			string DbPath = "Pilot.yap";
			if (File.Exists(DbPath))
				File.Delete(DbPath);
			using (IObjectContainer Container = Db4oEmbedded.OpenFile(DbPath))
			{
				//对数据库进行初始化,并存入测试数据
				var Query = GetEmployee();
				Query.ForEach
					(
						(a) => { Container.Store(a); }
					);

				//查询一个叫做Sunth的职工
				IQuery _IQuery = Container.Query();
				//强制约束Employee类型
				_IQuery.Constrain(typeof(Employee));
				//注意此“_name”为字段名称,非属性名称
				_IQuery.Descend("_name").Constrain("Sunth");
				//执行查询
				IObjectSet Result = _IQuery.Execute();
				//打印结果
				PrintResult(Result);
			}
			Console.ReadKey();
		}

结束语


说了Db4o原生支持的查询方式,而这些是最基本的,在以后的文章里,我们必定会用到更加繁琐的查询。
刚开始写系列文章,在语言组织方面还是一大缺陷,请大家多多原谅,祝大家生活幸福。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162575.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android hybrid_android混合开发

    Android hybrid_android混合开发关于混合开发常问道的问题:Android如何嵌套h5页面?h5一般调用哪些Android哪些接口功能?Android如何调用网页(js)功能?问题1.ndroid如何嵌套h5页面答案:当我们用vue开发完项目,执行nmprunbuild打包生产dist目录,如何嵌套在Android框架中创建网页存放文件夹,在Android工程res下面添加assets文件夹,把dist目录内容拷贝到assets下。找到Android项目中.xml布局文件,添加webview组件及设置web

    2022年9月22日
    0
  • Java解析XML文件的四种方法「建议收藏」

    Java解析XML文件的四种方法「建议收藏」【摘要】可扩展标志语言(XML)在实现信息标准化、信息的交流与共享上有其独特的技术优势,因此受到了广泛的重视。本文先简单的介绍了XML基本知识,然后从XML应用入手总结了四种现今最常见的XML的解析方法,介绍了这四种方法的特点,其中包括优点与不足之处。最后给出了一个简单的案例来对这四种解析进行代码介绍。【关键字】XML文件,DOM,SAX,JDOM,DOM4J【引言】XML即可扩展标记语

    2022年6月3日
    45
  • 手撕包菜_handlecpuacceleration

    手撕包菜_handlecpuaccelerationLinkedHashSet能够维护元素插入集合的顺序,在遍历时,按照此顺序进行遍历。LinkedHashSet继承了HashSet类,实现了Set等接口。LinkedHashSet仍然支持null元素,唯一有所区别的是在迭代时,它能够按照元素的插入顺序遍历。LinkedHashSet的实现非常简单,它仅仅只重新实现了构造方法,将HashSet内部维护的HashMap…

    2022年10月12日
    0
  • 怎么设置ie兼容性视图设置_ie浏览器兼容性视图怎么设置

    怎么设置ie兼容性视图设置_ie浏览器兼容性视图怎么设置【关键词】:IE兼容性视图【适用版本】:FusionAccess各版本【故障模式】:兼容性/应用软件兼容性【问题现象】:通过域策略和用户配置文件,设定IE的兼容性视图后,新发放虚拟机兼容性视图设置没有效果兼容性视图设置界面:工具->兼容性视图设置域策略配置界面:【告警信息】:无【问题分析】:通过processmonitor抓取IE兼容性视图设置更改的注册表项,通过脚本导入到当前登录用户…

    2022年9月8日
    0
  • 光电编码器工作原理[通俗易懂]

    光电编码器工作原理[通俗易懂]光电编码器工作原理点击打开链接根据原理的不同又可分为:增量型、绝对型和混合式增量型。光电编码器的主要工作原理为光电转换,是一种通过光电转换将输出轴的机械几何位移量转换为脉冲或数字量的传感器。光电编码器主要由光栅盘和光电检测装置构成,在伺服系统中,光栅盘与电动机同轴致使电动机的旋转带动光栅盘的旋转,再经光电检测装置输出若干个脉冲信号,根据该信号的每秒脉冲数便可计算当前电动机的转速

    2022年9月26日
    0
  • 病毒***的判断

    病毒***的判断

    2021年8月4日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号