Foxnic-SQL(七)——DAO特性:执行SQL语句概述Foxnic-SQL支持多种语句执行方式,包括直接执行SQLSQL对象、SQL对象自执行、多语句执行和批量执行。Foxnic-SQL的显着特点是DAO对象既可以执行字符串SQL语句,也可以执行对象化SQL语句。本文中的示例代码都可以在https://gitee.com/LeeFJ/foxnic-samples项目中找到。执行SQLstringSQL执行SQL最快最方便的方式就是直接执行SQLstring。DAO对象可以执行带参数或不带参数的SQL字符串。代码如下:/***1.直接传入字符串的SQL语句,执行**/publicstaticvoiddemo1(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//生成ID字符串id=IDGenerator.getNanoId(8);//插入字符串insert="insertintoexample_address(id,name,phone_number,address,region_type,region_location,create_by,"+"create_time,update_by,update_time,deleted,delete_by,delete_time,version)"+"VALUES(?,?,?,?,?,NULL,NULL,?,?,?,0,NULL,NULL,1)”;inti=dao.execute(insert,id,"leefj","13852562523","宁波","国内",newDate(),"110",newDate());Logger.info("插入:"+i);//Updatei=dao.execute("updateexample_addresssetaddress=?whereid=?","Shanghai",id);Logger.info("更新:"+i);//deletei=dao.execute("从example_address中删除id=?",id);Logger.info("删除:"+i);}执行SQL对象DAO对象也支持基于对象的SQL语句。SQL对象化的好处在前面的章节中已经介绍过了。有兴趣的读者可以参考Foxnic-SQL之前的文章《SQL表达式(Expr)》。示例代码如下所示:importcom.github.foxnic.commons.busi.id.IDGenerator;importcom.github.foxnic.dao.data.Rcd;importcom.github.foxnic.sql.expr.Delete;importcom.github.foxnic.sql.expr.Insert;导入com.github.foxnic.sql.expr.Select;导入com.github.foxnic.sql.expr.Update;导入com.leefj.foxnic.sql.demo.config.DBInstance;importjava.util.Date;publicclassCRUDBySQLDemo{publicstaticvoidmain(String[]args){//插入数据Stringid=insertAddress("137771041252");System.out.println("addressId(Insert)="+id);//按ID查询数据Rcdaddress=queryAddress(id);if(address!=null){System.out.println(address.toJSONObject());}//更新if(id!=null){id=updateAddress(id,"13852562523");System.out.println("addressId(更新)="+id);}//删除if(id!=null){id=deleteAddress(id);系统.out.println("addressId(删除)="+id);}}/***插入数据**/publicstaticStringinsertAddress(Stringphone){//创建语句对象Insertinsert=newInsert("example_address");Stringid=IDGenerator.getSnowflakeIdString();//设置值insert.set("id",id).set("name","leefj")//如果为null则不连接SQL语句.setIf("phone_number",phone).set("address","Ningbo").set("region_type","Domestic").set("create_time",newDate())//设置数据库expression.setExpr("update_time","now()");//输出语句System.out.println(insert.getSQL());//执行语句Integersuc=DBInstance.DEFAULT.dao().execute(insert);//执行成功返回ID,否则返回nullif(suc==1){returnid;}else{返回空值;}}/***query**/publicstaticRcdqueryAddress(Stringid){//创建语句对象Selectselect=newSelect("example_address");//设置值select.where().and("id=?",id);//输出语句System.out.println(select.getSQL());//执行语句Rcdaddress=DBInstance.DEFAULT.dao().queryRecord(select);//执行成功返回记录对象,否则返回空返回地址;}/***update**/publicstaticStringupdateAddress(Stringid,Stringphone){//创建语句对象Updateupdate=newUpdate("example_address");//设置值更新。setIf("phone_number",phone)//设置数据库expression.setExpr("update_time","now()").set("update_by","110").where().and("id=?",ID);//输出语句System.out.println(update.getSQL());//执行语句Integersuc=DBInstance.DEFAULT.dao().execute(upd吃);//如果成功,返回ID,否则返回nullif(suc==1){returnid;}else{返回空值;}}/***delete**/publicstaticStringdeleteAddress(Stringid){//创建语句对象Deletedelete=newDelete("example_address");//设置条件delete.where().and("id=?",id);//输出语句System.out.println(delete.getSQL());//执行语句Integersuc=DBInstance.DEFAULT.dao().execute(delete);//执行成功返回ID,否则返回nullif(suc==1){returnid;}else{返回空值;}}}ExecutableSQL方式执行ExecutableSQL是一个接口,所有实现了ExecutableSQL接口的SQL类都具有执行语句的能力。通过DAO对象可以直接创建各种类型的ExecutableSQL。示例如下:/***3.利用SQL对象的ExecutableSQL特性执行**/publicstaticvoiddemo3(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//生成ID字符串id=IDGenerator.getNanoId(8);//Insert:通过DAO创建绑定到DAO的Insert语句对象inti=dao.insert("example_address").set("id",id).set("name","leefj")//如果是null,则不会连接SQL语句,newDate())//设置数据库expression.setExpr("update_time","now()")//执行语句.execute();Logger.info("插入:"+i);//Updatei=dao.update("example_address").set("address","Shanghai").where("id=?",id)//返回顶层Update语句object.top()。执行();记录器信息("更新:"+i);//删除i=dao.delete("example_address").where("id=?",id)//返回顶层更新语句object.top().execute();Logger.info("Delete:"+i);}多语句执行多语句执行,顾名思义就是将多条语句一起执行,它们会在一个事务内执行。未调用交易接口时,可使用该方法支持业务示例代码如下:/***多条语句一起执行,这些语句在一个事务中执行**/publicstaticvoiddemo1(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//生成IDStringid=IDGenerator.getNanoId(8);//InsertExprinsert=newExpr("insertintoexample_address(id,name,phone_number,address,region_type,region_location,create_by,create_time,update_by,update_time,deleted,deleted_by,delete_time,version)"+"VALUES(?,?,?,?,?,NULL,NULL,?,?,?,0,NULL,NULL,1)",id,"leefj","13852562523","宁波","国内",newDate(),"110",新日期());exprupdate=newExpr("updateexample_addresssetaddress=?whereid=?","Shanghai",id);Exprdelete=newExpr("从example_address中删除id=?",id);//同时执行事务中的多条语句,多参数并行Integerresult=dao.multiExecute(insert,update,delete);//PutmultipleLogger.info将分别执行的语句影响的行数加起来后返回("结果="+结果);//生成混合字符串的SQL对象列表Stringsqlstr="deletefromexample_addresswhereid='"+id+"'";列表sqls=Arrays.asList(insert,update,delete,sqlstr);//同时执行事务中的多条语句,传入list,result=dao.multiExecute(sqls);//returnLogger.info("分别执行多条语句影响的行数累加后的结果="+result);}批量执行批量执行是在插入或更新大量数据时使用的一种高性能执行方式.这种方法可以显着提高SQL的执行效率。下面的例子同时使用了常规方式和批量执行insert数据,批量时间只占常规方式的1/3。/***批量执行**/publicstaticvoiddemo1(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//要插入的SQL语句Stringinsert="insertintoexample_address"+"(id,name,phone_number,address,region_type,region_location,create_by,create_time,"+"update_by,update_time,deleted,delete_by,delete_time,version)"+"values(?,?,?,?,?,nullfor(inti=0;i<100;i++){Stringid="batch-"+IDGenerator.getNanoId(6);dao.execute(insert,id,"leefj","13852562523","宁波","国内",newDate(),"110",newDate());}//性能采集埋点logger.collect("常规插入结束");//性能采集埋点logger.collect("批量插入开始");BatchParamBuilderparamBuilder=newBatchParamBuilder();对于(inti=0;i<100;i++){Stringid="batch-"+IDGenerator.getNanoId(6);paramBuilder.add(id,"leefj","13852562523","宁波","国内",newDate(),"110",newDate());}int[]result=dao.batchExecute(insert,paramBuilder.getBatchList());//性能采集埋点记录器。collect("批量插入结束");//打印性能比较logger.info("执行效率比较");//输出结果for(inti:result){System.out.println("Result:"+i);}}性能对比日志:┏━━━PERFORMANCE[执行效率对比,总计=4240]━━━┣点数:正则插入开始┣━成本:2961┣点:正则插入结束┣━成本:0┣点:batchInsertstart┣━cost:1279┣point:batchinsertend┗━━━PERFORMANCE[执行效率比较,总计=4240]━━━总结本节主要介绍如何使用Foxnic-SQLDAO对象在不同的??环境下执行SQLpositionsStatements本节展示的例子主要是为了抛砖引玉和起点。为了方便不同场景下的调用,DAO还提供了几种重载方法来执行不同参数形式的语句。相关项目https://gitee.com/LeeFJ/foxnichttps://gitee.com/LeeFJ/foxnic-webhttps://gitee.com/lank/eamhttps://gitee.com/LeeFJ/foxnic-samples
