H2Database自定义函数

来源:互联网 发布:网络教育毕业证有用吗 编辑:程序博客网 时间:2024/06/14 09:09

t# H2Database自定义函数

前言

h2数据库其实更多的用在开发中,因为可以内嵌,所以一般作为内存数据库,随用随创,随时删除。其中spring data jpa就使用到了这个数据库,再加上数据库版本控制工具flyway或者liquibase,就可以方便的在各个数据库中进行迁移和升级,我现在一般的工作的方式是开发在h2数据库中,生产环境是mysql的。但是h2在迁移的过程中sql其实很多是通用的。但是不可避免的会出现某些数据库有的函数,h2中没有的情况。所以今天就介绍一下在内嵌的h2数据库中使用自定义函数

条件

首先我这边使用的是spring data jpa和liquibase,项目只需要加个h2database的依赖就可以使用h2点内嵌数据库.简单配置如下

  • gradle中依赖配置
dependencies {    compile('org.springframework.boot:spring-boot-starter-data-jpa')    runtime('org.liquibase:liquibase-core')    runtime('com.h2database:h2')    runtime('mysql:mysql-connector-java')    testCompile("junit:junit")}
  • Spring boot 配置
liquibase.change-log=classpath:/db/develop/db.changelog-master.yaml#liquibase.url=#liquibase.password=#liquibase.user=#liquibase.rollback-file=# JPAspring.jpa.properties.hibernate.hbm2ddl.import_files = classpath:db/develop/import.sqlspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=create-drop# H2 Web Console (H2ConsoleProperties)spring.h2.console.enabled=truespring.h2.console.path=/h2-console

这里解释下liquibase的配置是加载升级的yaml文件,具体的文件格式可以去参考liquibase官网这里我简单的展示一下db.changelog-master.yaml

databaseChangeLog:  - include:        id: 1        author: dzg        file: classpath:db/develop/import.sql

jpa的配置ddl-auto在生产环境中配置成validation,hibernate.hbm2ddl.import_files是不需要配置,只是为了初始化开发的时候内存数据库.

h2的配置就两个,第二个是可以在浏览器访问h2的url链接,默认用户sa,密码无,默认jdbc链接jdbc:h2:mem:testdb

自定义函数

我这是参考h2官网的自定义函数,自己能看懂最好,官网介绍的有两种一种是引入java类的形式,方法必须是公开静态的,官网有例子,另外一种就是直接源码的形式可以去看官网的第二个例子。

我这里使用的是第一种方式。由于需要临时编译,所以java库中需要tools.jar包,我这是开发环境,肯定是有的。

首先我建立了自己的函数如下

package org.h2.databse.function;/** * @author dzg * @since 2017/4/25. */public class Function {    public static long GetNumericIP(String standardIP) {        if (standardIP != null && standardIP.length() >= 4) {            String[] ipStr = standardIP.split("\\.");            if (ipStr.length == 4) {                return (Long.valueOf(ipStr[0]) << 24) + (Long.valueOf(ipStr[1]) << 16) +                        (Long.valueOf(ipStr[2]) << 8) + (Long.valueOf(ipStr[3]));            }        }        return 0;    }    public static String GetStandardIP(long numericIP) {        String w = String.valueOf(numericIP >> 24);        String x = String.valueOf((numericIP >> 16) % 256);        String y = String.valueOf((numericIP >> 8) % 256);        String z = String.valueOf(numericIP % 256);        return w + "." + x + "." + y + "." + z;    }}

然后我在我的import.sql中加了一句sql如下

CREATE ALIAS INET_ATON FOR "org.h2.databse.function.Function.GetNumericIP";

之后就可以正常的使用INET_ATON这个函数了,也不会出现问题
更多博客请移步我的私人博客

0 0
原创粉丝点击