今天给大家讲下如何springmv+hibernate如何连接sqlite数据库,在之前的一篇文章中我们讲到如何连接mysql数据库,参考链接为http://blog.csdn.net/u012195899/article/details/52473933,接下来我们就根据这篇博文,修改我们的数据库为sqlite。
1、首先,我们要知道,hibernate官方并没有给出连接sqlite数据库的方言,因此,这个方言我们需要自己定义,网上给出了很多版本的方言 ,大家根据自己的hibernate版本找适合自己的方言吧。我的hibernate版本为4.0,方言代码如下
package com.common.Utils;
import java.sql.Types;
import org.hibernate.Hibernate;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.dialect.function.VarArgsSQLFunction;
import org.hibernate.type.StandardBasicTypes;
public class SQLiteDialect extends Dialect {
public SQLiteDialect() {
super();
registerColumnType(Types.BIT, "integer");
registerColumnType(Types.TINYINT, "tinyint");
registerColumnType(Types.SMALLINT, "smallint");
registerColumnType(Types.INTEGER, "integer");
registerColumnType(Types.BIGINT, "bigint");
registerColumnType(Types.FLOAT, "float");
registerColumnType(Types.REAL, "real");
registerColumnType(Types.DOUBLE, "double");
registerColumnType(Types.NUMERIC, "numeric");
registerColumnType(Types.DECIMAL, "decimal");
registerColumnType(Types.CHAR, "char");
registerColumnType(Types.VARCHAR, "varchar");
registerColumnType(Types.LONGVARCHAR, "longvarchar");
registerColumnType(Types.DATE, "date");
registerColumnType(Types.TIME, "time");
registerColumnType(Types.TIMESTAMP, "timestamp");
registerColumnType(Types.BINARY, "blob");
registerColumnType(Types.VARBINARY, "blob");
registerColumnType(Types.LONGVARBINARY, "blob");
registerColumnType(Types.BLOB, "blob");
registerColumnType(Types.CLOB, "clob");
registerColumnType(Types.BOOLEAN, "integer");
registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "",
"||", ""));
registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER,
"?1 % ?2"));
registerFunction("substr", new StandardSQLFunction("substr",
StandardBasicTypes.STRING));
registerFunction("substring", new StandardSQLFunction("substr",
StandardBasicTypes.STRING));
}
public boolean supportsIdentityColumns() {
return true;
}
public boolean hasDataTypeInIdentityColumn() {
return false;
}
public String getIdentityColumnString() {
return "integer";
}
public String getIdentitySelectString() {
return "select last_insert_rowid()";
}
public boolean supportsLimit() {
return true;
}
protected String getLimitString(String query, boolean hasOffset) {
return new StringBuffer(query.length() + 20).append(query).append(hasOffset ? " limit ? offset ?" : " limit ?").toString();
}
public boolean supportsTemporaryTables() {
return true;
}
public String getCreateTemporaryTableString() {
return "create temporary table if not exists";
}
public boolean dropTemporaryTableAfterUse() {
return false;
}
public boolean supportsCurrentTimestampSelection() {
return true;
}
public boolean isCurrentTimestampSelectStringCallable() {
return false;
}
public String getCurrentTimestampSelectString() {
return "select current_timestamp";
}
public boolean supportsUnionAll() {
return true;
}
public boolean hasAlterTable() {
return false;
}
public boolean dropConstraints() {
return false;
}
public String getAddColumnString() {
return "add column";
}
public String getForUpdateString() {
return "";
}
public boolean supportsOuterJoinForUpdate() {
return false;
}
public String getDropForeignKeyString() {
throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
}
public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) {
throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
}
public String getAddPrimaryKeyConstraintString(String constraintName) {
throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
}
public boolean supportsIfExistsBeforeTableName() {
return true;
}
public boolean supportsCascadeDelete() {
return false;
}
}
这一步需要注意的是,使用不同版本的Hibernate,下图这部分代码可能会出错,大家找一下其他版本更换这部分代码就好了。
2、现在,我们可以建立自己的sqlite数据库了。首先,去官网下载sqlite数据库http://www.sqlite.org/download.html,我下载的是windows编译好的版本,如图下所示
sqlite是一个轻量型数据库,一般来说只要解压了有sqlite3.exe,就可以使用了。而且sqlite数据库是以文件形式保存的,不支持网络访问,我用的是navicat连接数据库,新建连接SQLITE,在本机任意目录新建sqlite3类型的.db数据库即可。这个时候就可以使用navicat操作该.db数据库文件了。在本文中,我新建数据库文件的位置是F:\web\test.db
3、接下来,我们就开始在配置文件中配置连接sqlite数据库。首先,修改applicationContext.xml文件,这个文件中我们主要修改两部分配置
(1)我们即将修改数据源
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="test"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="mypassword"/>
<!-- 指定链接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="40"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
当前实现如上所示,连接mysql数据库时需要配置连接的主机名,端口,用户名密码等,然而sqlite数据库不支持网络连接,同时不支持用户名密码等,只能直接使用文件访问,因为我们将上面代码这部分修改为如下:
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.sqlite.JDBC"/>
<property name="url" value="jdbc:sqlite:F:/web/test.db"/>
</bean>
(2)我们需要修改SessonFactory部分,因为这部分配置了hibernate所使用的方言。
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<!-- 以下用来列出所有的PO映射文件 -->
<value>com/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true;
</value>
</property>
</bean>
当前实现如上所示,可以看到在hibernate属性配置部分,方言为org.hibernate.dialect.MySQLInnoDBDialect,我们需要将这个参数更改为自己所定义的方言路径即可,在本文中,我所使用的路径为com.common.Utils.SQLiteDialect,所以把以上代码片段更改为如下即可
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<!-- 以下用来列出所有的PO映射文件 -->
<value>com/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=com.common.Utils.SQLiteDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true;
</value>
</property>
</bean>
这个时候,我们再去访问sqlite数据库,能够成功使用hibernate的基础dao类去访问它。到此,我们已经成功将mysql连接改为sqlite