jpa整合sqlLite

新建标准springboot项目

导入依赖

<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId></dependency>

配置yml文件

spring:application:name: demodatasource:driver-class-name: org.sqlite.JDBCusername:password:url: jdbc:sqlite:E:\project\java_simple\db\##.db  #这里写数据库生成的路径,文件夹路径要存在jpa:database-platform: ####     #这里写SQLiteDialect的引用路径hibernate:ddl-auto: updateshow-sql: trueopen-in-view: false

sqLite的配置类

/*** @author zzs* @date 2021/9/15 15:23*/
public class SQLiteDialect extends Dialect {private final UniqueDelegate uniqueDelegate;public SQLiteDialect() {registerColumnType(Types.BIT, "boolean");//registerColumnType(Types.FLOAT, "float");//registerColumnType(Types.DOUBLE, "double");registerColumnType(Types.DECIMAL, "decimal");registerColumnType(Types.CHAR, "char");registerColumnType(Types.LONGVARCHAR, "longvarchar");registerColumnType(Types.TIMESTAMP, "datetime");registerColumnType(Types.BINARY, "blob");registerColumnType(Types.VARBINARY, "blob");registerColumnType(Types.LONGVARBINARY, "blob");registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", ""));registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2"));registerFunction("quote", new StandardSQLFunction("quote", StandardBasicTypes.STRING));registerFunction("random", new NoArgSQLFunction("random", StandardBasicTypes.INTEGER));registerFunction("round", new StandardSQLFunction("round"));registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING));registerFunction("trim", new AbstractAnsiTrimEmulationFunction() {@Overrideprotected SQLFunction resolveBothSpaceTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1)");}@Overrideprotected SQLFunction resolveBothSpaceTrimFromFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?2)");}@Overrideprotected SQLFunction resolveLeadingSpaceTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1)");}@Overrideprotected SQLFunction resolveTrailingSpaceTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1)");}@Overrideprotected SQLFunction resolveBothTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1, ?2)");}@Overrideprotected SQLFunction resolveLeadingTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1, ?2)");}@Overrideprotected SQLFunction resolveTrailingTrimFunction() {return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1, ?2)");}});uniqueDelegate = new SQLiteUniqueDelegate(this);}private static final SQLiteDialectIdentityColumnSupport IDENTITY_COLUMN_SUPPORT = newSQLiteDialectIdentityColumnSupport();@Overridepublic IdentityColumnSupport getIdentityColumnSupport() {return IDENTITY_COLUMN_SUPPORT;}private static final AbstractLimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {//limit/offset support@Overridepublic String processSql(String sql, RowSelection selection) {final boolean hasOffset = LimitHelper.hasFirstRow(selection);return sql + (hasOffset ? " limit ? offset ?" : " limit ?");}@Overridepublic boolean supportsLimit() {return true;}@Overridepublic boolean bindLimitParametersInReverseOrder() {return true;}};@Overridepublic LimitHandler getLimitHandler() {return LIMIT_HANDLER;}@Overridepublic boolean supportsLockTimeouts() {// lock acquisition supportreturn false;}@Overridepublic String getForUpdateString() {return "";}@Overridepublic boolean supportsOuterJoinForUpdate() {return false;}@Overridepublic boolean supportsCurrentTimestampSelection() {return true;}@Overridepublic boolean isCurrentTimestampSelectStringCallable() {return false;}@Overridepublic String getCurrentTimestampSelectString() {return "select current_timestamp";}private static final int SQLITE_BUSY = 5;private static final int SQLITE_LOCKED = 6;private static final int SQLITE_IOERR = 10;private static final int SQLITE_CORRUPT = 11;private static final int SQLITE_NOTFOUND = 12;private static final int SQLITE_FULL = 13;private static final int SQLITE_CANTOPEN = 14;private static final int SQLITE_PROTOCOL = 15;private static final int SQLITE_TOOBIG = 18;private static final int SQLITE_CONSTRAINT = 19;private static final int SQLITE_MISMATCH = 20;private static final int SQLITE_NOTADB = 26;@Overridepublic SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {return (sqlException, message, sql) -> {final int errorCode = JdbcExceptionHelper.extractErrorCode(sqlException) & 0xFF;if (errorCode == SQLITE_TOOBIG || errorCode == SQLITE_MISMATCH) {return new DataException(message, sqlException, sql);} else if (errorCode == SQLITE_BUSY || errorCode == SQLITE_LOCKED) {return new LockAcquisitionException(message, sqlException, sql);} else if ((errorCode >= SQLITE_IOERR && errorCode <= SQLITE_PROTOCOL) || errorCode == SQLITE_NOTADB) {return new JDBCConnectionException(message, sqlException, sql);}// returning null allows other delegates to operatereturn null;};}@Overridepublic ViolatedConstraintNameExtracter getViolatedConstraintNameExtracter() {return EXTRACTER;}private static final ViolatedConstraintNameExtracter EXTRACTER = new TemplatedViolatedConstraintNameExtracter() {@Overrideprotected String doExtractConstraintName(SQLException sqle) throws NumberFormatException {final int errorCode = JdbcExceptionHelper.extractErrorCode(sqle) & 0xFF;if (errorCode == SQLITE_CONSTRAINT) {return extractUsingTemplate("constraint ", " failed", sqle.getMessage());}return null;}};@Overridepublic boolean supportsUnionAll() {return true;}@Overridepublic boolean canCreateSchema() {return false;}@Overridepublic boolean hasAlterTable() {// As specified in NHibernate dialectreturn false;}@Overridepublic boolean dropConstraints() {return false;}@Overridepublic boolean qualifyIndexName() {return false;}@Overridepublic String getAddColumnString() {return "add column";}@Overridepublic String getDropForeignKeyString() {throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");}@Overridepublic String getAddForeignKeyConstraintString(String constraintName,String[] foreignKey, String referencedTable, String[] primaryKey,boolean referencesPrimaryKey) {throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");}@Overridepublic String getAddPrimaryKeyConstraintString(String constraintName) {throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");}@Overridepublic boolean supportsCommentOn() {return true;}@Overridepublic boolean supportsIfExistsBeforeTableName() {return true;}@Overridepublic boolean doesReadCommittedCauseWritersToBlockReaders() {// TODO Validate (WAL mode...)return true;}@Overridepublic boolean doesRepeatableReadCauseReadersToBlockWriters() {return true;}@Overridepublic boolean supportsTupleDistinctCounts() {return false;}@Overridepublic int getInExpressionCountLimit() {// Compile/runtime time option: http://sqlite.org/limits.html#max_variable_numberreturn 1000;}@Overridepublic UniqueDelegate getUniqueDelegate() {return uniqueDelegate;}private static class SQLiteUniqueDelegate extends DefaultUniqueDelegate {public SQLiteUniqueDelegate(Dialect dialect) {super(dialect);}@Overridepublic String getColumnDefinitionUniquenessFragment(Column column) {return " unique";}}@Overridepublic String getSelectGUIDString() {return "select hex(randomblob(16))";}@Overridepublic ScrollMode defaultScrollMode() {return ScrollMode.FORWARD_ONLY;}
}//我是分界线
/*** @author zzs* @date 2021/9/15 15:30*/
public class SQLiteDialectIdentityColumnSupport extends IdentityColumnSupportImpl {@Overridepublic boolean supportsIdentityColumns() {return true;}@Overridepublic boolean hasDataTypeInIdentityColumn() {return false;}@Overridepublic String getIdentitySelectString(String table, String column, int type) throws MappingException {return "select last_insert_rowid()";}@Overridepublic String getIdentityColumnString(int type) throws MappingException {return "integer";}
}//我是分界线
/*** @author zzs* @date 2021/9/15 16:30*/
@Slf4j
public class SQLiteMetadataBuilderInitializer implements MetadataBuilderInitializer {@Overridepublic void contribute(MetadataBuilder metadataBuilder, StandardServiceRegistry serviceRegistry) {DialectResolver dialectResolver = serviceRegistry.getService(DialectResolver.class);if (!(dialectResolver instanceof DialectResolverSet)) {log.error("DialectResolver '{}' is not an instance of DialectResolverSet, not registering SQLiteDialect",dialectResolver);return;}((DialectResolverSet) dialectResolver).addResolver(resolver);}static private final SQLiteDialect dialect = new SQLiteDialect();static private final DialectResolver resolver = info -> {if("SQLite".equals(info.getDatabaseName())) {return dialect;}return null;};
}
写到这里SqLite就基本能使用了,记得配置数据库路径与类引用路径,然后导入其他依赖。直接利用Jpa就能结合使用了。不过SQLite的时区与本地时区不同。我这边是差8小时,可以手动建表的时候进行设置或代码里面减8小时。

jpa整合sqlLite相关推荐

