将数据库切换为sqlite

sqlite和mysql兼容性比较好,使用master分支做很小的调整就可以支持sqlite。

下面介绍如何将master分支经过简单调整将底层数据库从mysql切换为sqlite。

数据库替换

这节描述如何将mysql替换为sqlite。

在本系统中使用的mysql建表语句中,只需要下面字段类型调整下就可以用在sqlite中。

  • 将bigint类型替换为INTEGER
  • 将verchar类型替换为TEXT
  • 将date、datetime类型皆替换为TEXT或INTEGER,我在我司的产品中都是替换为text类型,这样也不用考虑日期格式化的问题。将更改过的语句在mysql中执行即可。

entity模块调整

  • 将实体类中所有日期类型的字段替换为String,当然你也可以直接继续用Date(这样的话,sqlite的对应字段类型必须为INTGER)没错,只需要调整日期类型的属性即可,甚至也不需要调整(如果数据库中对应字段使用INTEGER的话)

业务代码调整

如果在上一小节,你将日期类型调整为String,那么在涉及到所有为entity设置日期属性的时候用DateUtil.getTime()代替new Date()方法即可,DateUtil.getTime() 方法会返回当前日期的yyyy-MM-dd HH:mm:ss格式

大功告成,是不是很简单!

使用sqlite常见问题

No Dialect mapping for JDBC type: 0

  1. org.springframework.orm.jpa.JpaSystemException: No Dialect mapping for JDBC type: 0; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 0

出现这个问题的原因是:返回值返回类型为Null,hibernate不支持SQLite的空值类型,所以需要我们自定义映射关系

  • 解决方法
    • 自定义SQLiteDialect
  1. package cn.enilu.material.config;
  2. import java.sql.Types;
  3. public class SQLiteDialect extends com.enigmabridge.hibernate.dialect.SQLiteDialect {
  4. public SQLiteDialect(){
  5. super();
  6. registerHibernateType(Types.NULL,"null");
  7. }
  8. }
  • 配置该方言
  1. spring.jpa.properties.hibernate.dialect=cn.enilu.material.config.SQLiteDialect

参考资料: