日期:2014-05-16  浏览次数:20363 次

derby嵌入式数据库在spring中应用

项目中使用到嵌入式数据库,选择derby数据库.具体的使用方法如下

1.搭建aplication程序,引入spring进行管理

2.应用中添加derby.jar 10.8.12 文件

3.spring 的xml配置中的dataSource配置:

?

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close" abstract="false" scope="singleton" lazy-init="false"> 
		<property name="driverClass" value="org.apache.derby.jdbc.EmbeddedDriver" />
		<property name="jdbcUrl" value="jdbc:derby:${db_path};create=true" />
		<property name="checkoutTimeout" value="30000" />
		<property name="maxIdleTime" value="120" />
		<property name="maxPoolSize" value="10" />
		<property name="minPoolSize" value="1" />
		<property name="initialPoolSize" value="1" />
		<property name="maxStatements" value="0" />
		<property name="maxStatementsPerConnection" value="0" />
		<property name="idleConnectionTestPeriod" value="30" />
	</bean>

?

?采用c3p0做为数据源的管理,他会抛出一个可以忽略掉得异常

4.${db_path}是添加一个properties文件,文件里面的内容为创建数据库的路径:

db_path=D:/dev/eclipse/workspace/vaspposp/conf/db/posp_db

5.create=true是如果没有该数据就会创建一个新的

6.现在可以直接使用这个数据源进行数据库操作,也可以用spring的jdbcTemplte进行管理

7.项目的需求是当系统第一启动时需要动态创建数据库和表,并给表添加数据:

解决办法:

?1)创建一个sql文件,将要创建表的语句和插入语句放入其中,注意语句是标准sql

?2)当系统启动时读取该sql文件并执行,可创建读取sql文件的类: ??

/**
	 * 读取 SQL 文件,获取 SQL 语句
	 * 
	 * @param sqlFile
	 *            SQL 脚本文件
	 * @return List<sql> 返回所有 SQL 语句的 String[]
	 * @throws Exception
	 */
	public String[] loadSql(File sqlFile) {
		List<String> sqlList = new ArrayList<String>();
		try {

			InputStream sqlFileIn = new FileInputStream(sqlFile);
			StringBuilder sqlSb = new StringBuilder();
			byte[] buff = new byte[1024];
			int byteRead = 0;
			while ((byteRead = sqlFileIn.read(buff)) != -1) {
				sqlSb.append(new String(buff, 0, byteRead, "utf-8"));
			}
			// Windows 下换行是 \r\n, Linux 下是 \n
			String[] sqlArr = sqlSb.toString()
					.split("(;\\s*\\r\\n)|(;\\s*\\n)");
			for (int i = 0; i < sqlArr.length; i++) {
				String sql = sqlArr[i].replaceAll("--.*", "").trim();
				if (!sql.equals("")) {
					sqlList.add(sql);
					LOG.info("加载 SQL 语句:{}", sql);
				}
			}
		} catch (Exception e) {
			LOG.error("读取 SQL 文件,获取 SQL 语句异常:{}", e.getMessage());
		}
		if (sqlList.size() > 0) {
			String[] sqlArr = new String[sqlList.size()];
			sqlList.toArray(sqlArr);
			return sqlArr;
		} else {
			return null;
		}
	}

?这个方法返回的是一个sql语句组成的数据,这个样正好可以使用jdbcTemplete的batchUpdate方法进行批量执行sql语句

8.这时有一个问题,就是当再次启动系统时,数据已经存在就不需要创建了,所以要检查是否有表的存在,否则会抛出异常,检查表的方式是:

/**
	 * 检查表是否存在
	 * @param tableName
	 * @return
	 */
	public boolean isTableExist(String tableName){
		try {
			Connection conn = dataSource.getConnection();
			ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null);
			return rs.next();
		} catch (SQLException e) {
			LOG.error("检查表是否存在出现sql异常",e);
		}
		return false;
	}
?这样就可以避免异常的出现