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…