Foxnic-SQL (5) —— 创建与初始化DAO
DAO
DAO 对象是 Foxnic-SQL 执行语句并返回结果的核心对象。它包含了众多方法,包括语句的执行、查询、序列、存储过程,元数据等。
本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。
创建与初始化 DAO 只要提供数据库连接信息即可,示例代码如下:
/**
* 创建 DAO 对象
* */
private DAO createDAO(String driverName,String url,String userName,String passwd) {
// 从连接字符串识别数据库类型
DBType dbType=DBType.parseFromURL(url);
// 创建数据源
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverName);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(passwd);
// mysql 关闭,Oracle 建议开启
if(dbType==DBType.ORACLE) {
dataSource.setPoolPreparedStatements(true);
}
// 通过 DAOBuilder 创建 DAO 对象
DAOBuilder builder=new DAOBuilder();
try {
dao=builder.datasource(dataSource).build();
// 设置全局方言
GlobalSettings.DEFAULT_SQL_DIALECT=this.dao.getSQLDialect();
// 设置数据库规约
dao.setDBTreaty(getDBTreaty());
// 设置关系管理器
dao.setRelationManager(new DemoRelationManager());
//设置缓存
FoxnicDataCacheManager cacheManager=new FoxnicDataCacheManager();
CacheProperties cacheProperties=new CacheProperties(SpringUtil.getEnvProperties("foxnic.cache"));
cacheManager.setCacheProperties(cacheProperties);
cacheManager.setRelationManager(dao.getRelationManager());
dao.setDataCacheManager(cacheManager);
// 设置SQL打印
dao.setPrintSQL(true);
dao.setPrintSQLSimple(true);
dao.setPrintSQLCallstack(true);
return dao;
} catch (Exception e) {
Logger.error("创建DAO错误",e);
return null;
}
}
在上面的代码中,首先通过数据库连接信息创建了数据源 DataSource 对象,例子中使用的是 DruidDataSource ,大家也可以按照自己的喜好选择数据源。然后是使用 DAOBuilder 创建 DAO。
GlobalSettings.DEFAULT_SQL_DIALECT 指定了默认的SQL方言。默认情况下为MySQL,如果SQL对象已经关联了DAO,则不使用全局方言,而是使用数据库的本地SQL方言。
接着,为DAO对象设置 DBTreaty 数据库规约对象,DBTreaty 主要是指定一些数据库中约定俗成的东西,后面我们详细讲解。
后面是为 DAO 设置管理管理器和缓存管理器,这两个我们在这里也不做展开,在后面的章节中我们再详细介绍。最后,设置SQL打印日志的几个选项,返回 DAO 对象即可。
下面,我们测试一下 DAO 是否可用:
/**
* DAO 查询示例
* */
public static void demo_1() {
// 通过 DBInstance 拿到 DAO 对象
DAO dao=DBInstance.DEFAULT.dao();
// 执行查询
Integer value = dao.queryInteger("select ?",9090);
// 输出结果
System.out.println("value = "+value);
// 输出 value = 9090
}
配置 DBTreaty
Foxnic-SQL中专抽象了一个概念,叫做数据库规约(DBTreaty),它的作用是统一数据库中通用字段的命名规范,通用值的取值规范等。
- (1) 规范字段
- 创建人ID:默认字段 create_by,规范创建人ID字段,使程序在插入时自动设置改值
- 创建时间:默认字段 create_time,规范创建时间字段,使程序在插入时自动设置改值
- 更新人ID:默认字段 update_by,同上,以此类推。
- 更新时间:默认字段 update_time,同上,以此类推。
- 逻辑删字段:默认字段 deleted,同上,以此类推。
- 删除人ID:默认字段 delete_by,同上,以此类推。
- 删除时间:默认字段 delete_time,同上,以此类推。
- 数据版本:默认字段 version_num,同上,以此类推。
- 租户ID:默认字段:tenant_id,同上,以此类推。
- (2) 规范值以及值类型
- 逻辑值:用于统一数据库中 true/false 逻辑值的实际存储值,方便程序统一处理。
- UserId值类型:用于规范创建人ID、更新人ID、删除人ID等字段的值类型,方便程序处理。
- (3) 辅助方法
- SubjectHandler:用于返回当前登录会话对象。
- LoginUserIdHandler:用于返回当前登录账户ID
- TenantIdHandler:用于返回当前登录账户的租户ID
这里需要特别说明的是 DBTreaty 并未对主键字段的名称和类型做约定,主要考虑主键字段的命名未必需要统一(当然,最好也能统一命名),而且有些情况下还存在联合主键,所以主键规约暂不纳入 DBTreaty 范围内。
以下是创建 DBTreaty 的示例代码:
/**
* 创建一个符合项目设计的数据库规约对象
* */
public DBTreaty getDBTreaty() {
DBTreaty dbTreaty=new DBTreaty();
// 设置是否在没有 where 时可以删除数据
dbTreaty.setAllowDeleteWithoutWhere(false);
// 设置是否在没有 where 时可以更新数据
dbTreaty.setAllowUpdateWithoutWhere(false);
// 设置账户ID字段的类型
dbTreaty.setUserIdDataType(DBDataType.STRING);
// 设置租户ID字段名
dbTreaty.setTenantIdField("tenant_id");
// 设置创建时间字段名
dbTreaty.setCreateTimeField("create_time");
// 设置创建人ID字段名
dbTreaty.setCreateUserIdField("create_by");
dbTreaty.setUpdateTimeField("update_time");
dbTreaty.setUpdateUserIdField("update_by");
dbTreaty.setDeletedField("deleted");
dbTreaty.setDeleteTimeField("delete_time");
dbTreaty.setDeleteUserIdField("delete_by");
dbTreaty.setVersionField("version");
// 设置是否对逻辑值进行转换,建议 false
dbTreaty.setAutoCastLogicField(false);
// 设置 false 对应的数据库值
dbTreaty.setFalseValue(0);
// 设置 true 对应的数据库值
dbTreaty.setTrueValue(1);
// 设置获取当前用户的函数
dbTreaty.setSubjectHandler(()->{
return null;
});
// 设置获取当前登录账户ID的函数
dbTreaty.setLoginUserIdHandler(()->{
return "leefj";
});
// 设置获取当前登录账户的租户ID的函数
dbTreaty.setTenantIdHandler(()->{
return "T001";
});
//
return dbTreaty;
}
DBTreaty 的某些特性会在执行层面体现,还有一部分特性需要引入 Service 层才能体现;例如,setAllowDeleteWithoutWhere 的控制,就可以在执行时体现,但创建人ID、创建时间等字段的自动填充,是需要引入 Service 层的,关于这方面的内容,我们在后面继续介绍。
/**
* DAO 删除校验实例 , 在 DBTreaty.setAllowDeleteWithoutWhere 控制。
* */
public static void demo_2() {
// 通过 DBInstance 拿到 DAO 对象
DAO dao=DBInstance.DEFAULT.dao();
// 执行查询
dao.execute("delete from mytable");
// 抛出异常 : 当前执行的语句 delete from mytable , 缺少 where 条件
}
小结
本节我们主要了解了如何创建并配置 DAO 对象,以及 DBTreaty 数据库规约是怎样的一个概念以及初步的使用方法。在后面的章节中,我们继续介绍 DAO 更多的使用方法。
相关项目
https://gitee.com/LeeFJ/foxnic
https://gitee.com/LeeFJ/foxnic-web
https://gitee.com/lank/eam
https://gitee.com/LeeFJ/foxnic-samples