Skip to content

SmartDb超级好用的Sql Builder模式

对于简单的sql操作,可以直接使用ORM或者直接写Sql就可以,但是对于有些复杂的Sql场景如何操作呢,这么这个时候非常好用的Sql Builder 模式闪亮登场,只需2分钟就能带你领略他的强大。

1、SqlBuilder 认知

从字面意义就可以了解,SqlBuilder的含义是 Sql的构造器,所以SmartDb一共提供了5种Sql构造器,分别为:

    1. SelectSqlBuilder 查询语句
    1. InsertSqlBuilder 插入语句
    1. UpdateSqlBuilder 更新语句
    1. DeleteSqlBuilder 删除语句
    1. ReplaceSqlBuilder replace语句

当然以上分别为接口,具体不同的数据库类型有不同的实现方式,可以参考源码进行学习。

2、SqlBuilder 使用

2.1 创建SqlBuilder

可以直接使用 SmartDb 对象获取相关SqlBuilder

java
SelectSqlBuilder selectSqlBuilder = smartDb.selectSqlBuilder();
InsertSqlBuilder insertSqlBuilder = smartDb.insertSqlBuilder();
UpdateSqlBuilder updateSqlBuilder = smartDb.updateSqlBuilder();
DeleteSqlBuilder deleteSqlBuilder = smartDb.deleteSqlBuilder();
ReplaceSqlBuilder replaceSqlBuilder = smartDb.replaceSqlBuilder();

2.2 SqlBuilder方法

  • 1)生成 sql 语句
  • 2)获取 sql 语句的参数
java
// 生成Sql (不换行的sql)
String sql = sqlBuilder.generateSql();
// 生成Sql (换行的sql !)
String sql = sqlBuilder.generateSql(true);
// 获取所有Sql参数
List<Object> allParams = sqlBuilder.getAllParams();

3、插入 InsertSqlBuilder 使用

3.1 sql 语句插入

主要有insertColumninsertFunctionColumn两个方法

  • insertColumn 主要用于 有实际参数的 字段
  • insertFunctionColumn 主要用于方法的字段,比如 now(), uuid(), 等等,需要直接注入的
java
int rows = smartDb.insertSqlBuilder() // 获取 sql builder
        .table("t_user") // 表 名
        .insertColumn("name","") // 列名 和 对应的值
        .insertColumn("city","洛阳") // 列名 和 对应的值
        .insertFunctionColumn("uuid","uuid()") // 列名 , 此列为函数
        .insertFunctionColumn("create_time","now()") // 列名 , 此列为函数
        .execute(); // 执行

3.2 ORM 插入

java
int rows = smartDb.insertSqlBuilder()
        .insertEntity(userEntity) // ORM插入对象(包含属性为null的数据)
        .execute();
		
int rows = smartDb.insertSqlBuilder()
        .insertEntitySelective(userEntity) //  ORM插入对象,排除属性为null的数据
        .execute();

3、查询 SelectSqlBuilder 使用

默认支持 and 、 or 、 like等等
单表查询

java
List<UserEntity> entityList = smartDb.selectSqlBuilder()
        .select("username, city") // 查询 username和city两个自字段,需要用 , 分割
        .select(" update_time") // 查询 update time字段
        .select("create")
        .from("t_user") // 表名
        .whereAnd("id = 1") // and 过滤
        .whereAnd("id = ?", 1)// 切记带上 ? 问号
        .whereAndIn("id", Arrays.asList(1, 2, 3)) // 非常简单的 in 语句
        .whereAndLikePatterns("name", "%卓%") // name 列 like 查询带有 “卓” 的名字
        .whereAndLikeColumns("%卓%", "nickname", "username") // nickname和username 两列 like 查询带有 “卓” 的名字
        // 以下 为 or 语句
        .whereOr("id = 1")
        .whereOrIn("id", Arrays.asList(1, 2, 3)) // 非常简单的 in 语句
        .queryList(UserEntity.class); // 查询列表

多表关联查询: 支持 joinLeft / joinRight / joinFull / joinInner

java
smartDb.selectSqlBuilder()
        .select("t1.name as username")
        .select("t1.city")
        .select("t1.role_name")
        .from("t_user as t1")// 表名 重命名
        .joinLeft("t_user_role t2 on t1.id = t2.user_id") // 关联
        .joinLeft("t_user_position t3 on t1.id = t3.user_id") // 关联 
        .whereAnd("t3.id = ?",1)
        .queryList(UserEntity.class);

分页查询:paginate方法

java
PaginateResult<UserEntity> paginateResult = smartDb.selectSqlBuilder()
        .select("username, city") // 查询 username和city两个自字段,需要用 , 分割
        .select(" update_time") // 查询 update time字段
        .select("create")
        .from("t_user") // 表名
        .whereAnd("id > 1") // and 过滤
        .paginate(UserEntity.class, new SmartDbPaginateParam(1, 10));

4、更新 UpdateSqlBuilder 使用

直接更新

int rows = smartDb.updateSqlBuilder()
        .table("t_user") // 表名
        .updateColumn("name = '卓大'") //字段
        .updateColumn("city = ?","洛阳") // 带参数字段
        .whereAnd("id = ?", 1) // where 同 SelectSqlBuilder
        .execute();

ORM更新

java
int rows = smartDb.updateSqlBuilder()
        .updateEntity(userEntity) // ORM更新对象(包含属性为null的数据)
        .execute();

int rows = smartDb.updateSqlBuilder()
        .updateEntitySelective(userEntity) //  ORM更新对象,排除属性为null的数据
        .execute();

5、删除 DeleteSqlBuilder 使用

和 SelectSqlBuilder 一样

java
int rows = smartDb.deleteSqlBuilder()
        .table("t_user")
        .whereAnd("id = ?", id) // 支持and 和 or
        .execute();

6、替换 ReplaceSqlBuilder 使用

同 InsertSqlBuilder一样