首页 > 范文大全 > 正文

基于SQLite的Java EE应用研究与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于SQLite的Java EE应用研究与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:文章针对Java EE应用中数据库系统安装部署复杂的难题进行研究,介绍内存数据库产品SQLite的技术特点,并着重研究与Java语言之间的接口,实现Hibernate组件通过JDBC访问SQLite数据库,以解决数据库安装配置繁琐的问题。Java EE便携式应用为市场人员、售前工程师演示、宣传软件产品提供便利,具有极其重要的现实意义。

关键词:Java EE便携式应用;SQLite;Hibernate;JDBC

中文分类号:TP311文献标识码:A文章编号:1009-3044(2011)25-6076-03

Research and Implementation of Jave EE Application Based on SQLite

WANG Zhi-ming1, YING Yi1, REN Kai2

(1.College of Computer Science and Technology, Sanjiang University, Nanjing 210012, China; 2.Nanjing R&D Center, ZTE Corporation, Nanjing 210012, China)

Abstract: Through the research on the complexity of DBMS installation in Java EE application, this article introduces the features of SQLite, and put emphasis on the study of the Java interface with SQLite, realizing Hibernate access SQLite via JDBC as well to solve the problem occurred in the process of installation and deployment. The portable application of Java EE has brought greater significance to the marketing people, demonstration for the engineers and facilities of the products publicity.

Key words: Java EE portable applications; SQLite; Hibernate; JDBC

成功开发一个Java EE应用后,如果需要到Java EE应用服务器,使产品正常运行,在一般情况下至少需要以下步骤:第一,安装JDK;第二,安装应用服务器;第三,安装数据库管理系统;第四,配置与待的Java EE应用相关的DBMS内容;第五,通过应用服务器提供的部署工具完成Java EE应用的。

如此看来,要让Java EE应用能够运行起来步骤很多,而且很烦琐。如果是用于实际应用(比如产品上线),那么这些步骤是不可避免的。但如果只是公司的产品宣传、为市场人员与客户交流提供演示,采用这样一种方式就显得有些多余。

Java EE应用的便携性研究试图解决这样一类问题,使得产品无需安装、部署和配置,只要解压缩即可运行,产品容量尽量小,能够移动存储,方便拷贝,容易启动。其中最困难的是数据库的使用问题。

众所周知,在Java EE应用中,数据库是不可或缺的重要部分,常用的数据库有Oracle、MySQL、SQL Server、DB2等,但这些数据库都是需要安装的,而且体积庞大、应用复杂,非常不适合非专业人员使用。所以需要寻找一个可替代的产品。

1 SQLite简介

SQLite[1]是一个自足的事务型关系数据库引擎,具有零配置、无服务器等特点,它实现了主要的SQL-92标准,引擎本身只有一个文件,大小不到500K,生成的数据库文件是一个普通的磁盘文件,可以放置在任何目录下,最大可以支持2T的数据。SQLite本身是C语言开发的,开源、跨平台、具有良好的可移植性,并且被大多数主流编程语言支持。

因为它很小,所以也可以作为嵌入式主存数据库内建在应用程序中。例如,SQLite被应用在Solaris 10操作系统、Mac OS操作系统、Skype、iPhone和Andriod中。QT4、Python、PHP都默认支持SQLite,Firefox、Amarok等应用程序在内部也使用了SQLite数据库。

基于以上优点,sqlite满足我们免安装零配置的要求,非常适合在java ee便携式应用中使用。

2 SQLite与Hibernate集成

SQLite源代码是C,官方网站上提供了C/C++语言和TCL语言的接口,为了在Java应用程序中使用SQLite,需要采用第三方的Java接口驱动。第三方的接口库中实现了JNI接口和JDBC接口[2-3]。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,JDBC接口规范为Java代码访问数据库提供了极大便利。

Java EE应用中需要数据访问层,Hibernate是不错的选择。Hibernate是一个开源的ORM框架,底层仍旧使用JDBC操作数据库,只要此类数据库JDBC能访问,Hibernate就能访问。

Java代码访问SQLite的主要流程是:首先Java应用程序通过Hibernate调用JDBC API请求数据库连接;然后JDBC驱动程序管理器根据连接请求加载相应的JDBC驱动程序;当驱动程序加载后,它主要负责接收应用程序发出的SQL语句,并进行分析处理,将其传送给SQLite数据库;数据库对SQL语句处理后再将结果送回给JDBC驱动程序;最后JDBC驱动程序将结果按照一定的标准格式返回给应用程序。工作流程如图1所示。

1) 引入jar包

