`
sarin
  • 浏览: 1748081 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:172828
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:366557
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:188312
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:98754
社区版块
存档分类
最新评论

Spring数据库访问(HSQL)(一)

阅读更多
    本部分主要介绍Spring的JDBC模板,JDBC模板的使用,结合Java开源小型数据库HSQL来做详细介绍。
    JDBC都不陌生,它是Java语言操作关系型数据库的规范,是各类JDBC框架/ORM框架的核心基础。普通JDBC的操作过程是繁杂而且大量重复的,使用框架就是为了简化其中的冗余过程,提高代码可维护性。JDBC模板(jdbcTemplate)是为数据库操作提供的大量模板方法,可以在应用中作为数据持久层,这也是一个不错的选择。
    HSQL(HyperSQL)是纯Java实现的关系型数据库,核心只有一个Jar文件,小巧玲珑。HSQL提供四种运行模式:内存模式,进程模式,服务器模式和Web服务器模式。其中内存模式就是内存数据库,在内存中模拟出数据库,可以执行各类数据库操作,但是数据仅仅生存在内存中而不会写入文件系统,也就是说不能持久到外部文件中。进程模式则可以将数据持久到外部文件中保存。服务器模式是运行一个服务器端,形成客户端和服务器端访问的模式,就类似于我们使用的Oracle,MySQL等主流数据库了。Web服务器则是通过HTTP访问的服务器模式,主要为了应对防火墙的拦截。四种模式的具体说明可以参考官方手册。
    如此看来,HSQL也可以作为嵌入式数据库内嵌在程序中,这当然是可以的。在小型应用或演示应用中,使用HSQL作为数据库非常方便,其体积也不大。要使用HSQL,首先是引入到项目中来:
<dependency>
		<groupId>hsqldb</groupId>
		<artifactId>hsqldb</artifactId>
		<version>1.8.0.10</version>
		<type>jar</type>
		<scope>compile</scope>
	</dependency>

    使用Maven构建项目,其目录结构如下:

    这里先说明一下这个小应用的背景:车辆信息管理,为了说明问题,只有一个数据表,围绕这一个表的操作来展示Spring JDBC和HSQL的应用。
    其中描述车辆信息的bean如下:
package org.ourpioneer.vehicle.bean;
/**
 * 车辆信息描述bean
 * 
 * @author Nanlei
 * 
 */
public class Vehicle {
	private int id;// 标识符
	private String plate;// 车牌号
	private String chassis;// 底盘号
	private String color;// 颜色
	private int wheel;// 轮数
	private int seat;// 座位数
	/**
	 * 默认构造方法
	 */
	public Vehicle() {
		super();
	}
	/**
	 * 初始化构造方法
	 * 
	 * @param plate
	 * @param chassis
	 * @param color
	 * @param wheel
	 * @param seat
	 */
	public Vehicle(String plate, String chassis, String color, int wheel,
			int seat) {
		super();
		this.plate = plate;
		this.chassis = chassis;
		this.color = color;
		this.wheel = wheel;
		this.seat = seat;
	}
	//省略所有getter和setter方法
	@Override
	public String toString() {
		return "vehicle [chassis=" + chassis + ", color=" + color + ", id="
				+ id + ", plate=" + plate + ", seat=" + seat + ", wheel="
				+ wheel + "]";
	}

}

    在这个目录结构的db下,创建一个vehicle.script文件,这是用来存储数据库脚本的文件,我们先创建一些基本的内容,比如用户,密码,权限和表结构。
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE MEMORY TABLE VEHICLE(
ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,
PLATE VARCHAR_IGNORECASE(20) NOT NULL,
CHASSIS VARCHAR_IGNORECASE(20) NOT NULL,
COLOR VARCHAR_IGNORECASE(10) NOT NULL,
WHEEL INTEGER NOT NULL,
SEAT INTEGER NOT NULL)
CREATE USER ROOT PASSWORD "123"
CREATE USER SA PASSWORD ""
GRANT DBA TO ROOT
GRANT DBA TO SA
SET WRITE_DELAY 10

    首行是声明该数据库模式,之后创建一个数据表,声明为MEMORY TABLE,因为是先在内存中操作,之后会不会写入文件取决于我们使用的HSQL的模式。下面是创建用户,ROOT用户有密码保护,而SA没有。因为HSQL支持自增长的主键,那么这里我们就设置为自增的主键,在后面添加GENERATED BY DEFAULT AS IDENTITY(START WITH 1)即可。其余就是普通SQL了,注意一下数据类型,可能和其它数据库有不同。
    基础的脚本就写好了,下面就是写程序来操作它,为了降低复杂性,这里封装一些工具类,完成基本的操作。如下:
package org.ourpioneer.vehicle.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 数据库连接工具类基类
 * 
 * @author Nanlei
 * 
 */
public abstract class DatabaseConnection {
	protected Connection conn;
	/**
	 * 关闭数据库连接
	 * 
	 * @throws SQLException
	 */
	public void close() throws SQLException {
		conn.close();
	}
	/**
	 * 创建语句对象
	 * 
	 * @return
	 * @throws SQLException
	 */
	public Statement createStatement() throws SQLException {
		return conn.createStatement();
	}
	/**
	 * 创建预处理SQL语句对象
	 * 
	 * @param sql
	 * @return
	 * @throws Exception
	 */
	public PreparedStatement createPreparedStatement(String sql)
			throws SQLException {
		return conn.prepareStatement(sql);
	}
}

    在写一个针对HSQL的实现类:
package org.ourpioneer.vehicle.util;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Hsql数据库连接工具类
 * 
 * @author Nanlei
 * 
 */
public class HsqldbConnection extends DatabaseConnection {
	/**
	 * 构造方法,加载HSQL数据库驱动并获取连接对象
	 * 
	 * @param databaseFileNamePrefix
	 * @throws SQLException
	 */
	public HsqldbConnection(String path, String prefix) throws SQLException {
		try {
			Class.forName("org.hsqldb.jdbcDriver");
		} catch (ClassNotFoundException e) {
			throw new SQLException("HSQLDB database driver is not found");
		}
		conn = DriverManager.getConnection("jdbc:hsqldb:file:" + path + prefix,
				"ROOT", "123");
	}
	/**
	 * 关闭数据库和连接
	 */
	public void close() throws SQLException {
		Statement stat = createStatement();
		stat.execute("SHUTDOWN");
		super.close();
	}
}

    注意这里的关闭方法,执行了SHUTDOWN命令,因为这样才在关闭数据库时将内存的数据写入到文件中来保存。准备好工具后,下面就是测试了,我们使用JUnit来进行单元测试:
package org.ourpioneer.vehicle;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import junit.framework.TestCase;
import org.ourpioneer.vehicle.util.HsqldbConnection;
public class DBTest extends TestCase {
	private HsqldbConnection conn;
	public DBTest() throws SQLException {
		conn = new HsqldbConnection(
				"src/main/resources/org/ourpioneer/vehicle/db/", "vehicle");
	}
	public void testInsert() throws SQLException {
		String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)";
		PreparedStatement pstat = conn.createPreparedStatement(sql);
		pstat.setString(1, "辽BTEST");
		pstat.setString(2, "1234567890");
		pstat.setString(3, "BLACK");
		pstat.setInt(4, 4);
		pstat.setInt(5, 6);
		int execute = pstat.executeUpdate();
		pstat.close();
		conn.close();
		assertEquals(1, execute);
	}
}

    在构造方法中初始化了连接,下面是对添加方法的测试,这就是一个标准的JDBC过程,插入成功executeUpdate()会返回1,那么最后做出断言,就可以运行测试了。测试成功,来看看数据库脚本文件,其中多了两行
ALTER TABLE VEHICLE ALTER COLUMN ID RESTART WITH 2
INSERT INTO VEHICLE VALUES(1,'\u8fbdBTEST','1234567890','BLACK',4,6)

    上面是控制ID自增的语句,下面就是插入的SQL语句了,中文已经自动转为Unicode编码了。首次运行HSQL,会在脚本文件的同级目录中生成.propertes文件,其中是HSQL自动生成的一些运行属性,在不同模式下还会生成.log文件记录一些日志。比如在服务器模式下会有缓存特性,那么如果不到缓存写入文件时服务器就关闭了,其数据会暂时写入到log中,下次启动服务器时首先是将log文件写入脚本文件等。
    下面来说查询操作,也很简单:
	public void testQuery() throws SQLException {
		String sql = "select * from vehicle";
		Statement stat = conn.createStatement();
		ResultSet rs = stat.executeQuery(sql);
		List<Vehicle> vehicles = new ArrayList<Vehicle>();
		Vehicle vehicle = null;
		while (rs.next()) {
			vehicle = new Vehicle();
			vehicle.setId(rs.getInt("ID"));
			vehicle.setPlate(rs.getString("PLATE"));
			vehicle.setChassis(rs.getString("CHASSIS"));
			vehicle.setColor(rs.getString("COLOR"));
			vehicle.setWheel(rs.getInt("WHEEL"));
			vehicle.setSeat(rs.getInt("SEAT"));
			vehicles.add(vehicle);
		}
		for (Vehicle v : vehicles) {
			System.out.println(v.toString());
		}
		assertEquals(1, vehicles.size());
	}

    执行单元测试,因为就一条数据,肯定是正确的,则会打印出下面一行:
vehicle [chassis=1234567890, color=BLACK, id=1, plate=辽BTEST, seat=6, wheel=4]

    至此,对HSQL的简单使用就说完了,它的使用是非常之方便,可作为内嵌数据库运行,很好用。更多内容就要参考官方的文档了。这里不做过多介绍。下一篇将结合HSQL的服务器模式来开始介绍Spring的JDBC模块。
    希望对使用者有用,欢迎交流。(未完待续)
  • 大小: 19.5 KB
15
3
分享到:
评论
1 楼 stephansun 2011-01-14  
vehicle.script中的建表语句需要写在一行中(CREATE MEMORY TABLE VEHICLE...),刚开始想当然的分行了,结果报错。

相关推荐

    Spring数据库访问(HSQL)(四)

    NULL 博文链接:https://sarin.iteye.com/blog/875915

    Spring数据库访问(HSQL)(三)

    NULL 博文链接:https://sarin.iteye.com/blog/869978

    微服务springcloud集成mybatis

    该项目通过springcloud集成了mybatis操作mysql数据库,项目主要分为7个model模块,配置模块(config),注册模块(discovery),监控模块(monitor),服务模块_mybatisService(通过mybatis操作mysql),服务模块_...

    Spring高级培训:Spring高级培训的样本项目

    通过Spring Boot和HSQL在内存DB中使用JDBC。 周六 通过Spring Boot和H2在内存DB(包括Web控制台)中使用JPA。 Spring Data REST 液基 H2数据库 饱和液基 通过Spring Boot和HSQL在内存DB中使用JDBC和 。 休息 通过...

    todo-spring-boot-jpa:Todo是使用HSQL和JPA实现为Spring Boot应用程序的RESTful任务管理API

    但是,该项目对于学习和尝试Spring Boot和嵌入式HSQL很有用。 Todo API的新版本位于 。 Todo RESTful API被实现为运行嵌入式版本Tomcat的应用程序。 出于演示目的,数据存储是可通过访问的内存数据库。 它使用进行...

    支持多数据库的ORM框架ef-orm.zip

    支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug...

    运行好,调试好的spring3.0 mvc_rest_demo.war

    请注意: 本demo已经自带了HSQL数据库,所以不需要配置数据库 ******************************* * 系统结构介绍 ******************************* dao层使用 ibatis3 并使用分页方言(Diaelct)进行数据分页,具体请查看...

    火炬博客系统7

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    火炬博客系统5

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    火炬博客系统6

    进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。...

    JavaBlogFeedBurner:带有 Maven、Spring、Hibernate 的 Java 项目

    基于 Spring 和 Hibernate在开发模式下运行(使用嵌入式 HSQL 数据库): 使用嵌入式 Jetty 服务器运行此应用程序: mvn -P dev jetty:run -Dspring.profiles.active="dev" 这将在端口 8080 上启动嵌入式 Jetty ...

    CarService:使用Jersey + Spring + JPA-Hibernate的基于Java的简单RESTful服务

    第一次获取请求时,将从数据库中获取数据并放入缓存中。 后续请求将从缓存中获取数据,直到ttl(5分钟)为止。 更新也将更新缓存条目。 删除将从缓存中删除条目。 使用内存中的hsql DB进行此分配。 它将动态创建...

    ipl-dashboard

    Java Brains IPL仪表板 浏览您最喜欢的IPL球队,并... HSQL数据库 React JS AWS BeanStalk 使用的数据集 贡献 查看“问题”选项卡,以获取针对此存储库的功能改进和错误。 确保您观看以了解如何首先构建此应用程序!

    Electronic-Document-Management-System:使用 Spring 和 Hibernate 进行 EDMS 软件开发

    在开发模式下运行(使用嵌入式 HSQL 数据库): 使用嵌入式 Jetty 服务器运行此应用程序: mvn -P dev jetty:run -Dspring.profiles.active="dev" 这将在端口 8080 上启动嵌入式 Jetty 服务器,您可以在此处访问您的...

Global site tag (gtag.js) - Google Analytics