基于ORM技术的面向对象数据与关系型数据交互问题的研究
2017-04-26张磊
张磊
摘要:随着计算机技术的发展,在应用领域,越爱越多的应用技术要接触到大数据,在PB级数据面前,传统关系型数据库的问题逐渐凸显出来。随着而来的面向对象数据库应运而生。针对面向对象数据与关系型数据之间的信息交互问题,该文分析了如何利用ORM技术实现面向对象数据与关系型数据之间的信息交互,并举例说明。
关键词:面向对象数据;ORM;关系型数据;应用
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)06-0144-02
1 概述
随着计算机技术的发展,在應用领域,越来越多的应用技术要接触到大数据。在PB级数据的面前,传统的关系型数据库的问题越来越多地被暴露了出来。效率低下、可扩展性差、使用复杂以及与当下流行的面向对象技术不适应等等问题。
在大数据时代下,面向对象数据库得到了广泛的应用。面向对象数据库与生俱来就与当下流程面向对象技术相辅相成,在设计之初,就已经考虑到大数据所带来的性能消耗问题。所以在大数据面前,面向对象数据库具有较大的优势。[1]
但是由于传统关系型数据库在过去很长的一段时间当中,都占领了数据库市场的绝大部分份额。即使在当下大数据时代,市面上大部分系统所用的数据库也都为关系型数据库。比如Oracle、SQL Server、MySQL、DB2等传统关系型数据库。由于新老数据技术的交替所带来的问题也就油然而生,最主要的问题之一就是传统关系型数据库中的数据与面向对象型数据库的数据之间的交互问题。[2]这个问题是一个另广大开发人员头痛的问题,由于每个系统的业务逻辑不同,没有一个通用的解决方案,所以一般关系型数据与面向对象数据进行数据交互都是特定问题特定分析。这种解决方式不仅仅适用于单独系统,不具备通用性,而且更多的是为企业带来开发成本提高,开发效率下降等现实问题。
2 面向对象型数据库与关系型数据库中数据的特点
面向对象型数据库是基于面向对象技术发展起来的,面向对象技术的核心观点是“世间万物皆为对象”,其中对象是一个核心概念,任何一个事物都被认为是一个对象而存在,比如桌子是一个对象,它存在材质、大小、颜色、价格等属性,可以用于书写、吃饭、游戏等方法,多个桌子即可以表示为桌子对象数组。将同一类具有相同的属性和方法的事物用类的方式封装起来,在面向对象技术中,类还可以被继承,利用继承的方式实现对象属性和方法的重用,模拟现实世界中复杂的事物行为。这种设计方式最显著的特点就是事物与事物之间的关联性最大程度的降低,即低耦合,事物间的关联性降低,数据与代码之间的关联性降低对于存储而言更加轻松方便。面向对象型数据库就是将这些事物以对象的形式存起来,所以面向对象型数据库的存储基本单元可以认为是对象。
而关系型数据库中的数据是传统的矩阵的形式即行与列,但是现实世界的事物很难全部都用简单的行与列来表示。即使表示出来,也是用了非常复杂的数据结构进行表示。[3]比如表与表之间的具有多对多、一对一、一对多等多种情况,这种复杂的表示方式带来的问题就是难以解析,尤其在大数据面前,即使每条数据的解析时间相差毫秒级,在PB级的数据面前性能消耗也是开发人员承担不起的。
3 利用ORM技术实现对象化数据与关系型数据之间的交互应用
ORM(Object Relation Mapping),即对象关系映射,是用来把对象模型表示的对象映射到基于SQL的关系模型数据结构当中。这种技术可以让开发人员只关心对象即可,不需要操作复杂的SQL语句。相反的,将利用SQL语句从关系型数据库当中取出来的数据转变为对象,开发人员也是可以直接利用对象来进行业务层的业务逻辑运算即可。
以关系型数据表1为例:
books表为图书表,表中有如下字段,bookid书序列、title书名、isbn、author作者、unitprice单价、ctgcode书类别。非常简单的一种关系型数据表结构。在面向对象的世界中,可以将books表定义为books对象,其中有bookid、title、isbn、author、unitprice、ctgcode属性以及相应的get、set方法。建立books对象代码如下:
publicclass Books {
private Long bookid;
private String title;
private String isbn;
private String author;
private Double unitprice;
private String ctgcode;
public Long getBookid() {
returnbookid;}
publicvoid setBookid(Long bookid) {
this.bookid = bookid;}
public String getTitle() {
returntitle;}
publicvoid setTitle(String title) {
this.title = title;}
public String getIsbn() {
returnisbn;}
publicvoid setIsbn(String isbn) {
this.isbn = isbn;}
public String getAuthor() {
returnauthor;}
publicvoid setAuthor(String author) {
this.author = author;}
public Double getUnitprice() {
returnunitprice;}
publicvoid setUnitprice(Double unitprice) {
this.unitprice = unitprice;}
public String getCtgcode() {
returnctgcode;}
publicvoid setCtgcode(String ctgcode) {
this.ctgcode = ctgcode;}}
以關系型数据库MySQL为例,将books表中的关系型数据转换为Books对象。其代码如下:
List
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/booksale?user=root&password=111111&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String query = "select * from books";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
Books book=new Books();
Long bookid = rs.getLong("bookid");
book.setBookid(bookid);
String title = rs.getString("title");
book.setTitle(title);
String isbn = rs.getString("isbn");
book.setIsbn(isbn);
String author = rs.getString("author");
book.setAuthor(author);
Double unitprice = rs.getDouble("unitprice");
book.setUnitprice(unitprice);
String ctgcode = rs.getString("ctgcode");
book.setCtgcode(ctgcode);
list.add(book);}
} catch (Exception e) {
e.printStackTrace();}
利用Java的JDBC技术连接MySQL数据库,取出books表的数据,将字段值通过set方法放到Books对象中。由于一张表中一般不可能只有一条数据,但是在面向对象当中Books对象只代表一个对象,对应到数据库当中即一条数据。所以在程序中加入List数组,数组里的元素是Books对象。
4 结论
基于ORM技术的面向对象数据与关系型数据之间的信息交互问题,在实际应用中,往往不会如此简单,由于数据交互的信息量比较大。一般在开发当中,代码在编写时都是以数据库字段未知,对象属性未知的情况下编写。这种编写方式才可以使代码更加通用,相应的数据库字段,对象属性等信息通过XML配置文件或者是注解标记等方式告知程序。在Java代码中会以反射技术去开发这方面代码,比如当下比较流行的Hibernate,MyBatis等框架都是基于此开发的。
参考文献:
[1] 柴晟. 数据库技术发展的新方向——面向对象的数据库系统[J].成都航空职业技术学院学报,2013(4).
[2] 杨玉芬.李明明.高晓旸.对象管理在面向对象数据库中的应用研究[J].吉林大学学报,2013(9).
[3] 应建. 面向对象的数据库技术研究[J].电脑知识与技术,2011(6).