json怎么读取数据库_如何:使用Json插入数据库并从中读取

json怎么读取数据库

在本文中,我们将为Speedment创建一个插件,该插件使用Gson生成序列化和反序列化逻辑,从而使其在数据库实体和JSON字符串之间进行映射非常容易。 这将有助于展示Speedment代码生成的可扩展性,同时探索Gson库的一些很酷的功能。

Speedment是用于Java的代码生成工具,可连接到数据库并用作生成项目的实体和管理器文件的参考。 该工具是非常模块化的,允许您编写自己的插件来修改结果代码的外观。 几个人在Gitter聊天中提到的一件事是,Speedment实体被声明为抽象,从而阻止了它们自动反序列化。 在本文中,我们将研究如何通过自动为数据库中的每个表生成一个自定义TypeAdapter来使用Gson反序列化Speedment实体。 这不仅可以在使用数据库内容的JSON表示形式时为我们提供更好的性能,而且还可以作为有关如何扩展代码生成器来解决问题的一般示例。

步骤1:创建插件项目

在上一篇文章中,我详细介绍了如何为Speedment创建新的插件,所以这里是简短的版本。 创建一个新的maven项目,并将Speedment和Gson设置为依赖项。

pom.xml

<name>Speedment Gson Plugin</name>
<description>A plugin for Speedment that generates Gson Type Adapters for every table in the database.
</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><speedment.version>2.3.7</speedment.version>
</properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>speedment</artifactId><version>${speedment.version}</version></dependency><dependency><artifactId>gson</artifactId><groupId>com.google.code.gson</groupId><version>2.6.2</version></dependency>
</dependencies>

步骤2:为类型适配器创建翻译器类

接下来,我们需要创建将为我们生成新类型适配器的转换器。 翻译器是一个类,它描述生成的文件将具有的名称,路径和内容。 为此,它提供了许多便利的方法来简化代码生成。 转换器的基本结构如下所示。

GeneratedTypeAdapterTranslator.java

