springmvc+hibernate+sqlite

今天给大家讲下如何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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值