开源项目SQLiteJDBC[4]为我们提供了SQLite数据库的JDBC接口驱动:sqlitejdbc-v056.jar。该版本基于SQLite 3.6.14.2,能支持Windows、Mac OS X、Linux x86三类操作系统,打开该jar包,可以看到包中不仅含有class文件,还有不同lib文件:win-x86.lib、mac-universal.lib、linux-x86.lib、linux-amd64.lib,这就是SQLite在不同平台上的数据库引擎。

要使用sqlitejdbc-v056.jar,需在Java EE项目中将该jar包引入。

2) 配置数据源

hibernate.cfg.xml是Hibernate组件的主配置文件,我们需要在这个文件中配置驱动类、连接方式和Dialect。数据库连接方式的格式为“jdbc:sqlite:path”这里的path为指定到SQLite数据文件的路径。

org.sqlite.JDBC

jdbc:sqlite:path

dialect.SQLiteDialect

我们通常会在项目下建立一个“DBFile”目录,将SQLite的数据文件放置在该目录下,此时connection.url就应该这样配置:

jdbc:sqlite:./DBFile/1.db

3) Hibernate工具类与Dialect

需要写一个Hibernate组件的工具类:HibernateUtil.java,使用单例模式管理Hibernate的Session,以方便应用程序获取和关闭数据库连接。这个工具类是通用的,无论JDBC连接的是什么数据库,其功能和内容都没有本质区别。

由于官方的Hibernate不支持SQLite数据库,所以需要我们自己来写一个Dialect:SQLiteDialect.java,它继承Hibernate的Dialect类,基本原理和Oracle等数据库连接Hibernate一样。Dialect用来映射Java类型和数据库支持类型的匹配。主要的类型匹配代码如下:

registerColumnType(Types.BIT, "integer");

registerColumnType(Types.TINYINT, "tinyint");

registerColumnType(Types.SMALLINT, "smallint");

registerColumnType(Types.INTEGER, "integer");

registerColumnType(Types.BIGINT, "bigint");

registerColumnType(Types.FLOAT, "float");

registerColumnType(Types.REAL, "real");

registerColumnType(Types.DOUBLE, "double");

registerColumnType(Types.NUMERIC, "numeric");

registerColumnType(Types.DECIMAL, "decimal");

registerColumnType(Types.CHAR, "char");

registerColumnType(Types.VARCHAR, "varchar");

registerColumnType(Types.LONGVARCHAR, "longvarchar");

registerColumnType(Types.DATE, "date");

registerColumnType(Types.TIME, "time");

registerColumnType(Types.TIMESTAMP, "timestamp");

registerColumnType(Types.BINARY, "blob");

registerColumnType(Types.VARBINARY, "blob");

registerColumnType(Types.LONGVARBINARY, "blob");

registerColumnType(Types.BLOB, "blob");

registerColumnType(Types.CLOB, "clob");

registerColumnType(Types.BOOLEAN, "integer");

registerFunction("concat", new VarArgsSQLFunction(Hibernate.STRING, "", "||", ""));

registerFunction("mod", new SQLFunctionTemplate(Hibernate.INTEGER, "?1 % ?2"));

registerFunction("substr", new StandardSQLFunction("substr", Hibernate.STRING));

registerFunction("substring", new StandardSQLFunction("substr", Hibernate.STRING));

4) 测试代码

通过一个保存动作,来验证Hibernate对SQLite的操作是否成功。

先按照Hibernate的要求写一个domain对象:User.java、和它的映射文件User.hbm.xml。类User对应着SQLite数据库中的一张表users,这张表主要有两个字段:name和password,还有一个自生成的id字段。

然后写一个JUnit测试用例:TestSaveUser.java,该类主要完成一个保存User对象到SQLite数据库的动作。TestSaveUser.java中的主要代码就是testSave()方法:

public void testSave(){

User user = new User();

user.setName("Tom");

user.setPassword("123456");

Session session = HibernateUtil.getSessionFactory().openSession();

Transaction tx = session.beginTransaction();

session.save(user);

mit();

session.close();

HibernateUtil.shutdown();}

代码首先构造了一个user对象,然后使用Hibernate中Session对象的save方法将user对象保存到数据库中。从这段代码看不出任何数据库的痕迹,即使以后需要变更后台数据库的类型,业务逻辑层的Java代码也不需要做任何修改。这个特点是Java EE分层结构的优势,也是在Java EE中使用Hibernate组件的主要目的之一。

执行这个测试用例,控制台会打印出如下信息:

Hibernate:

insertintousers(name, password)values(?, ?)

表明Hibernate组件执行了一次insert操作。

与保存动作相类似,再写一个select的测试用例:testSelectAll.java。

public void testSelect(){

User user = new User();

String hql = "from model.User as user";

Session session = HibernateUtil.getSessionFactory().openSession();

Transaction tx = session.beginTransaction();