Foxnic-SQL(五)——创建和初始化DAODAO对象DAO对象是Foxnic-SQL执行语句和返回结果的核心对象。它包含许多方法,包括语句执行、查询、序列、存储过程、元数据等。本文中的示例代码都可以在https://gitee.com/LeeFJ/foxnic-samples项目中找到。创建和初始化DAO只要提供数据库连接信息,示例代码如下:/***CreateDAOobject**/privateDAOcreateDAO(StringdriverName,Stringurl,StringuserName,Stringpasswd){//识别来自连接字符串数据库类型DBTypedbType=DBType.parseFromURL(url);//创建数据源DruidDataSourcedataSource=newDruidDataSource();dataSource.setDriverClassName(driverName);数据源.setUrl(url);dataSource.setUsername(用户名);dataSource.setPassword(密码);//mysql关闭,Oracle建议开启if(dbType==DBType.ORACLE){dataSource.setPoolPreparedStatements(true);}//通过DAOBuilder创建DAO对象DAOBuilderbuilder=newDAOBuilder();尝试{dao=builder.数据源(数据源).build();//设置全球方言GlobalSettings.DEFAULT_SQL_DIALECT=this.dao.getSQLDialect();//设置数据库规范dao.setDBTreaty(getDBTreaty());//设置关系管理器dao.setRelationManager(newDemoRelationManager());//设置缓存FoxnicDataCacheManagercacheManager=newFoxnicDataCacheManager();CachePropertiescacheProperties=newCacheProperties(SpringUtil.getEnvProperties("foxnic.cache"));cacheManager.setCacheProperties(cacheProperties);cacheManager.setRelationManager(dao.getRelationManager());dao.setDataCacheManager(cacheManager);//设置SQL打印dao.设置打印SQL(真);dao.setPrintSQLSimple(true);dao.setPrintSQLCallstack(true);返回道;}catch(Exceptione){Logger.error("创建DAO时出错",e);返回空值;}}在上面的代码中,首先通过数据库连接信息创建了数据源DataSource对象。在示例中,使用了DruidDataSource。你也可以根据自己的喜好选择数据源,然后使用DAOBuilder创建DAO。GlobalSettings.DEFAULT_SQL_DIALECT指定默认的SQL方言。默认是MySQL,如果SQL对象关联了DAO,则不使用全局方言,而是使用数据库的本地SQL方言。接下来,为DAO对象设置DBTreaty数据库规范对象。DBTreaty主要是规定了数据库中一些约定俗成的东西,后面我们会详细说明。后者是为DAO设置管理管理器和缓存管理器。这两个我们这里不展开,在后面的章节中会详细介绍。最后设置SQL打印日志的几个选项,返回DAO对象。接下来我们测试DAO是否可用:/***DAO查询示例**/publicstaticvoiddemo_1(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//执行查询Integervalue=dao.queryInteger("select?,9090);//输出结果System.out.println("value="+value);//Outputvalue=9090}配置DBTreatyFoxnic-SQL抽象出一个概念,称为数据库协议(DBTreaty),其作用是统一数据库中常用字段的命名约定,常用值的取值规范等.(1)标准字段的创建者ID:默认字段create_by,标准创建者ID字段,以便程序在插入时自动设置更改的值。PersonID:默认字段update_by,同上,以此类推。更新时间:默认字段update_time,同上,依此类推。墓碑字段:删除默认字段,同上,以此类推。DeleterID:默认字段delete_by,同上,依此类推。删除时间:默认字段delete_time,同上,依此类推。数据版本:默认字段version_num,同上,依此类推。TenantID:默认字段:tenant_id,同上,依此类推。(2)规范值和值类型逻辑值:用于统一真/假逻辑值在数据库中的实际存储值,方便程序统一处理。UserId值类型:用于规范创建者ID、更新者ID、删除者ID等字段的值类型,方便程序处理。(3)辅助方法SubjectHandler:用于返回当前登录会话对象。LoginUserIdHandler:用于返回当前登录账号IDTenantIdHandler:用于返回当前登录账号的租户ID。这里需要特别说明的是DBTreaty并没有对主键字段的名称和类型做出约定。主要考虑的是主键字段的命名不一定需要统一(当然,最好有一个统一的名字),有些情况下有一个联合主键,所以主键规范是不包括在DBTreaty的范围内。下面是创建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("删除");dbTreaty.setDeleteTimeField("delete_time");dbTreaty.setDeleteUserIdField("delete_by");dbTreaty.setVersionField("版本");//设置是否为逻辑值转换,建议为falsedbTreaty.setAutoCastLogicField(false);//设置false对应的数据库值dbTreaty.setFalseValue(0);//设置true对应的数据库值dbTreaty.setTrueValue(1);//设置获取当前用户的函数dbTreaty.setSubjectHandler(()->{returnnull;});//设置获取当前登录账号ID的函数dbTreaty.setLoginUserIdHandler(()->{return"leefj";});//设置函数获取当前登录账号的租户IDdbTreaty.setTenantIdHandler(()->{return"T001";});//returndbTreaty;}DBTreaty的一些特性会在执行层面体现出来,有些特性需要引入到Service层才能体现出来;比如setAllowDeleteWithoutWhere的控制可以在执行的时候体现出来,但是creator的ID、创建时间等字段的自动填充需要引入到Service层。对于这方面,我们将继续介绍/***DAO删除验证实例,由DBTreaty.setAllowDeleteWithoutWhere控制。**/publicstaticvoiddemo_2(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//执行查询dao.execute("deletefrommytable");//Throwanexception:Thecurrentlyexecutedstatementdeletefrommytable,missingwherecondition}小结本节主要了解如何创建和配置DAO对象,以及DBTreaty数据库协议的概念和初步使用。在后面的章节中,我们会继续介绍更多DAO的使用方法。相关项目https://gitee.com/LeeFJ/foxnichttps://gitee.com/LeeFJ/foxnic-webhttps://gitee.com/lank/eamhttps://gitee.com/LeeFJ/foxnic-samples
