Facebook Twitter LinkedIn E-mail
magnify
Home 2012 十月

关于Android引路蜂地图应用源码的简单说明

前面完整的Android引路蜂地图应用源码下载 提供了源码下载,这里对这个项目做个简单的说明以方便阅读。

整个应用代码量在4000行左右,不算很大,下面是对代码中主要Package的说明:

文件名 空行 注释 代码行 说明
AboutActivity.java 13 4 47 关于软件说明
app\GNavigatorApplication.java 27 23 93 主应用类
app\SessionInfo.java 9 3 11 保持一些全局变量
app\SharedMapInstance.java 13 38 18 保存RasterMap类实例
app\SharedSearchResults.java 12 0 22 保存查询结果
database\DatabaseAssistant.java 42 63 122 用于数据库访问,用来管理设备,这部分可以不看
database\DBAdapter.java 27 126 77
database\DBMapper.java 4 38 7
database\DeviceDBMapper.java 20 86 130
database\DeviceLocationHistoryDBMapper.java 19 56 60
database\PersistentFacade.java 28 168 67
dataobject\Device.java 14 0 15 设备定义,设备命令,这部分可以不看
dataobject\DeviceCommand.java 7 0 17
dataobject\DeviceLocationHistory.java 5 0 7
device\AddDeviceActivity.java 14 1 70 软件可以用来跟踪其他设备或者报告设备当前位置,这部分可以不看
device\DeviceCommandListActivity.java 39 4 202
device\DeviceControlTabActivity.java 16 1 80
device\DeviceInfoActivity.java 8 1 49
device\DeviceLocationHistoryListActivity.java 19 1 81
device\ManageDeviceListActivity.java 44 4 208
drawing\AndroidFont.java 9 27 17 和Android平台相关的引路蜂图形接口实现
drawing\AndroidGraphics.java 20 150 57
drawing\AndroidGraphicsFactory.java 10 83 23
drawing\AndroidImage.java 20 114 65
gis\FileMapTiledZone.java 17 23 43 用来访问离线地图文件
GNavigatorActivity.java 82 31 516 主Activity
GuidebeeMapView.java 52 25 301 地图View,可以自定义并扩展,支持Gesture缩放等
location\LocationService.java 54 55 90 GPS服务
mapmode\MapModeListActivity.java 16 11 50 选项地图模式界面
routing\RouteDetailActivity.java 52 34 274 显示详细路径
routing\RoutingActivity.java 26 1 159 路径查询界面
search\SearchResultListActivity.java 41 25 246 查询结果
search\SearchSuggestionProvider.java 2 0 9 查询提示
settings\SettingsActivity.java 19 26 86 软件设置界面
sms\DeviceMessage.java 4 0 5 控制设备的短消息处理,这部分可以不看
sms\DeviceMessageCenter.java 7 0 18
sms\DeviceMessageProcessor.java 45 1 209
sms\SmsMessageReceiver.java 13 15 28
ToolbarButton.java 36 1 259 工具条自定义View

其中和Device相关的部分,包database, dataobject, device, sms 部分可以跳过不需要看,这部分和地图API使用关系不大,主要用来监视GPS设备或其它手机的位置。

drawing 包实现了地图API中和图形系统相关接口的Android平台上实现 ,引路蜂地图开发包中Gis.Drawing 类定义了几个抽象类或接口,对不同平台的图形系统进行了抽象。这些绘图的接口不同,如果在引路蜂地图开发包直接引用这些类方法,这样不同平台就会需要编译不同的开发包。通过抽象处理,引路蜂地图开发包并直接调用平台相关的图形类方法。而是通过 开发包 + 平台相关图形系统实现的方法,就可以实现跨平台.具体可以参见图形子系统

GuidebeeMapView 主要用来显示地图,这个给出的是一个参考实现,支持触摸屏平移,事件你可以把地图放在任何可以显示Image对象的控件上,添加你自己的Logo,支持MultiTouch 缩放等,本身是个自定义View (为View的子类),你可以自由扩展其功能。

FileMapTiledZone 用来支持从文件读取离线地图,这部分代码可以不需修改应用到你自己编写的引路蜂地图应用中。

应用程序框架基于RoboGuice 以简化代码,关于RoboGuice的使用可以参见本博客 的Android RoboGuice 使用指南

搜索使用Android平台的Search Framework。可以参见

App/Search/Invoke Search
App/Search/Query Search Results