  1. Spring JPA整合QueryDSL

    前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架 ...

  2. jpa整合querydsl实现简单查询以及左联查询

    用意: 为了解决jpa复杂查询以及多表查询难以的问题,故找到该神器(querydsl),使用该框架后,可以使jpa像mybatis一样灵活,随心所欲.下面的代码只展示了常用的mysql操作,包含动态查 ...

  3. spring boot jpa 整合

    1,Eclipse JPA Tool配置 https://www.cnblogs.com/wgslucky/p/10109300.html 2,项目地址 https://gitee.com/wgslu ...

  4. java后台如何实现让用户可以在页面修改数据表_长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽......

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...

  5. Dm8+jpa整合liquibase框架

    一.liquibase是什么 LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.它的目标是提供一种数 ...

  6. 长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...

  7. springboot JPA整合国产神通数据库(神州通用数据库)

    当前国产软件比较流行,就最近做过的springboot +JPA+神通数据库的项目做下记录供有需要的同学参考. 神通数据库在springboot中的配置和大多关系型数据库基本一样的,只是由于驱动jar ...

  8. SSH整合JPA+Mysql

    一.什么是JPA: (1)JPA(Java Persistence API)即Java持久化规范,他为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关心数据,目的是结束现在Hibe ...

  9. spring boot2 整合(二)JPA(特别完整!)

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA 的目标之一是制定一个可以由很多供应商 ...

最新文章

