日期:2014-05-16 浏览次数:20363 次
项目中使用到嵌入式数据库,选择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; }?这样就可以避免异常的出现