Foxnic-SQL (7) —— DAO 特性 : 履行 SQL 句子

概述

  Foxnic-SQL 支撑多种句子履行办法,包含直接履行SQL字符串、履行SQL目标,SQL目标自履行,多句子履行与批量履行。Foxnic-SQL 明显的特征是 DAO 目标既能够履行字符串的 SQL 句子,也能够履行目标化的SQL句子。

  本文中的示例代码均可在 gitee.com/LeeFJ/foxni… 项目中找到。

履行SQL字符串

  SQL 履行最快捷、最能上手的办法,便是直接履行 SQL 字符串。DAO 目标能够履行不带参数或带参数的 SQL 字符串。如下代码所示:

/**
* 1、直接传入字符串的 SQL 句子,并履行
* */
public static void  demo1() {
    // 经过 DBInstance 拿到 DAO 目标
    DAO dao= DBInstance.DEFAULT.dao();
    // 生成 ID
    String id= IDGenerator.getNanoId(8);
    // 刺进
    String insert="insert into example_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)";
    int i=dao.execute(insert,id,"leefj","13852562523","宁波","国内",new Date(),"110", new Date());
    Logger.info("刺进 : "+i);
    // 更新
    i=dao.execute("update example_address set address=? where id=?","上海",id);
    Logger.info("更新 : "+i);
    // 删去
    i=dao.execute("delete from example_address where id=?",id);
    Logger.info("删去 : "+i);
}
履行 SQL 目标

  DAO 目标相同支撑目标话的SQL句子履行。SQL目标化的好处在之前的章节中已经介绍,感兴趣的读者能够检查 Foxnic-SQL 之前的文章《SQL表达式(Expr)》。示例代码如下所示:

import com.github.foxnic.commons.busi.id.IDGenerator;
import com.github.foxnic.dao.data.Rcd;
import com.github.foxnic.sql.expr.Delete;
import com.github.foxnic.sql.expr.Insert;
import com.github.foxnic.sql.expr.Select;
import com.github.foxnic.sql.expr.Update;
import com.leefj.foxnic.sql.demo.config.DBInstance;
import java.util.Date;
public class CRUDBySQLDemo {
    public static void main(String[] args) {
        // 刺进数据
        String id=insertAddress("137771041252");
        System.out.println("addressId(Insert) = "+id);
        // 按ID查询数据
        Rcd address=queryAddress(id);
        if(address!=null) {
            System.out.println(address.toJSONObject());
        }
        // 更新
        if(id!=null) {
            id=updateAddress(id,"13852562523");
            System.out.println("addressId(Update) = "+id);
        }
        // 删去
        if(id!=null) {
            id=deleteAddress(id);
            System.out.println("addressId(Delete) = "+id);
        }
    }
    /**
    * 刺进数据
    * */
    public static String insertAddress(String phone) {
        // 创立句子目标
        Insert insert=new Insert("example_address");
        String id= IDGenerator.getSnowflakeIdString();
        // 设置值
        insert.set("id",id)
            .set("name","leefj")
            // 假如是 null 则不连入SQL句子
            .setIf("phone_number",phone)
            .set("address","宁波")
            .set("region_type","国内")
            .set("create_time",new Date())
            // 设置数据库表达式
            .setExpr("update_time","now()");
        // 输出句子
        System.out.println(insert.getSQL());
        // 履行句子
        Integer suc=DBInstance.DEFAULT.dao().execute(insert);
        // 假如履行成功,回来ID,不然回来 null
        if(suc==1) {
            return id;
        } else {
            return null;
        }
    }
    /**
    * 查询
    * */
    public static Rcd queryAddress(String id) {
        // 创立句子目标
        Select select=new Select("example_address");
        // 设置值
        select.where().and("id=?",id);
        // 输出句子
        System.out.println(select.getSQL());
        // 履行句子
        Rcd address=DBInstance.DEFAULT.dao().queryRecord(select);
        // 假如履行成功,回来记载目标,不然回来 null
        return address;
    }
    /**
    * 更新
    * */
    public static String updateAddress(String id,String phone) {
        // 创立句子目标
        Update update=new Update("example_address");
        // 设置值
        update.setIf("phone_number",phone)
            // 设置数据库表达式
            .setExpr("update_time","now()")
            .set("update_by","110")
            .where().and("id=?",id);
        // 输出句子
        System.out.println(update.getSQL());
        // 履行句子
        Integer suc=DBInstance.DEFAULT.dao().execute(update);
        // 假如履行成功,回来ID,不然回来 null
        if(suc==1) {
            return id;
        } else {
            return null;
        }
    }
    /**
    * 删去
    * */
    public static String deleteAddress(String id) {
        // 创立句子目标
        Delete delete=new Delete("example_address");
    // 设置条件
    delete.where().and("id=?",id);
    // 输出句子
    System.out.println(delete.getSQL());
    // 履行句子
    Integer suc=DBInstance.DEFAULT.dao().execute(delete);
    // 假如履行成功,回来ID,不然回来 null
    if(suc==1) {
    	return id;
    } else {
    	return null;
    }
  }
}
ExecutableSQL 办法履行

  ExecutableSQL 是一个接口,所有完成 ExecutableSQL 接口的 SQL 类都具备句子的履行能力。各种类型的 ExecutableSQL 能够经过 DAO 目标直接创立。示例如下:

