APDPlat共支持10种数据库:DB2、DERBY、H2、HSQL、INFORMIX、MYSQL、ORACLE、POSTGRESQL、SQL_SERVER、SYBASE。
数据库的默认配置信息在文件APDPlat_Core/src/main/resources/org/apdplat/db.properties中定义,用户可以根据自己的选择,在APDPlat_Web/src/main/resources/db.local.properties配置文件中覆盖默认配置。
1、如何指定使用哪一种数据库呢?
jpa.database=MYSQL
jpa.database配置项的值可为上述10种数据库之一,10种数据库的JDBC驱动已经集成到APDPlat中,其中5种定义到maven配置文件APDPlat_Web/pom.xml的依赖中,其余5种放置在APDPlat_Web/src/main/webapp/WEB-INF/lib目录中。
2、如何配置数据库连接信息呢?
#mysql db.driver=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/${module.short.name}?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true&autoReconnect=true db.username=root db.password=root jpa.database=MYSQL db.backup.command=mysqldump -u${db.username} -p${db.password} ${module.short.name} db.restore.command=mysql -u${db.username} -p${db.password} ${module.short.name} db.forlog.driver=com.mysql.jdbc.Driver db.forlog.url=jdbc:mysql://localhost:3306/${module.short.name}_for_log?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true&autoReconnect=true db.forlog.username=root db.forlog.password=root jpa.forlog.database=MYSQL
在文件APDPlat_Core/src/main/resources/org/apdplat/db.properties中已经预先定义了10种数据库的连接信息,用户可在此基础上修改成适合自己的连接信息,然后放置到配置文件APDPlat_Web/src/main/resources/db.local.properties中覆盖默认配置。
对于MYSQL数据库来说,因为指定了createDatabaseIfNotExist=true选项,所以会自动建库。ORACLE和SQL_SERVER需要手动建库。其他数据库请参考相关的JDBC编程指南文档,总之,在这里只需要提供标准的JDBC编程所需的信息:driver、url、username、password。
3、表是怎么建的呢?
表是自动建的,不需要手动执行数据库DDL,是由如下配置指定的:
jpa.generateDdl=true
在文件APDPlat_Core/src/main/resources/org/apdplat/db.properties中还定义了数据库连接池以及数据库缓存的配置信息,详情参考配置文件。
4、初始数据是怎么导入的?
初始数据是在系统启动的时候自动导入的,不需要手工执行SQL脚本导入数据。RegisterService抽象类为数据导入提供了支持,在Spring容器初始完毕后就会检查是否需要导入数据,只有在表为空的情况下才会执行导入,也就是说能够保证只会导入一次,执行导入调用的是抽象方法registe,需要子类来实现,这是一个典型的"模板方法"设计模式:
public abstract class RegisterService<T extends Model> implements ApplicationListener { protected final APDPlatLogger LOG = APDPlatLoggerFactory.getAPDPlatLogger(getClass()); @Resource(name="serviceFacade") protected ServiceFacade serviceFacade; @Resource(name="entityManagerFactory") protected EntityManagerFactory entityManagerFactory; protected Class<T> modelClass; @Override public void onApplicationEvent(ApplicationEvent event){ if(event instanceof ContextRefreshedEvent){ this.modelClass = ReflectionUtils.getSuperClassGenricType(getClass()); LOG.info("spring容器初始化完成, 开始检查 "+ModelMetaData.getMetaData(this.modelClass.getSimpleName()) +" 是否需要初始化数据"); if(shouldRegister()){ LOG.info("需要初始化 "+ModelMetaData.getMetaData(this.modelClass.getSimpleName())); openEntityManager(); registe(); closeEntityManager(); registeSuccess(); }else{ LOG.info("不需要初始化 "+ModelMetaData.getMetaData(this.modelClass.getSimpleName())); } } } private void openEntityManager(){ EntityManager em = entityManagerFactory.createEntityManager(); TransactionSynchronizationManager.bindResource(entityManagerFactory, new EntityManagerHolder(em)); LOG.info("打开实体管理器"); } private void closeEntityManager(){ EntityManagerHolder emHolder = (EntityManagerHolder)TransactionSynchronizationManager.unbindResource(entityManagerFactory); LOG.info("关闭实体管理器"); EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager()); } protected void registeSuccess(){ } protected List<T> getRegisteData(){ return null; } protected abstract void registe(); protected boolean shouldRegister() { Page<T> page=serviceFacade.query(modelClass); if(page.getTotalRecords()==0) { return true; } return false; } }
下面我们看一个导入用户数据(至少数据库中有用户数据才能登陆吧)的例子,这里RegisteUser 实现了抽象类RegisterService的抽象方法registe,执行真正的数据导入操作。从这里我们可以看到,用户数据是从类路径下的/data/user.xml文件中获得的。事实上,这个文件是在APDPlat启动的时候从APDPlat_Core-X.X.jar中提取出来的。这里使用了Page的newInstance静态方法把一个XML数据文件转换为了JAVA页面对象。之后设置用户数据的依赖,即用户所属的组织架构和角色,注意这里的导入是有先后顺序的,需要保证顺序。
/** * 注册用户数据,这里需要注意的是: * 因为User有一个Org字段和一个Role列表(protected Org org; protected List<Role> roles = new ArrayList<>();) * 所以要先注册了Org和Role之后才能注册用户 * 但是RegisteUser、RegisteOrg以及RegisteRole都继承自RegisterService * 都实现了Spring的ApplicationListener接口 * 那么Spring会先调用谁呢? * 为了保证先注册Org和Role * RegisteUser类用@Resource注解注入了RegisteOrg和RegisteRole,分别用来获取Org和Role * Spring保证会在装配完成RegisteOrg和RegisteRole之后才装配RegisteUser * 而装配的先后顺序也就是Spring调用实现ApplicationListener接口的Bean的顺序 * 因此,这里的注册数据依赖问题就完美地解决了 * @author 杨尚川 */ @Service public class RegisteUser extends RegisterService<User>{ @Resource(name="registeOrg") protected RegisteOrg registeOrg; @Resource(name="registeRole") protected RegisteRole registeRole; @Override protected void registe() { String xml="/data/user.xml"; LOG.info("注册【"+xml+"】文件"); LOG.info("验证【"+xml+"】文件"); boolean pass=XMLUtils.validateXML(xml); if(!pass){ LOG.info("验证没有通过,请参考dtd文件"); return ; } LOG.info("验证通过"); Page<User> page=Page.newInstance(User.class, RegisteUser.class.getResourceAsStream(xml)); if(page!=null){ for(User user : page.getModels()){ user.setPassword(PasswordEncoder.encode(user.getPassword(), user)); user.setOrg(registeOrg.getRegisteData().get(0)); user.addRole(registeRole.getRegisteData().get(0).getChild().get(0)); serviceFacade.create(user); } } } }
最后看一下数据文件/data/user.xml的内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE page SYSTEM "user.dtd"> <!-- 用户 --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <models> <model xsi:type="User" username="admin" password="admin" enabled="true" des="超级管理员"/> </models> </page>
相关推荐
从给定的SQL Server 2005建库建表脚本中,我们可以提炼出一系列重要的知识点,这些知识点不仅适用于SQL Server 2005,也广泛应用于其他版本的SQL Server以及关系型数据库管理系统(RDBMS)的设计与管理。 ### 1. ...
"插入基础数据"是另一个有用的功能,尤其在系统初始化或测试场景下。工具能自动填充数据库表以模拟实际环境,这对于测试和性能基准测试非常有价值。这些基础数据可以是预定义的样例数据,也可以是从外部源导入的数据...
1:初始化数据库–>创建目标库–>创建元数据表 2:读取Excel–>封装为JavaBean–>添加不存在的表–>修改变动的表–>添加不存在的字段–>修改变动的字段 3:读取Excel–>封装为JavaBean–>生成相对应的java实体 ...
通过这个PPT学习教案,学习者将能够系统地掌握TSQL建库建表的基本操作,为今后深入学习数据库管理和开发奠定坚实基础。随着对TSQL的熟练运用,开发者将能构建高效、安全且适应业务需求的数据库系统。
课程旨在让学习者掌握设计数据库的基本步骤,熟练使用TSQL进行建库、建表、添加约束,并通过编程实现复杂查询、创建索引、视图、存储过程等。 首先,课程强调了TSQL在数据库管理中的重要性,尤其是在实现C#、Java等...
数据库是信息化系统的核心组成部分,它负责存储、管理并提供数据的...在实际工作中,我们应该根据业务需求灵活调整建表脚本,确保数据库设计能够满足实际应用场景的需求,并通过精心设计的初始化数据来验证和优化设计。
自动建库通常会预先定义好表空间和数据文件的大小,以便在创建数据库时自动创建并分配。 6. **角色与权限**:自动建库过程需要适当的系统权限。通常,DBA角色拥有创建数据库的权限,但在非默认配置下,可能需要为...
本课程的目的是帮助学生掌握SQL语言的关键部分,包括建库、建表、添加约束以及创建安全账户。 首先,我们需要理解在需求分析阶段设计数据库的一般步骤。这通常涉及以下环节: 1. 定义实体:识别系统中的主要对象或...
在SQL的世界里,建表语句(CREATE TABLE)和初始化数据是学习数据库管理的基础操作。SQL必知必会是一本非常经典的SQL学习书籍,它详细介绍了如何使用SQL进行数据操作。这里我们将深入探讨这两个关键概念。 首先,让...
这个案例为我们展示了如何集成这两个强大的框架,并利用MyBatis Plus的自动建表特性简化数据库初始化工作。在实际开发中,可以进一步探索MyBatis Plus提供的其他便利功能,如CRUD操作、条件构造器等,以提高开发效率...
### SIM900A 初始化流程详解 #### 一、硬件初始化流程 在开始SIM900A模块的初始化过程之前,首先要确保硬件连接正确无误。以下为SIM900A模块的硬件初始化流程: 1. **确保外围电路正确连接**: - 在给模块上电...
加密过程包括生成密钥、初始化向量,然后对明文数据进行加密,最后将加密后的数据写入DB.ini文件。 在实际应用中,这个工具可能还包含其他功能,比如读取SQL脚本文件、解析脚本内容、提供用户界面等。读取文件可以...
在Oracle 10g数据库管理系统中,创建表空间、数据链路、同义词、序列号和视图是管理和操作数据库的重要环节。下面将详细解释这些概念及其创建语句。 **1. 创建表空间(Tablespaces)** 表空间是Oracle数据库中存储...
在实际操作中,理解并掌握数据的保持性和初始化是确保PLC系统稳定运行的关键。这涉及到对程序设计的理解,包括程序结构、变量管理以及错误处理机制。因此,这份资料的汇总对于TIA博途的使用者来说,无疑是提高编程...
TIA博途中如何将数据块的实际值转到初始值中? 如何使用快照功能?
C# 网口通讯Udp的初始化以及数据的收发 C# 网口通讯Udp的初始化以及数据的收发
通过结合C#的编程能力和SQL Server的数据库功能,我们可以构建一个高效、灵活的自动化建表工具,尤其适合处理包含中文字段的数据。 总的来说,这个C#项目提供了一个实用的方法,用以简化SQL Server数据库的建表过程...
在使用西门子TIA博途( Totally Integrated Automation Portal)编程软件进行自动化系统开发时,有时我们可能需要在已有的优化DB(数据块)中添加新的变量,但又不希望初始化整个DB块,以免丢失已存储的重要数据。...