Hsqldb与项目集成
进行模式下集成
可以集成进行(In-Process)模式下的hsqldb,由于数据存储在文件中,即使程序退出,数据也不会被销毁
采用jdbc集成的方式
1 package com.test.hsqldb; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 public class TestHsqldbFile { 11 12 13 public static void main(String[] args) throws SQLException, ClassNotFoundException { 14 15 // 加载HSQL DB的JDBC驱动 16 Class.forName("org.hsqldb.jdbc.JDBCDriver"); 17 18 // 链接内存库,自动创建内存数据库,得到联接对象 connection 19 String url="jdbc:hsqldb:file:testdb/testdir"; 20 Connection con=DriverManager.getConnection(url, "sa", ""); 21 22 // 新建数据表 23 String ctreateTable="DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )"; 24 Statement createStatement = con.createStatement(); 25 long f1 = createStatement.executeUpdate(ctreateTable); 26 System.out.println("创建表:" + f1); 27 28 // 插入数据 29 String insertSql = "INSERT INTO test VALUES(1,'小明')"; 30 Statement insertStatement = con.createStatement(); 31 long f2 = insertStatement.executeUpdate(insertSql); 32 System.out.println("插入数据:" + f2); 33 34 // 查询数据 35 String selectSql = "select id,name from test"; 36 PreparedStatement prepareStatement = con.prepareStatement(selectSql); 37 // 发送SQL 返回一个ResultSet 38 ResultSet rs=prepareStatement.executeQuery(); 39 40 // 编历结果集 41 while(rs.next())//从数据库的取一行数据,是否还有下一行 42 { 43 int id=rs.getInt(1); //从1开始 44 String name=rs.getString(2); 45 System.out.println("id:"+id+" 名称:"+name); 46 } 47 48 // 关闭连接 49 con.close(); 50 51 } 52 53 }
集成到web项目中
Hsqldb服务随着web项目的启动而启动,web项目的停止而停止
1、编辑一个HsqlDB监听启动类,ServletContextListener.java
1 package com.test.hsqldb.listener; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletContextEvent; 6 import javax.servlet.ServletContextListener; 7 8 import org.hsqldb.persist.HsqlProperties; 9 import org.hsqldb.server.Server; 10 import org.hsqldb.server.ServerAcl.AclFormatException; 11 import org.slf4j.Logger; 12 import org.slf4j.LoggerFactory; 13 14 15 /** 16 * HsqlDB监听启动类 17 * @author H__D 18 * @date 2019-05-26 22:38:26 19 * 20 */ 21 public class HsqlDBListener implements ServletContextListener { 22 23 private static final Logger log = LoggerFactory.getLogger(HsqlDBListener.class); 24 25 private Server server = null; 26 27 /** 28 * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化, 29 * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。 30 */ 31 @Override 32 public void contextInitialized(ServletContextEvent sce) { 33 34 // 以服务模式运行hsqldb 35 // 新建一个hsqldb服务对象 36 server = new Server(); 37 // 设置属性 38 // HsqlProperties p = new HsqlProperties(null); 39 // server.setProperties(p); 40 // 设置数据库名 41 server.setDatabaseName(0, "testdb"); 42 // 设置数据库目录 43 server.setDatabasePath(0, sce.getServletContext().getRealPath("/") + "testdb/"+"testdir"); 44 // 设置端口 45 server.setPort(9001); 46 //可以使用自定义编写器 47 server.setLogWriter(null); 48 //可以使用自定义编写器 49 server.setErrWriter(null); 50 // 启动 51 server.start(); 52 53 log.info("Server Hsqldb Start ..."); 54 } 55 56 /** 57 * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。 58 */ 59 @Override 60 public void contextDestroyed(ServletContextEvent sce) { 61 // TODO Auto-generated method stub 62 // 关闭 63 server.shutdownCatalogs(1); 64 65 log.info("Server Hsqldb Stop ..."); 66 } 67 68 69 }
2、在web.xml中注册监听器
1 <listener> 2 <listener-class>com.test.hsqldb.listener.HsqlDBListener</listener-class> 3 </listener>
3、启动web项目,就能使用jdbc连接hsqldb服务了
与Spring集成
新建一个SpringMVC+Spring+Mybatis工程,参考:【Mybatis】MyBatis之整合Spring(八),本例在此工程基础上演示
1、编辑HsqlDB监听启动类,并在web.xml项目中注册,如上。
2、编辑注册数据源文件(spring-mybatis.xml),并加入初始化脚本配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xmlns:jdbc="http://www.springframework.org/schema/jdbc" 8 xsi:schemaLocation="http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context-4.0.xsd 12 http://mybatis.org/schema/mybatis-spring 13 http://mybatis.org/schema/mybatis-spring.xsd 14 http://www.springframework.org/schema/tx 15 http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 16 http://www.springframework.org/schema/jdbc 17 http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd"> 18 19 <!-- 引入数据库的配置文件 --> 20 <context:property-placeholder 21 location="classpath:dbconfig.properties" /> 22 23 24 25 <!-- 数据源:Spring用来控制业务逻辑。数据源、事务控制、aop --> 26 <bean id="dataSource" 27 class="com.mchange.v2.c3p0.ComboPooledDataSource"> 28 <property name="jdbcUrl" value="${jdbc.url}"></property> 29 <property name="driverClass" value="${jdbc.driver}"></property> 30 <property name="user" value="${jdbc.username}"></property> 31 <property name="password" value="${jdbc.password}"></property> 32 </bean> 33 34 <!-- 初始化脚本 --> 35 <jdbc:initialize-database data-source="dataSource"> 36 <jdbc:script location="classpath:hsqldb-schema.sql" /> 37 <jdbc:script location="classpath:hsqldb-dataload.sql" /> 38 </jdbc:initialize-database> 39 40 41 <!-- spring事务管理 --> 42 <bean id="dataSourceTransactionManager" 43 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 44 <property name="dataSource" ref="dataSource"></property> 45 </bean> 46 47 <!-- 开启基于注解的事务 --> 48 <tx:annotation-driven 49 transaction-manager="dataSourceTransactionManager" /> 50 51 52 53 <!-- 整合mybatis 目的:1、spring管理所有组件。mapper的实现类。 service==>Dao @Autowired:自动注入mapper; 54 2、spring用来管理事务,spring声明式事务 --> 55 <!--创建出SqlSessionFactory对象 --> 56 <bean id="sqlSessionFactoryBean" 57 class="org.mybatis.spring.SqlSessionFactoryBean"> 58 <property name="dataSource" ref="dataSource"></property> 59 <!-- configLocation指定全局配置文件的位置 --> 60 <property name="configLocation" 61 value="classpath:mybatis-config.xml"></property> 62 <!--mapperLocations: 指定mapper文件的位置 --> 63 <property name="mapperLocations" 64 value="classpath:mybatis/mapper/*.xml"></property> 65 </bean> 66 67 <!--配置一个可以进行批量执行的sqlSession --> 68 <bean id="sqlSession" 69 class="org.mybatis.spring.SqlSessionTemplate"> 70 <constructor-arg name="sqlSessionFactory" 71 ref="sqlSessionFactoryBean"></constructor-arg> 72 <constructor-arg name="executorType" value="BATCH"></constructor-arg> 73 </bean> 74 75 <!-- 扫描所有的mapper接口的实现,让这些mapper能够自动注入; base-package:指定mapper接口的包名 --> 76 <mybatis-spring:scan 77 base-package="com.test.hsqldb.dao" /> 78 79 </beans>
3、编辑初始化数据库脚本:hsqldb-schema.sql
1 DROP TABLE Employee IF EXISTS; 2 CREATE TABLE Employee ( 3 id INT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY ( START WITH 1, INCREMENT BY 1 ), 4 last_name VARCHAR ( 255 ) DEFAULT NULL, 5 gender VARCHAR ( 255 ) DEFAULT NULL, 6 email VARCHAR ( 255 ) DEFAULT NULL 7 );
4、编辑初始化数据脚本:hsqldb-dataload.sql
1 INSERT INTO employee VALUES (1, '小白', '1', 'dabai@163.com'); 2 INSERT INTO employee VALUES (2, '小明', '1', 'xiaoming@163.com'); 3 INSERT INTO employee VALUES (3, '小红', '1', 'xiaohong@163.com');
5、数据库配置信息,dbconfig.properties
1 jdbc.driver = org.hsqldb.jdbc.JDBCDriver 2 jdbc.url = jdbc:hsqldb:hsql://localhost:9001/testdb 3 jdbc.username = sa 4 jdbc.password =
6、运行结果如下: