项目中使用到嵌入式数据库,选择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;
}
这样就可以避免异常的出现