数据库自动化
数据库自动化
FastChar 框架中默认提供了核心数据库自动化功能,通过数据库的 fastchar-database-*.xml 配置后 FastChar 会自动识别 xml 里内容与数据库进行匹配实现如下几个自动操作:
1、数据库是否存在,不存在则创建数据库。
2、表格是否存在,不存在则创建表格。
3、字段是否存在,不存在则添加字段。
4、字段属性是否和绑定的数据库一致,不一致则修改字段。
重要说明
FastChar同步原则是:只增不删。重要的事情再说三遍,只增不删 、 只增不删 、 只增不删
FastChar 绝对不会 主动删除数据库 的任何表或字段或其他配置 或与删除相关的所有操作,更不会主动删除数据库中的数据。
FastChar 数据库自动化 点到为止
是否强制使用
FastChar 不会强制 要求开发者使用数据库自动化功能,所以不用担心强制使用的问题,如果不需要使用,则不用创建任何 fastchar-database-*.xml 即可。
支持的数据库
数据库自动化FastChar默认支持:mysql、sql_server、oracle。
创建数据库xml文件
如果开发需要使用数据库自动化功能,在 classess 目录下创建一个以fastchar-database开头的xml文件,并配置数据库内容即可。 以maven项目为例在 resources 目录下新建,目录如下:
FastCharTest/
└── main/
    ├── java/
    └── resources/
        ├── config.properties
        ├── fastchar-database-appshare.xml # <- 我们在这里
        ├── fastchar-database-default.xml # <- 我们在这里
        └── fastchar-database-pay.xml # <- 我们在这里必读说明
如上所示,创建了三个xml数据库配置文件,最终FastChar框架会自动合并xml里的配置内容, 合并的优先级按照 文件名称正序排序 排序越靠后优先级越高
配置数据库xml文件
具体的xml配置内容以及xml层次结构,如下:
注意
配置数据库xml 需要掌握 数据库的相关知识点。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE database>
<database name="*">
    <table name="fc_user" comment="用户管理">
        <column name="userId" comment="编号" type="int" length="11"
                primary="true" autoincrement="true" nullable="not null"/>
        <column name="userHeadImg" comment="用户头像" type="varchar"
                nullable="null" length="500"/>
        <column name="userNickName" comment="用户昵称" type="varchar"
                nullable="null" length="500"/>
        <column name="userEmail" comment="用户邮箱" type="varchar"
                nullable="null" length="500"/>
        <column name="userPassword" comment="登录密码" type="varchar"
                nullable="null" length="500" password="true"/>
        <column name="userState" comment="用户状态" type="int" length="11"
                nullable="null"/>
        <column name="userDateTime" comment="录入时间" type="datetime"
                nullable="null" length="6"/>
    </table>
</database>在fastchar-database.xml中,使用的标签总共只有三个标签:database、table和column标签,层级关系如上述的案例。
database标签属性
name
- 说明:数据库名称,用于自动创建数据库时传入的数据库名
- 类型:String
- 必填:是
code
- 说明:数据库唯一标识,用于匹配代码中配置的数据源,当code值一致时,检测此数据源并自动同步xml配置
- 必填:否
- 类型:String
- 默认:与 name属性值一致
- 举例:值为 data_source_a表示只同步到此数据源,其他配置的数据源不同步。
enable
- 说明:是否启用此数据库的自定化同步,当为true时,FastChar会自动检测数据库信息,如果不存在则创建!
- 必填:否
- 类型:boolean
- 可选值:true或false
- 默认:true
table标签属性
name
- 说明:数据库名称,用于自动创建表格时传入的表格名称
- 类型:String
- 必填:是
comment
- 说明:表格的备注,如果数据库支持表格备注,则在创建表格时会自动增加备注信息。
- 类型:String
- 必填:否
enable
- 说明:是否启用,当为true时,FastChar会自动检测数据库表格信息,如果表格不存在则创建表格!
- 类型:boolean
- 必填:否
- 可选值:true或false
- 默认:true
column标签属性
name
- 说明:字段名称,用于自动创建表格字段时传入的字段名称
- 类型:String
- 必填:是
comment
- 说明:字段的备注,如果数据库支持表格字段备注,则在创建表格字段时会自动增加备注信息。
- 类型:String
- 必填:否
primary
- 说明:主键字段。
- 必填:否
- 类型:boolean
- 可选值:true或false
autoincrement
- 说明:自增字段。
- 必填:否
- 类型:boolean
- 可选值:true或false
type
- 说明:字段的类型。
- 类型:String
- 必填:是
- 可选值:按照使用的数据库规则配置!
- 举例:mysql数据库字符类型 varchar
length
- 说明: 字段的长度。
- 类型:String
- 必填:是
- 可选值:按照使用的数据库规则配置!
- 举例:mysql中double类型的长度配置 11,2
nullable
- 说明:字段可空
- 必填:否
- 类型:String
- 可选值:null或not null
- 默认:null
charset
- 说明:字段字符集
- 必填:否
- 类型:String
- 可选值:按照使用的数据库规则配置!
- 默认:utf8mb4
value
- 说明:字段默认值
- 必填:否
- 类型:String
encrypt
- 说明:加密字段内容。由 FastEntity 在操作数据库 insert、update、select时预处理数据内容!加密由 字段内容加密 提供支持!
- 必填:否
- 类型:boolean
- 可选值:true或false
password
- 说明:密码字段。由 FastEntity 在操作数据库 insert、update时预处理数据,进行MD5加密内容!加密由 字段内容加密 提供支持!
- 必填:否
- 类型:boolean
- 可选值:true或false
enable
- 说明:是否启用,当为true时,FastChar会自动检测数据库表格字段信息,如果表格不存在字段则创建表格字段!
- 类型:boolean
- 必填:否
- 可选值:true或false
- 默认:true
字段内容加密
IFastColumnSecurity 接口。
FastEntity 在操作数据库 insert、update、select 时,检测字段是否进行加密处理。
FastChar 内置了字段内容 MD5 单向加密 和 AES加解密 由 内容加解密组件 提供支持。
实现 IFastColumnSecurity 接口代码如下:
public class FastColumnSecurity implements IFastColumnSecurity {
    @Override
    public String encrypt(FastColumnInfo<?> columnInfo, String value) {
        if (FastStringUtils.isEmpty(value)) {
            return null;
        }
        if ("md5".equalsIgnoreCase(columnInfo.getEncrypt())) {
            return FastChar.getSecurity().MD5_Encrypt(value);
        } else if ("true".equalsIgnoreCase(columnInfo.getEncrypt())) {
            return FastChar.getSecurity().AES_Encrypt(FastChar.getConstant().getEncryptPassword(), value);
        }
        return value;
    }
    @Override
    public String decrypt(FastColumnInfo<?> columnInfo, String value) {
        if (FastStringUtils.isEmpty(value)) {
            return null;
        }
        if ("true".equalsIgnoreCase(columnInfo.getEncrypt())) {
            return FastChar.getSecurity().AES_Decrypt(FastChar.getConstant().getEncryptPassword(), value);
        }
        return value;
    }
}自定义字段内容加密
如果开发者需要自定义 字段内容加密,只要实现 IFastColumnSecurity 接口, 并注册到 类代理器 中即可。