jpa整合sqlLite
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相关推荐
- Spring JPA整合QueryDSL
前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架 ...
- jpa整合querydsl实现简单查询以及左联查询
用意: 为了解决jpa复杂查询以及多表查询难以的问题,故找到该神器(querydsl),使用该框架后,可以使jpa像mybatis一样灵活,随心所欲.下面的代码只展示了常用的mysql操作,包含动态查 ...
- spring boot jpa 整合
1,Eclipse JPA Tool配置 https://www.cnblogs.com/wgslucky/p/10109300.html 2,项目地址 https://gitee.com/wgslu ...
- java后台如何实现让用户可以在页面修改数据表_长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽......
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...
- Dm8+jpa整合liquibase框架
一.liquibase是什么 LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.它的目标是提供一种数 ...
- 长见识了,Kotlin + SpringBoot + JPA 整合开发比Java更爽...
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:ride segmentfault.com/a/119 ...
- springboot JPA整合国产神通数据库(神州通用数据库)
当前国产软件比较流行,就最近做过的springboot +JPA+神通数据库的项目做下记录供有需要的同学参考. 神通数据库在springboot中的配置和大多关系型数据库基本一样的,只是由于驱动jar ...
- SSH整合JPA+Mysql
一.什么是JPA: (1)JPA(Java Persistence API)即Java持久化规范,他为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关心数据,目的是结束现在Hibe ...
- spring boot2 整合(二)JPA(特别完整!)
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA 的目标之一是制定一个可以由很多供应商 ...
最新文章
- 去除桌面图标蓝底的方法步骤
- 嘿嘿,又中毒了spoolsv.exe
- 爬虫抓取表格中的数据
- 又一个查询,哥整了一天,NND有点受不鸟了
- 分析近5年胡润财富排行榜:江山已易主,这是互联网大佬的时代
- HashMap、weakHashMap、LinkedHashMap和TreeMap四者区别与联系
- Linux 软件安装位置选择指南
- 14届数独-真题标准数独-Day 6-20220121(补)
- Mapbox使用之glyphs(字体符号)
- 学习3D游戏建模线上和线下学习的区别有哪些?
- python添加文字水印中间旋转45度,Python添加pdf水印
- 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
- 关于在线评论有用性的论文研读笔记---10篇
- R语言灰色关联分析法
- 雾霾环保主题动态网站设计作业
- 胡适最著名演讲:天下没有白费的努力!
- 高通android开源代码下载,高通平台开源代码下载
- 有趣的动态规划题目(一)
- 软件测试工程师一分钟自我介绍?
- Visual Studio 2017 RC 下载 最新版本的发行说明