/**
* 3、利用SQL目标的  ExecutableSQL 特性履行
* */
public static void  demo3() {
    // 经过 DBInstance 拿到 DAO 目标
    DAO dao= DBInstance.DEFAULT.dao();
    // 生成 ID
    String id= IDGenerator.getNanoId(8);
    // 刺进:经过 DAO 创立一个与 DAO 绑定的 Insert 句子目标
    int i=dao.insert("example_address")
        .set("id",id)
        .set("name","leefj")
        // 假如是 null 则不连入SQL句子
        .setIf("phone_number","13852562523")
        .set("address","宁波")
        .set("region_type","国内")
        .set("create_time",new Date())
        // 设置数据库表达式
        .setExpr("update_time","now()")
        // 履行句子
        .execute();
    Logger.info("刺进 : "+i);
    // 更新
    i=dao.update("example_address").set("address","上海")
        .where("id=?",id)
        // 回来至顶层的 Update 句子目标
        .top()
        .execute();
    Logger.info("更新 : "+i);
    // 删去
    i=dao.delete("example_address")
        .where("id=?",id)
        // 回来至顶层的 Update 句子目标
        .top()
        .execute();
    Logger.info("删去 : "+i);
}
多句子履行

  多句子履行顾名思义便是将多个句子放在一同履行,它们将在一个业务内履行,在不调用业务接口时,能够运用该办法以支撑业务。示例代码如下:

/**
* 多个句子一同履行,这些句子在一个业务内
* */
public static void demo1() {
    // 经过 DBInstance 拿到 DAO 目标
    DAO dao= DBInstance.DEFAULT.dao();
    // 生成 ID
    String id= IDGenerator.getNanoId(8);
    // 刺进
    Expr insert=new Expr("insert into example_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)",
                         id,"leefj","13852562523","宁波","国内",new Date(),"110", new Date());
    Expr update=new Expr("update example_address set address=? where id=?","上海",id);
    Expr delete=new Expr("delete from example_address where id=?",id);
    // 业务内一起履行多个句子,多参数并排
    Integer result=dao.multiExecute(insert,update,delete);
    // 把多个句子独自履行时影响的行数累加后回来
    Logger.info("result = "+result);
    // 产生一个 SQL 目标与字符串混合的 List
    String sqlstr="delete from example_address where id='"+id+"'";
    List sqls= Arrays.asList(insert,update,delete,sqlstr);
    // 业务内一起履行多个句子,传入列表,
    result=dao.multiExecute(sqls);
    // 把多个句子独自履行时影响的行数累加后回来
    Logger.info("result = "+result);
}
批量履行

  批量履行是在大量刺进或更新数据是运用的一种高功能的履行办法,这种办法能够明显提高SQL的履行功率。下面这个示例一起用惯例办法和批量履行刺进数据,批量的时间只要占惯例的1/3。

/**
* 批量履行
* */
public static void demo1() {
    // 经过 DBInstance 拿到 DAO 目标
    DAO dao= DBInstance.DEFAULT.dao();
    // 准备刺进的 SQL 句子
    String insert="insert into example_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)";
    // 功能日志目标
    PerformanceLogger logger=new PerformanceLogger();
    // 功能收集埋点
    logger.collect("惯例刺进开始");
    for (int i = 0; i < 100; i++) {
        String id="batch-"+IDGenerator.getNanoId(6);
        dao.execute(insert,id,"leefj","13852562523","宁波","国内",new Date(),"110", new Date());
    }
    // 功能收集埋点
    logger.collect("惯例刺进完毕");
    // 功能收集埋点
    logger.collect("批量刺进开始");
    BatchParamBuilder paramBuilder=new BatchParamBuilder();
    for (int i = 0; i < 100; i++) {
        String id="batch-"+IDGenerator.getNanoId(6);
        paramBuilder.add(id,"leefj","13852562523","宁波","国内",new Date(),"110", new Date());
    }
    int[] result=dao.batchExecute(insert,paramBuilder.getBatchList());
    // 功能收集埋点
    logger.collect("批量刺进完毕");
    // 打印功能比照
    logger.info("履行功率比照");
    // 输出成果
    for (int i : result) {
        System.out.println("成果:"+ i);
    }
}

  功能比照日志:

┏━━━ PERFORMANCE [ 履行功率比照 , total = 4240 ] ━━━

┣ point : 惯例刺进开始

┣━ cost : 2961

┣ point : 惯例刺进完毕

┣━ cost : 0

┣ point : 批量刺进开始

┣━ cost : 1279

┣ point : 批量刺进完毕

┗━━━ PERFORMANCE [ 履行功率比照 , total = 4240 ] ━━━

小结

  本节首要介绍了怎么运用 Foxnic-SQL 的 DAO 目标运用不同的姿态履行 SQL 句子。本节中展现的比如首要目的是抛砖引玉,为了便利不同场景的调用,DAO 还供给了若干重载办法,以不同的参数形式去履行句子。

相关项目

  gitee.com/LeeFJ/foxni…

  gitee.com/LeeFJ/foxni…

  gitee.com/lank/eam

  gitee.com/LeeFJ/foxni…