再看一下项目的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pstreets.navigator"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <application
        android:name=".app.GNavigatorApplication"
        android:icon="@drawable/navigator"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <activity android:name=".GNavigatorActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.default_searchable"
                android:value=".search.SearchResultListActivity" />
        </activity>
        <activity
            android:name=".search.SearchResultListActivity"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
        <activity
            android:name=".AboutActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".mapmode.MapModeListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".routing.RoutingActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".routing.RouteDetailActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.ManageDeviceListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.AddDeviceActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceControlTabActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceCommandListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceInfoActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceLocationHistoryListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".settings.SettingsActivity"
            android:launchMode="singleTop" >
        </activity>

        <receiver
            android:name=".sms.SmsMessageReceiver"
            android:enabled="true" >
            <intent-filter android:priority="1000" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <provider
            android:name=".search.SearchSuggestionProvider"
            android:authorities="com.pstreets.navigator.search.SearchSuggestionProvider" />
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

</manifest>

使用的permission 需要有INTERNET(地图API需要访问网络) ,WRITE_EXTERNAL_STORAGE (离线地图需要访问SD卡)其它权限可以根据需要添加。
最后看一下软件的项目目录结构:

项目引用三个库,其中libgisengine.jar 为引路蜂地图API,其它两个为roboguice 库。 支持中英文两种资源 values-zh-rCN 为中文string 资源。

 

完整的Android引路蜂地图应用源码下载

这里提供一个比较完整的引路蜂地图Android应用源码下载,基本涵盖了引路蜂地图API的所有功能,包括离线地图,路径查询,地址查询,地图模式选择等。

设备上在Galaxy Nexus 和 Nexus S ,Nexus 7 Tablet 测试通过,可以做为你学习或开发引路蜂地图应用的参考。

完整的Android引路蜂地图应用源码 下载

主界面

搜索 ,包括: 地址查询, 本地查询,IP地图查询,经纬度查询

查询结果显示

路径查询

路径地图显示

地图模式:支持多种地图模式,并可以支持自定义地图

地址反编码

关于离线地图

应用缺省读取所有存放在SD卡guidebee 目录下所有 .map 文件,代码如下:

MapTileStreamReader streamReader = SharedMapInstance.mapTileDownloadManager
					.getInteralMapTileStreamReader();

	SharedMapInstance.worldMapFileStream = getResources()
			.openRawResource(R.raw.world);
	MapTiledZone worldmapZone = new MapTiledZone(new DataInputStream(
			SharedMapInstance.worldMapFileStream));
	streamReader.addZone(worldmapZone);
	try {
		File sdcardDir = Environment.getExternalStorageDirectory();
		File guidebeeDir = new File(sdcardDir, "guidebee");
		if (guidebeeDir.exists()) {
			FilenameFilter filter = new FilenameFilter() {
				public boolean accept(File dir, String filename) {
					if (filename.endsWith(".map")) {
						return true;
					}
					return false;

				}
			};

			String[] allMapfiles = guidebeeDir.list(filter);
			String path = guidebeeDir.getAbsolutePath();
			if (allMapfiles != null) {
				for (int i = 0; i < allMapfiles.length; i++) {

					FileMapTiledZone mapTileZone = new FileMapTiledZone(
							path + File.separator + allMapfiles[i],
							false);
					Log.p(allMapfiles[i]);
					streamReader.addZone(mapTileZone);
				}

			}
		}

	} catch (Exception e) {

	}finally{
		streamReader.open();
	}

} catch (Exception e) {

}

你也可以根据你自己的需求放在其它目录下,记得要更改代码中对应的路径。

GPS支持,应用也提供了GPS支持,可以显示当前位置

关于软件使用许可,源码中包含试用许可

地图上会随机显示“Guidebee” 水印。正式版去除水印,关于正式版可以参见版本说明。

离线地图下载可以参见 离线地图工具 和离线地图下载 ,你可以通过离线地图工具自己制作离线地图,或是从本网站下载。

软件采用RoboGuice ,关于RoboGuice可以参见

Android RoboGuice 使用指南

  1. Android RoboGuice 使用指南(1):概述
  2. Android RoboGuice 使用指南(2):第一个例子Hello World
  3. Android RoboGuice 使用指南(3):Bindings 概述
  4. Android RoboGuice 使用指南(4):Linked Bindings
  5. Android RoboGuice 使用指南(5):Binding Annotations
  6. Android RoboGuice 使用指南(6):Instance Bindings
  7. Android RoboGuice 使用指南(7):@Provides Methods
  8. Android RoboGuice 使用指南(8):Provider Bindings
  9. Android RoboGuice 使用指南(9):Untargetted Bindings
  10. Android RoboGuice 使用指南(10):Just-in-time Bindings
  11. Android RoboGuice 使用指南(11):Scopes
  12. Android RoboGuice 使用指南(12):如何绑定generic类型
  13. Android RoboGuice 使用指南(13):RoboGuice 功能描述
  14. Android RoboGuice 使用指南(14):Inject View
  15. Android RoboGuice 使用指南(15):Inject Context
  16. Android RoboGuice 使用指南(16):Standard Injection
  17. Android RoboGuice 使用指南(17):Inject Extra
  18. Android RoboGuice 使用指南(18):Inject Resources
  19. Android RoboGuice 使用指南(19):发送接收Events
  20. Android RoboGuice2 使用指南(1): 概述
  21. Android RoboGuice2 使用指南(2): 第一个例子Hello World
  22. Android RoboGuice2 使用指南(3): Inject 自定义View
  23. Android RoboGuice2 使用指南(4): 综合示例Astroboy

完整的Android引路蜂地图应用源码 下载

 

CodeSmith 使用教程(1): 概述

前面正在介绍hibernate的开发教程,提到hibernate 在.Net 平台上相应的ORM工具为NHibernate ,使用NHibernate 就不能不提到CodeSmith。

CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西。   当您生成应用程序时,您经常需要重复完成某些特定的任务,例如编写数据访问代码或者生成自定义集合。CodeSmith 在这些时候特别有用,因为您可以编写模板自动完成这些任务,从而不仅提高您的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith 附带了许多模板,包括对应于所有 .NET 集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。

CodeSmith可以从网站http://www.codesmithtools.com/ 下载,个人开发版费用在300美元左右,个人认为还是物有所值。

还是用一个例子来说明一下使用CodeSmith可以大大减轻程序代码的工作量,对于数据库应用来说,尽管数据库表不尽相同,但基本过程都是定义数据库表,设计表对应的类,然后使用ADO或是SQL语句来访问数据库,创建对应的类对象等。

使用CodeSmith提供的模板,可以几乎不用手工编写一行代码,就可以自动生成上述数据库相关的代码。

本例使用Visual Studio 2010 ,Codesmith 安装时提供了Visual Studio 插件支持。使用的示例数据库也是Sales,可以参见Hibernate开发教程(2):准备开始

由于使用MySQL数据库,需要下载MySQL .Net 库。使用SQL Server 可以直接使用。

1. 创建一个命令行应用solution。

2. 使用CodeSmith的Schema Explorer 添加一个MySQL 数据源

这里的Connection String 为: SERVER=localhost;DATABASE=sales;UID=username;PASSWORD=password; (根据你自己服务器自行修改参数)

添加成功后,在Schema Explorer 中会显示所连接的数据库的表定义等

3. 在这个solution 中添加一个Sales.Data Class Library. 然后在项目中添加一个CodeSmith 项目Item

4. 点击Sales.csp 使用鼠标右键Context Menu

使用有Add Output 可以在项目中添加生成代码的模板,这里选用CodeSmith自带的 PLINQO-NH\CSharp下的三个模板,

模板路径为..\Users\…\Documents\CodeSmith Generator\Samples\v6.5\Templates\Frameworks\PLINQO-NH\CSharp\

分别添加三个模板,SourceDatabase 选择Schema Explorer 中添加的Sales数据库,其它属性使用缺省值。

三个模板分别为

  • Hbms    生成 hbm.xml 映射文件
  • Entities  生成和数据库表对应的.Net类定义
  • Queries 生成查询数据对应的类

然后通过Sales.csp 的Generate code 生成代码。

可以看到CodeSmith自动生成了很多代码,并添加了所需的引用。

此时用来访问数据的类全部由CodeSmith生成,无需自己写一行代码。

5. 看看如果使用生成的代码来访问数据库,修改命令行应用的Program.cs 的main 函数,打印出所有Customer的姓名。

var salesDataContext = new SalesDataContext();
foreach (var s in salesDataContext.Customer.ToList())
{
	Console.WriteLine(s.FirstName+" " + s.LastName);
}

使用SalesDataContext 中Customer查询 对象。然后枚举列表中每个Customer对象并打印出FirstName 和 Last Name. 可以看到代码自动完成了对数据库的读取访问。

由本例看到使用CodeSmith可以大大减轻手工代码量,其使用的一般步骤是

  1. 选择使用合适的模板,CodeSmith随开发包自带了大量常用的模板,如果找不到合适的模板,CodeSmith支持自定义模板。
  2. 为模板选择合适的参数设置。
  3. 自动生成代码(可以为任意类型的代码,C#,Java, .XML 文本等)

后面将详细介绍CodeSmith使用的基本方法,CodeSmith的核心为模板,因此重点在模板的设计和使用。

 

Hibernate开发教程(2):准备开始

使用Hibernate开发应用,一种方法是下载Hibernate相关的jar文件,然后再项目在添加引用。由于Hibernate涉及的库比较多,这种方法比较麻烦,因此本教程使用Maven来管理项目。关于Maven的简单教程可以参见:

  1. Maven 使用指南(1): 概述
  2. Maven 使用指南(2): 第一个例子Hello World
  3. Maven 使用指南(3): 简述Maven工作过程
  4. Maven 使用指南(4): Maven Build 的阶段
  5. Maven 使用指南(5): Maven 自动依赖管理
  6. Maven 使用指南(6): 使用Maven插件
  7. Maven 使用指南(7): 使用Maven打包资源文件
  8. Maven 使用指南(8): 使用Maven管理多个项目

此外教程采用MySql 数据库为例,如果你使用Windows操作系统,可以安装WAMP系统(包括MySQL,Apache ,PHP等)也可以只安装MySQL。 Hibernate 使用其它数据库的方法大同小异。

管理MySQL的免费前端管理工具为HeidiSQL,你也可以使用命令行或是其它工具。

开始使用的示例数据库为Sales 数据库,可以参见Vaadin Web应用开发教程(46): 开始使用SQLContainer 。或是本地下载Sales.sql.

此外为方便起见 使用 Maven-Hibernate3插件,可以直接从数据库生成 映射文件和Java类代码。具体使用可以参见 Mojo。

开发环境使用Eclipse 或是 SpringSouce tool Suite (STS),这些都可以从网上免费下载。

首先创建一个Maven项目 HibernateTutorial.

修改pom.xml 添加于Hibernate相关的引用:

<dependencies>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-core</artifactId>
		<version>4.1.6.Final</version>
	</dependency>

	<!-- Hibernate uses jboss-logging for logging, for the tutorials we will
		use the sl4fj-simple backend -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-simple</artifactId>
		<version>1.6.1</version>
	</dependency>

	<!-- The tutorials use JUnit test cases to illustrate usage -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
	</dependency>

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.0.8</version>
	</dependency>
</dependencies>

使用Maven-Hibernate 的 hbm2java (自动生成Java代码),hbm2hbmxml (自动生成.hbm.xml 映射文件) 和 hbm2cfgxml (自动生成最终的hibernate.cfg.xml文件)

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>hibernate3-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<components>
			<component>
				<name>hbm2java</name>
				<outputDirectory>src/main/java/</outputDirectory>
				<implementation>jdbcconfiguration</implementation>
			</component>

			<component>
				<name>hbm2hbmxml</name>
				<outputDirectory>src/main/resources/</outputDirectory>
			</component>

			<component>
				<name>hbm2cfgxml</name>
				<outputDirectory>src/main/resources/</outputDirectory>
				<implementation>jdbcconfiguration</implementation>
			</component>
		</components>

		<componentProperties>
			<drop>true</drop>

			<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
			<packagename>com.pstreets.hibernate.demo.data</packagename>
		</componentProperties>
	</configuration>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.0.8</version>
		</dependency>

	</dependencies>
</plugin>

其中hbm2java 通过 outputDirectory参数指明创建的Java代码的目录,hbm2hbmxml通过outputDirectory参数指明创建的映射文件的目录,本例使用缺省的资源目录src/main/resources ,因为我们使用MySQL plugin也添加了对mysql 的依赖。

hibernate.cfg.xml 为Hibernate的配置文件,本例使用如下配置来连接Mysql数据库的Sales数据库

<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Sales</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>

在命令行运行 mvn hibernate3:hbm2java hibernate3:hbm2cfgxml hibernate3:hbm2hbmxml 自动生成java代码,.hbm.xml 映射文件及配置文件hibernate.cfg.xml。

到此时我们还没有写过一行代码。

下面我们就使用Hibernate 来读取Sales数据库的Customer表,并显示所有Customer的FirstName 和Last Name,代码如下:

SessionFactory sessionFactory;
sessionFactory = new Configuration().configure().buildSessionFactory();

// create a couple of events...
Session session = sessionFactory.openSession();
session.beginTransaction();

List result = session.createQuery( "from Customer" ).list();
for ( Customer customer : (List<Customer>) result ) {
	System.out.println( "Customer: " + customer.getFirstName()
	 + " " + customer.getLastName() );
}
session.getTransaction().commit();
session.close();

if (sessionFactory != null) {
	sessionFactory.close();
}

这里先不解释,但可以看出没有任何的SQL语句,就将Customer表的记录写到result 这个List对象中。结果如下:

Customer: Laura Steel
Customer: Susanne King
Customer: Anne Miller
Customer: Michael Clancy
Customer: Sylvia Ringer
Customer: Laura Miller
Customer: Laura White
Customer: James Peterson
Customer: Andrew Miller
Customer: James Schneider
Customer: Anne Fuller
Customer: Julia White
Customer: George Ott
Customer: Laura Ringer
Customer: Bill Karsen
Customer: Bill Clancy
Customer: John Fuller
Customer: Laura Ott
Customer: Sylvia Fuller
Customer: Susanne Heiniger
Customer: Janet Schneider
Customer: Julia Clancy
Customer: Bill Ott
Customer: Julia Heiniger
Customer: James Sommer
Customer: Sylvia Steel
Customer: James Clancy
Customer: Bob Sommer
Customer: Susanne White
Customer: Andrew Smith
Customer: Bill Sommer
Customer: Bob Ringer
Customer: Michael Ott
Customer: Mary King
Customer: Julia May
Customer: George Karsen
Customer: John Steel
Customer: Michael Clancy
Customer: Andrew Heiniger
Customer: Mary Karsen
Customer: Susanne Miller
Customer: Bill King
Customer: Robert Ott
Customer: Susanne Smith
Customer: Sylvia Ott
Customer: Janet May
Customer: Andrew May
Customer: Janet Fuller
Customer: Robert White
Customer: George Fuller

可以下载本例做为后续教程的基础。

 

Hibernate开发教程(1):概述

提起Hibernate,很多人多知道是一个ORM[Object-Relational-Mapping(对象-关系-映射]的中间件。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。
Hibernate 在.Net Framework 有对应的开发为NHibernate. Hibernate 和NHibernate 的基本概念和使用方法基本一致,因此本教程也可作为NHibernate开发的参考。

首先说明一下为什么要使用ORM工具,也就是使用类似hibernate 等ORM工具的好处。在软件开发的设计的过程,尤其是使用面向对象设计方法时,根据系统需求,抽象出系统对象模型(类定义),有了这些对象类定义,如果需要使用数据库存放这些数据,就需要根据系统需求和类定义来定义数据库的表,定义数据库表时有涉及到表和表之间的关系,表的主键和外键定义等等,然后再通过大量的SQL语句或是通过ADO对象来存取数据库,然后根据数控库内容创建或赋值对应的系统对象的实例。

在开发应用时,开发人员有相当一部分时间花在设计数据库表,表之间的关系,编写SQL语句,使用Hibernate之后,开发人员一般只需要对系统进行建模,抽象出系统的类定义,然后借助Object-Relational 映射文件(一般为XML文件),然后Hibernate就可以自动帮助用户创建数据表,通过简单的save, delete,load, update 等就可以完成数据库的存取操作,而无需再编写大量的SQL代码 ,大大提高软件的开发效率。

学习Hibernate 的一个核心问题为定义对象-关系-映射文件 (Object-Relational Mappings)。如果是开发新系统,有工具可以直接从UML生成Hibernate使用的映射文件。但如果是对现有系统进行改造或是数据库已经定义好,根据已有的系统类Classes 和Database Schema来定义Hibernate 映射文件就需要比较深入的了解Hibernate支持的映射关系类型(有点类似逆向工程,就比较费事)。

对于新建系统,Hibernate可以自动根据映射文件创建数据库Schema ,工作量就小多了,如果使用UML,连创建映射文件的工作都可以省了。

用个简单的例子来说明,比如使用SQL语句插入一条记录。

INSERT INTO Items(id, name) VALUES(NULL, 'My Item');

如果使用ORM框架,可以直接使用对象save方法

Item item = new Item();
item.name = "My Item";
item.save();

ORM框架自动根据所管理的数据创建对应的SQL语句对数据库进行读写操作。
后面就详细介绍Hibernate开发,数据使用常用的MySQL 数据库,Hibernate 支持大部分常用的数据库类型如Oracle, Mysql, Sqlite, SqlServer ,因此使用Hibernate的还有一个好处是通过了一个数据抽象层,可以屏蔽对实际物理数据库类型的依赖,支持无缝更换数据库类型:)(当然还是需要修改一些配置文件)。