  1. 去除桌面图标蓝底的方法步骤
  2. 嘿嘿,又中毒了spoolsv.exe
  3. 爬虫抓取表格中的数据
  4. 又一个查询,哥整了一天,NND有点受不鸟了
  5. 分析近5年胡润财富排行榜:江山已易主,这是互联网大佬的时代
  6. HashMap、weakHashMap、LinkedHashMap和TreeMap四者区别与联系
  7. Linux 软件安装位置选择指南
  8. 14届数独-真题标准数独-Day 6-20220121(补)
  9. Mapbox使用之glyphs(字体符号)
  10. 学习3D游戏建模线上和线下学习的区别有哪些?
  11. python添加文字水印中间旋转45度,Python添加pdf水印
  12. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
  13. 关于在线评论有用性的论文研读笔记---10篇
  14. R语言灰色关联分析法
  15. 雾霾环保主题动态网站设计作业
  16. 胡适最著名演讲:天下没有白费的努力!
  17. 高通android开源代码下载,高通平台开源代码下载
  18. 有趣的动态规划题目(一)
  19. 软件测试工程师一分钟自我介绍?
  20. Visual Studio 2017 RC 下载 最新版本的发行说明

热门文章

  1. iOS 13.0 之 presentViewController 模态全屏适配解决方案
  2. 廖壮骏-Android研发工程师-项目经理
  3. 2021CSP比赛小结
  4. IT隐匿者官方解析系统API接口文档
  5. Linux vs Mac:Linux 比 Mac 好的 7 个原因
  6. 江南大学21年计算机考研情况 分数线270分左右,招收调剂,一志愿你对我爱理不理,调剂我让你高攀不起
  7. 把玩爬虫框架Gecco
  8. android 调用系统自带录音实现,语音录制与播放
  9. 全栈开发可能需要的环境及工具
  10. cms php xml,phpcms 定时生成 sitemap 包括 百度 xml文件