...
public GeneratedTypeAdapterTranslator(Speedment speedment, Generator gen, Table table) {super(speedment, gen, table, Class::of);
}@Override
protected Class makeCodeGenModel(File file) {return newBuilder(file, getClassOrInterfaceName()).forEveryTable((clazz, table) -> {// Code generation goes here}).build();
}@Override
protected String getClassOrInterfaceName() {return "Generated" + getSupport().typeName() + "TypeAdapter";
}@Override
protected String getJavadocRepresentText() {return "A Gson Type Adapter";
}@Override
public boolean isInGeneratedPackage() {return true;
}
...

每个转换器都是使用可使用newBuilder()方法调用的构建器模式构建的。 稍后当我们要修改现有翻译器时,这一点变得很重要。 实际的代码在构建器的forEveryTable()方法内部生成。 这是一个回调,将针对感兴趣范围中遇到的每个表执行该回调。 在这种情况下,翻译器一次只能在一个表上执行,因此回调将只执行一次。

有关GeneratedTypeAdapterTranslator-class的完整资源,请转到此github页面 。

步骤3:创建用于修改管理器界面的装饰器

但是,仅生成一堆TypeAdapter是不够的。 我们希望将新代码集成到已经存在的管理器中。 为此,我们需要定义一个装饰器,该装饰器将在执行默认逻辑后应用于所有生成的管理器。

GeneratedManagerDecorator.java

public final class GeneratedManagerDecorator 
implements TranslatorDecorator<Table, Interface> {@Overridepublic void apply(JavaClassTranslator<Table, Interface> translator) {translator.onMake((file, builder) -> {builder.forEveryTable(Translator.Phase.POST_MAKE, (clazz, table) -> {clazz.add(Method.of("fromJson", translator.getSupport().entityType()).add(Field.of("json", STRING)));});});}
}

装饰器与翻译器类似,不同之处在于它仅定义应对现有文件进行的更改。 每个装饰器都在特定阶段执行。 在本例中,我们要在生成默认代码后执行,因此我们选择POST_MAKE。 我们要添加的逻辑很简单。 在接口中,我们需要fromJson(String)的其他方法。 我们不需要定义toJson,因为每个Speedment管理器已经从继承的接口获得了toJson。

步骤4:创建用于修改Manager实现的装饰器

管理器实现的修改有些棘手。 我们需要为其添加Gson实例作为成员变量,刚刚添加的新接口方法的实现,使用Gson而不是内置序列化器的toJson方法的替代,并且我们需要修改管理器构造函数使用我们的新TypeAdapter实例化Gson。

GeneratedManagerImplDecorator.java

public final class GeneratedManagerImplDecorator 
implements TranslatorDecorator<Table, Class> {@Overridepublic void apply(JavaClassTranslator<Table, Class> translator) {final String entityName = translator.getSupport().entityName();final String typeAdapterName = "Generated" + entityName + "TypeAdapter";final String absoluteTypeAdapterName =translator.getSupport().basePackageName() + ".generated." + typeAdapterName;Final Type entityType = translator.getSupport().entityType();translator.onMake((file, builder) -> {builder.forEveryTable(Translator.Phase.POST_MAKE, (clazz, table) -> {// Make sure GsonBuilder and the generated type adapter // are imported.file.add(Import.of(Type.of(GsonBuilder.class)));file.add(Import.of(Type.of(absoluteTypeAdapterName)));// Add a Gson instance as a private memberclazz.add(Field.of("gson", Type.of(Gson.class)).private_().final_());// Find the constructor and define gson in itclazz.getConstructors().forEach(constr -> {constr.add("this.gson = new GsonBuilder()",indent(".setDateFormat(\"" + DATE_FORMAT + "\")"),indent(".registerTypeAdapter(" + entityName + ".class, new " + typeAdapterName + "(this))"),indent(".create();"));});// Override the toJson()-methodclazz.add(Method.of("toJson", STRING).public_().add(OVERRIDE).add(Field.of("entity", entityType)).add("return gson.toJson(entity, " + entityName + ".class);"));// Override the fromJson()-methodclazz.add(Method.of("fromJson", entityType).public_().add(OVERRIDE).add(Field.of("json", STRING)).add("return gson.fromJson(json, " + entityName + ".class);"));});});}
}

步骤5:将所有新类安装到平台中

创建所有新类后,我们需要创建一个组件和一个组件安装程序,可以从要使用该插件的任何项目中引用该组件和组件安装程序。

GsonComponent.java

public final class GsonComponent extends AbstractComponent {public GsonComponent(Speedment speedment) {super(speedment);}@Overridepublic void onResolve() {final CodeGenerationComponent code = getSpeedment().getCodeGenerationComponent();code.put(Table.class, GeneratedTypeAdapterTranslator.KEY, GeneratedTypeAdapterTranslator::new);code.add(Table.class, StandardTranslatorKey.GENERATED_MANAGER, new GeneratedManagerDecorator());code.add(Table.class,StandardTranslatorKey.GENERATED_MANAGER_IMPL, new GeneratedManagerImplDecorator());}@Overridepublic Class<GsonComponent> getComponentClass() {return GsonComponent.class;}@Overridepublic Software asSoftware() {return AbstractSoftware.with("Gson Plugin", "1.0", APACHE_2);}@Overridepublic Component defaultCopy(Speedment speedment) {return new GsonComponent(speedment);}
}

GsonComponentInstaller.java

public final class GsonComponentInstaller 
implements ComponentConstructor<GsonComponent> {@Overridepublic GsonComponent create(Speedment speedment) {return new GsonComponent(speedment);}
}

用法

当我们要在项目中使用我们的新插件时,我们只需将其作为依赖项添加到pom的依赖项部分中,并作为speedment maven插件下的依赖项进行添加。 然后,我们向插件添加配置标签,如下所示:

<plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>com.speedment.plugins</groupId><artifactId>gson</artifactId><version>1.0.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies><configuration><components><component implementation="com.speedment.plugins.gson.GsonComponentInstaller" /></components></configuration>
</plugin>

然后,我们可以重新生成代码,然后应该可以访问新的序列化和反序列化逻辑。

final String pippi = "{" + "\"id\":1," +"\"bookId\":-8043771945249889258," +"\"borrowedStatus\":\"AVAILABLE\"," + "\"title\":\"Pippi Långström\"," + "\"authors\":\"Astrid Lindgren\"," + "\"published\":\"1945-11-26\"," + "\"summary\":\"A story about the world's strongest little girl.\"" + "}";books.fromJson(pippi).persist();

摘要

在本文中,我们创建了一个新的Speedment插件,该插件为数据库中的每个表生成了Gson TypeAdapters,并将这些适配器与现有的manager集成在一起。 如果您想要更多有关如何使用Speedment代码生成器来提高生产力的示例, 请查看GitHub页面 !

直到下一次!

翻译自: https://www.javacodegeeks.com/2016/10/insert-read-database-using-json.html

json怎么读取数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django连接mysql步骤_使用Django连接Mysql数据库步骤

链接mysql步骤第一步&#xff1a;在终端下载pymysql文件–pip install pymysql第二步&#xff1a;在gjango项目的__init__文件中添加代码import pymysqlpymysql .install_as_MySQLdb()第三步&#xff1a;找到mysql的连接源&#xff0c;然后填信息&#xff0c;如果没有mysql驱动…

HH SaaS电商系统的商品发货策略设计

什么是发货策略 用来指定商品的发货仓库的策略方案&#xff0c;我们在实际的业务开展过程中&#xff0c;同种商品不同的销售渠道也许发货仓库不同&#xff0c;同种商品同个销售渠道在不同的业务开展阶段中也许发货仓库不同&#xff0c;所以需要通过灵活配置发货策略来满足此需…

mysql 上一篇_mysql取上一篇和下一篇的查询

$id 为当前文章 ID获取文章上一篇文章&#xff1a;SELECT id FROM table WHERE id>$id ORDER BY id ASC LIMIT 1获取文章下一篇文章&#xff1a;SELECT id FROM table WHERE id查询思路&#xff1a;获取与该文章同表相连的文章&#xff0c;如果根据分类获取相应的关联文章&a…

jhipster_JHipster入门,第3部分

jhipster欢迎回到本JHipster教程系列&#xff01; 在第一部分中&#xff0c;我们介绍了如何创建整体应用程序。 在第二部分中 &#xff0c;我们逐步创建了一个微服务应用程序&#xff08;这有点复杂&#xff09;。 对于那些正在努力使JHipster正常运转的人&#xff0c;我想着重…

什么是UID、UED、UXD、IXD、UCD、IAD,看这篇就足够了

文章目录UID&#xff1a; User Interface Design 用户界面设计UI&#xff1a;User Interface&#xff08;用户界面&#xff09;UID&#xff08;用户界面设计师&#xff09;UID认知现状UED&#xff1a; User Experience Design 用户体验设计UE or UX&#xff1a; User Experienc…

jhipster_JHipster入门,第2部分

jhipster所以你回来了&#xff01; 在本系列的最后一部分中 &#xff0c;我们采用了单片路线创建了一个JHipster应用程序。 这是红色药丸路线&#xff1b; 生活几乎与您习惯的一样。 但是也许您喜欢挑战。 也许您想超越红色药丸并尝试蓝色药丸。 在这种情况下&#xff0c;Blue…

HH SaaS电商系统的虚拟资金账户(钱包余额)设计

文章目录方案一&#xff0c;将资金账户抽象出来虚拟资金账户余额流水记录实体方案二&#xff0c;用户表直接保存资金余额余额流水记录实体方案一&#xff0c;将资金账户抽象出来 虚拟资金账户 P.S. 如果机构代码和消费代码有区分类型&#xff0c;那么资金账户表中就不必保存“…

jhipster_jHipster入门,第1部分

jhipster因此&#xff0c;您想保持技术的领先地位&#xff0c;但对所有活动部件感到不知所措。 你真幸运&#xff01; 这就是jHipster发光的地方。 如果您喜欢Ruby on Rails或Grails的方法来快速启动和运行应用程序&#xff0c;那么这可能是适合您的选择。 jHipster旨在使设置…

mysql中show属于_mysql show的常见用法

a. show tables或show tables from database_name; // 显示当前数据库中所有表的名称b. show databases; // 显示mysql中所有数据库的名称c. show columns from table_name from database_name; 或show columns from database_name.table_name; // 显示表中列名称d. show gra…

java基准测试_微基准测试进入Java 9

java基准测试我已经几个月没有在这里写文章了&#xff0c;这种例外还会继续。 我计划在明年三月左右恢复写作。 本文末尾的说明。 等待&#xff01; 不完全是最后&#xff0c;因为您可以向下滚动。 它在文章结尾处。 继续阅读&#xff01; 三年前&#xff0c;我在写有关Java编…

python周天为一周的开始_从两个月减肥四十斤说起,不懈坚持,才是一个人最核心的竞争力。...

大学毕业了十年&#xff0c;我的身材失控了十年。我对我的胖身材已经习以为常了十年了&#xff0c;我从来没想过改变&#xff0c;因为我也没有毅力改变。有一句话说的&#xff0c;人越胖&#xff0c;就越懒。因为我胖&#xff0c;所以我不跑步&#xff0c;我也不爱外出。只要你…

MySQL之命令mysql -- MySQL服务器的客户端工具

文章目录命令介绍选项说明-A--executestatement, -e statement参考示例登录数据库执行指定的脚本文件将指定脚本文件的内容导入&#xff08;或者重载&#xff09;到指定数据库中命令介绍 mysql 命令是 MySQL 数据库服务器的客户端工具&#xff0c;它工作在命令行终端中&#x…

eclipse中ast_JavaParser中AST节点的观察者

eclipse中ast我们离JavaParser 3.0的第一个候选发布版本越来越近。 我们添加的最后一项功能是支持观察抽象语法树的所有节点的更改。 当我为此功能编写代码时&#xff0c;我收到了Danny van Bruggen&#xff08;又名Matozoid&#xff09;和Cruz Maximilien的宝贵反馈。 因此&am…

java模拟登陆_java-模拟登陆练习(示例代码)

package com.day5.test;import java.util.Scanner;public class Test1 {/*** param args* 需求&#xff1a;模拟登陆&#xff0c;给三次机会&#xff0c;并提示还有几次* 用户名和密码都是admin* 分析&#xff1a;* 1&#xff0c;模拟登陆&#xff0c;需要键盘录入&#xff0c;…

电商系统的积分(即金币)的设计方案

积分其实就是金币 有些平台把积分和金币拆开独立设计&#xff0c;把金币设计成虚拟货币&#xff0c;而积分可以抵现或者兑换金币&#xff0c;金币可以提现。但是很多平台又将金币和积分的功能合并一起&#xff0c;既可以抵现&#xff0c;又可以提现&#xff0c;而且金币和现金的…

java实现线程的方式_java多线程实现的四种方式

java多线程实现的四种方式1、继承Thread类&#xff0c;重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口&#xff0c;重写run方法3、实现Callable接口&#xff0c;重写call方法(有返回值)4、使用线程池(有返回值)1、继承Thread类&#xff0c;重写run方法…

产品经理是如何管理需求

文章目录一、怎么发现需求二、如何判断需求三、定义用户需求四、定义产品需求五、评估产品需求六、管理产品需求一、怎么发现需求 1、什么是需求 特定的人在特定的情况下产生了特定的问题&#xff0c;并且这种问题是可以被解决的&#xff0c;我们就可以把它叫做需求 2、需求从…

spring boot缓存_Spring Boot和缓存抽象

spring boot缓存缓存是大多数应用程序的主要组成部分&#xff0c;只要我们设法避免磁盘访问&#xff0c;缓存就会保持强劲。 Spring对各种配置的缓存提供了强大的支持 。 您可以根据需要简单地开始&#xff0c;然后进行更多可定制的操作。 这将是spring提供的最简单的缓存形式…

有c基础学java多久_有c十十基础的自学java语言每天6小时要多长时间?

建议花6个月学习。1、前面2个月学习下面这本书。2、后面4个月同时学习数据结构与算法 刷LeetCode 学习Spring BootSpring boot 看这本书 官方文档 找点视频看看。Spring Boot provides a variety of features that address todays business needs with a powerful database…