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>
相关推荐
1:初始化数据库–>创建目标库–>创建元数据表 2:读取Excel–>封装为JavaBean–>添加不存在的表–>修改变动的表–>添加不存在的字段–>修改变动的字段 3:读取Excel–>封装为JavaBean–>生成相对应的java实体 ...
xxl-job-2.2.0版本Oracle建表及初始化语句,建表后需要同步修改Mapper文件,增加oracle驱动依赖,修改数据库连接配置。
SQL必知必会这本书的配套建表语句,以及初始化的语句。方便看这本书的同学自己初始化数据,练习查询
在mysql中创建 oracle scott 用户的四个表及插入初始化数据
springboot+mybatisplus自动建表案例
数据库我很喜欢,自己是用很不错的。自己是哟个资料使用的很好很不错,哈哈哈,使用,自己使用的,很不错数据库
花卉管理系统 数据库脚本 设计 初始化数据 表结构 测试数据 花卉管理系统 数据库脚本 设计 初始化数据 表结构 测试数据 花卉管理系统 数据库脚本 设计 初始化数据 表结构 测试数据 花卉管理系统 数据库脚本 设计 ...
描述了android初始化流程,对各个初始化进程做了简要的分析说明.
SIM900A模块连接示意及初始化流程,及调试流程
TIA博途中如何将数据块的实际值转到初始值中? 如何使用快照功能?
Nacos 2.1.2 数据库初始化脚本
人员和实现在SSH框架下初始化数据.有demo
主要介绍了微信小程序首页数据初始化失败的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
quartz-job数据库初始化表一些表结构整理
C# 网口通讯Udp的初始化以及数据的收发 C# 网口通讯Udp的初始化以及数据的收发
程序和数据段机制能够在数据存储器自动声明变量位置,并以起始值对这些变量进行初始化。应用程序可以将这些变量值缓存在闪存内,并在需要时恢复这些数据。该方法允许基于汇编语言的应用程序充分利用MAX-IDE提供的...
matlab初始化数组
eNodeB CME初始数据配置上机指导书,关于移动通信的内容
ICM20602数据读取及初始化配置,SPI通信,自检,初始化配置,读取数据,有需要的可以拿去使用。
混沌映射sin映射初始化种群,与标准pso求解sphere函数,精度更好