西安做网站维护的公司python怎么学
news/
2025/9/23 6:00:28/
文章来源:
西安做网站维护的公司,python怎么学,网站模板代码怎么写,新手学做网站相关书籍在本文中#xff0c;我们将为Speedment创建一个插件#xff0c;该插件使用Gson生成序列化和反序列化逻辑#xff0c;从而使其在数据库实体和JSON字符串之间进行映射非常容易。 这将有助于展示Speedment代码生成的可扩展性#xff0c;同时探索Gson库的一些很酷的功能。 Spe… 在本文中我们将为Speedment创建一个插件该插件使用Gson生成序列化和反序列化逻辑从而使其在数据库实体和JSON字符串之间进行映射非常容易。 这将有助于展示Speedment代码生成的可扩展性同时探索Gson库的一些很酷的功能。 Speedment是用于Java的代码生成工具它连接到数据库并用作生成项目的实体和管理器文件的参考。 该工具是非常模块化的允许您编写自己的插件来修改结果代码的外观。 几个人在Gitter聊天中提到的一件事是Speedment实体被声明为抽象的这阻止了它们被自动反序列化。 在本文中我们将研究如何通过自动为数据库中的每个表生成一个自定义TypeAdapter来使用Gson反序列化Speedment实体。 这不仅可以在使用数据库内容的JSON表示时为我们提供更好的性能而且还可以作为有关如何扩展代码生成器以解决问题的一般示例。 步骤1创建插件项目 在上一篇文章中我详细介绍了如何为Speedment创建新的插件所以这里是简短的版本。 创建一个新的Maven项目并将Speedment和Gson设置为依赖项。 pom.xml nameSpeedment Gson Plugin/name
descriptionA plugin for Speedment that generates Gson Type Adapters for every table in the database.
/descriptionpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetspeedment.version2.3.7/speedment.version
/propertiesdependenciesdependencygroupIdcom.speedment/groupIdartifactIdspeedment/artifactIdversion${speedment.version}/version/dependencydependencyartifactIdgson/artifactIdgroupIdcom.google.code.gson/groupIdversion2.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 TranslatorDecoratorTable, Interface {Overridepublic void apply(JavaClassTranslatorTable, 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。 我们要添加的逻辑很简单。 在接口中我们需要fromJsonString的其他方法。 我们不需要定义toJson因为每个Speedment管理器都已经从继承的接口获得了toJson。 步骤4创建用于修改Manager实施的装饰器 管理器实现的修改有些棘手。 我们需要为其添加一个Gson实例作为成员变量刚刚添加的新接口方法的实现使用Gson而不是内置序列化器的toJson方法的替代并且我们需要修改manager构造函数使用我们的新TypeAdapter实例化Gson。 GeneratedManagerImplDecorator.java public final class GeneratedManagerImplDecorator
implements TranslatorDecoratorTable, Class {Overridepublic void apply(JavaClassTranslatorTable, 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 ClassGsonComponent 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 ComponentConstructorGsonComponent {Overridepublic GsonComponent create(Speedment speedment) {return new GsonComponent(speedment);}
}用法 当我们想在项目中使用我们的新插件时我们只需将其添加为pom中的依赖项部分中的依赖项以及作为speedment maven插件下的依赖项。 然后我们向插件添加配置标签如下所示 plugingroupIdcom.speedment/groupIdartifactIdspeedment-maven-plugin/artifactIdversion${speedment.version}/versiondependenciesdependencygroupIdcom.speedment.plugins/groupIdartifactIdgson/artifactIdversion1.0.0/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.39/version/dependency/dependenciesconfigurationcomponentscomponent implementationcom.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 worlds strongest little girl.\ };books.fromJson(pippi).persist();摘要 在本文中我们创建了一个新的Speedment插件该插件为数据库中的每个表生成了Gson TypeAdapters并将这些适配器与现有的管理器集成在一起。 如果您想要更多有关如何使用Speedment代码生成器来提高生产力的示例 请查看GitHub页面 直到下一次 翻译自: https://www.javacodegeeks.com/2016/10/insert-read-database-using-json.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911536.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!