将数据库切换为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
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
package cn.enilu.material.config;
import java.sql.Types;
public class SQLiteDialect extends com.enigmabridge.hibernate.dialect.SQLiteDialect {
public SQLiteDialect(){
super();
registerHibernateType(Types.NULL,"null");
}
}
- 配置该方言
spring.jpa.properties.hibernate.dialect=cn.enilu.material.config.SQLiteDialect
参考资料: