All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.qdbp.jdbc.stream.CrudStream Maven / Gradle / Ivy

package com.gitee.qdbp.jdbc.stream;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.gitee.qdbp.able.enums.LogicType;
import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.able.jdbc.condition.DbUpdate;
import com.gitee.qdbp.able.jdbc.condition.DbUpdateForFieldCore;
import com.gitee.qdbp.able.jdbc.condition.DbUpdateForStartCore;
import com.gitee.qdbp.able.jdbc.condition.DbWhere;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForFieldCore;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForOnFieldless;
import com.gitee.qdbp.able.jdbc.condition.DbWhereForStartCore;
import com.gitee.qdbp.able.jdbc.condition.SkipType;
import com.gitee.qdbp.able.jdbc.fields.ExcludeFields;
import com.gitee.qdbp.able.jdbc.fields.Fields;
import com.gitee.qdbp.able.jdbc.fields.IncludeFields;
import com.gitee.qdbp.able.jdbc.ordering.Orderings;
import com.gitee.qdbp.able.jdbc.paging.Paging;
import com.gitee.qdbp.jdbc.api.CrudDao;
import com.gitee.qdbp.jdbc.exception.DbErrorCode;
import com.gitee.qdbp.jdbc.model.SimpleFieldColumn;
import com.gitee.qdbp.jdbc.utils.ParseTools;
import com.gitee.qdbp.tools.utils.VerifyTools;

/**
 * 单表查询流式操作
 *
 * @author zhaohuihua
 * @version 20210529
 */
public class CrudStream implements Serializable {

    /** serialVersionUID **/
    private static final long serialVersionUID = 1L;

    protected final CrudDao dao;

    public CrudStream(CrudDao dao) {
        this.dao = dao;
    }

    /**
     * 查询指定字段
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .select("id,userCode,realName") // 只查某些字段
        // .selectExclude("password") // 排除掉密码字段
        .list();
     * 
* * @param fields 字段列表 * @return 返回后续流式操作对象 */ public CrudOnAfterSelectStream select(String... fields) { if (fields == null || fields.length == 0) { return new CrudOnAfterSelectStream<>(dao, Fields.ALL); } else { return new CrudOnAfterSelectStream<>(dao, new IncludeFields(fields)); } } /** * 查询指定字段
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .select("id,userCode,realName") // 只查某些字段
        // .selectExclude("password") // 排除掉密码字段
        .list();
     * 
* * @param fields 字段列表 * @return 返回后续流式操作对象 */ public CrudOnAfterSelectStream select(List fields) { return new CrudOnAfterSelectStream<>(dao, new IncludeFields(fields)); } /** * 查询指定字段
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .select(new IncludeFields("id,userCode,realName")) // 只查某些字段
        // .select(new IncludeFields("password")) // 排除掉密码字段
        .list();
     * 
* * @param fields 字段列表 * @return 返回后续流式操作对象 */ public CrudOnAfterSelectStream select(Fields fields) { return new CrudOnAfterSelectStream<>(dao, fields); } /** * 排除指定字段, 只查询不在此列表中的字段
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        // .select("id,userCode,realName") // 只查某些字段
        .selectExclude("password") // 排除掉密码字段
        .list();
     * 
* * @param fields 字段列表 * @return 返回后续流式操作对象 */ public CrudOnAfterSelectStream selectExclude(String... fields) { return new CrudOnAfterSelectStream<>(dao, new ExcludeFields(fields)); } /** * 排除指定字段, 只查询不在此列表中的字段
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        // .select("id,userCode,realName") // 只查某些字段
        .selectExclude("password") // 排除掉密码字段
        .list();
     * 
* * @param fields 字段列表 * @return 返回后续流式操作对象 */ public CrudOnAfterSelectStream selectExclude(List fields) { return new CrudOnAfterSelectStream<>(dao, new ExcludeFields(fields)); } /** * Where条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .where("userType").equals(1)
            .and("createTime").between(DateTools.addDay(now, -1), DateTools.addDay(now, +1))
            .and().subCondition((w) -> {
                w.on("userCode").like("test")
                 .or("realName").like("test");
            })
            .end()
        .orderBy("createTime desc")
        .list();
     * 
     * @param fieldName 字段名称
     * @return 返回后续流式操作对象
     */
    public DbWhereForFieldCore> where(String fieldName) {
        DbWhere where = DbWhere.newEmptiableWhere();
        CrudOnAfterWhereByStream next = new CrudOnAfterWhereByStream<>(dao, where);
        DbWhereForStartCore> start = new DbWhereForStartCore<>(next, where);
        return new DbWhereForFieldCore<>(start, SkipType.NONE, LogicType.AND, fieldName);
    }

    /**
     * 查询条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .where().subCondition((w) -> {
                w.on("userCode").like("test")
                 .or("realName").like("test");
            })
            .and("userType").equals(1)
            .end()
        .orderBy("createTime desc")
        .list();
     * 
     * @return 返回后续流式操作对象
     */
    public DbWhereForOnFieldless> where() {
        DbWhere where = DbWhere.newEmptiableWhere();
        CrudOnAfterWhereByStream next = new CrudOnAfterWhereByStream<>(dao, where);
        DbWhereForStartCore> start = new DbWhereForStartCore<>(next, where);
        return new DbWhereForOnFieldless<>(start, SkipType.NONE);
    }

    /**
     * 设置Where条件
     * 
     * @param where Where条件
     * @return 返回后续流式操作对象
     */
    public CrudOnAfterWhereByStream whereBy(DbWhere where) {
        return new CrudOnAfterWhereByStream<>(dao, where);
    }

    /**
     * 从实体类构建Where对象
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .whereBy(user)
        .list();
     * 
* * @param entity 实体类 * @return 返回后续流式操作对象 * @see ParseTools#parseBeanToDbWhere(Object) */ public CrudOnAfterWhereByStream whereBy(T entity) { DbWhere where = dao.plugins().parseTools().parseBeanToDbWhere(entity); return new CrudOnAfterWhereByStream<>(dao, where); } /** * 从Map构建Where对象
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .whereBy(map)
        .list();
     * 

* 只会包含clazz注解中通过@Column指定的字段名
* 应注意, 此时参数由前端传入, 条件不可控, 也有可能条件为空, 需要仔细检查条件内容, 防止越权操作
     * 转换规则:
        fieldName$Equals(=), fieldName$NotEquals(!=), 
        fieldName$LessThen(<), fieldName$LessEqualsThen(<=), 
        fieldName$GreaterThen(>), fieldName$GreaterEqualsThen(>=), 
        fieldName$IsNull, fieldName$IsNotNull, 
        fieldName$Like, fieldName$NotLike, fieldName$Starts, fieldName$Ends, 
        fieldName$In, fieldName$NotIn, fieldName$Between
     * 
* * @param map Map参数 * @return 返回后续流式操作对象 * @see ParseTools#parseBeanToDbWhere(Object) */ public CrudOnAfterWhereByStream whereBy(Map map) { DbWhere where = dao.plugins().parseTools().parseBeanToDbWhere(map); return new CrudOnAfterWhereByStream<>(dao, where); } /** * 以ID作为查询条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .whereById("U0000001")
        .find();
        // logicalDelete();
        // physicalDelete();
     * 
* * @param id 实体主键 * @return 返回后续流式操作对象 */ public CrudOnAfterByIdStream whereById(Serializable id) { VerifyTools.requireNotBlank(id, "id"); return new CrudOnAfterByIdStream<>(dao, id); } /** * 以ID列表作为查询条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .whereByIds("U0000001", "U0000002", ...)
        .orderBy("createTime desc")
        .list();
     * 
* * @param ids ID列表 * @return 返回后续流式操作对象 */ public CrudOnAfterWhereByStream whereByIds(String... ids) { VerifyTools.requireNotBlank(ids, "ids"); return doWhereByIds(Arrays.asList(ids)); } /** * 以ID列表作为查询条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .whereByIds("U0000001", "U0000002", ...)
        .orderBy("createTime desc")
        .list();
     * 
* * @param ids ID列表 * @return 返回后续流式操作对象 */ public CrudOnAfterWhereByStream whereByIds(Collection ids) { VerifyTools.requireNotBlank(ids, "ids"); return doWhereByIds(ids); } protected CrudOnAfterWhereByStream doWhereByIds(Collection ids) { SimpleFieldColumn pk = dao.sqlHelper().fragment().getPrimaryKey(); if (pk == null) { // 没有找到主键字段 String details = "UnsupportedWhereByIds, class=" + dao.getBeanClass().getName(); throw new ServiceException(DbErrorCode.DB_PRIMARY_KEY_FIELD_IS_UNRESOLVED).setDetails(details); } String primaryField = pk.getFieldName(); DbWhere where = DbWhere.newEmptiableWhere(); where.on(primaryField).in(ids); return new CrudOnAfterWhereByStream<>(dao, where); } /** * 设置OrderBy条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .orderBy("createTime desc")
        .list();
     * 
* * @param orderings OrderBy条件 * @return 返回后续流式操作对象 */ public CrudOnAfterOrderByStream orderBy(String orderings) { return orderBy(Orderings.of(orderings)); } /** * 设置OrderBy条件
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .orderBy("createTime desc")
        .list();
     * 
* * @param orderings OrderBy条件 * @return 返回后续流式操作对象 */ public CrudOnAfterOrderByStream orderBy(Orderings orderings) { return new CrudOnAfterOrderByStream<>(dao, DbWhere.NONE, orderings); } /** * 根据条件分页查询实体列表
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .pageBy(1, 10) // 查第1页,每页10行
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
        // .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
     * 
* * @param pageIndex 第几页 * @param pageSize 每页行数 * @return 列表数据 */ public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize) { return pageBy(new Paging(pageIndex, pageSize)); } /** * 根据条件分页查询实体列表
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .pageBy(1, 10, 88) // 查第1页,每页10行, 88=提前查询的总行数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
        // .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
     * 
* * @param pageIndex 第几页 * @param pageSize 每页行数 * @param total 总行数(用于提前查询总行数的情况) * @return 列表数据 */ public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize, int total) { return pageBy(new Paging(pageIndex, pageSize, total)); } /** * 根据条件分页查询实体列表
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .pageBy(1, 10, false) // 查第1页,每页10行, false=无需统计总数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
        // .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
     * 
* * @param pageIndex 第几页 * @param pageSize 每页行数 * @param needCount 是否统计总数 * @return 列表数据 */ public CrudOnAfterPagingStream pageBy(int pageIndex, int pageSize, boolean needCount) { return pageBy(new Paging(pageIndex, pageSize, needCount)); } /** * 根据条件分页查询实体列表
*
    List<SysUser> users = qdbcBoot.crudStream(SysUser.class)
        .pageBy(new Paging(1,10,false)) // 查第1页,每页10行, false=无需统计总数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
        // .listFieldValues("deptCode", true, String.class).asPartList(); // 查询部门编号, true=去重
     * 
* * @param paging 分页参数 * @return 列表数据 */ public CrudOnAfterPagingStream pageBy(Paging paging) { return new CrudOnAfterPagingStream<>(dao, DbWhere.NONE, Orderings.NONE, paging); } /** * 查询实体全部数据
* List<SysUser> users = qdbcBoot.crudStream(SysUser.class).list(); * * @return 列表数据 */ public List list() { return dao.list(Fields.ALL, DbWhere.NONE, Orderings.NONE); } /** * 根据条件查询某个字段的值列表
*
    List<String> deptCodes = qdbcBoot.crudStream(SysUser.class)
        .listFieldValues("deptCode", true, String.class); // 查询部门编号, true=去重
     * 
* * @param fieldName 指定字段名 * @param distinct 是否去重 * @param valueClazz 字段值类型 * @return 字段的值列表 */ public List listFieldValues(String fieldName, boolean distinct, Class valueClazz) throws ServiceException { return dao.listFieldValues(fieldName, distinct, DbWhere.NONE, Orderings.NONE, valueClazz); } /** * 根据条件统计实体数量
*
    int total = qdbcBoot.crudStream(SysUser.class)
        .count();
     * 
* * @return 数据数量 */ public int count() throws ServiceException { return dao.count(DbWhere.NONE); } /** * 根据条件分组统计实体数量
*
    Map<String, Integer> result = qdbcBoot.crudStream(SysUser.class)
        .groupCount("userType");
    
    SELECT USER_TYPE, COUNT(*) FROM SYS_USER
        GROUP BY USER_TYPE
     * 
* * @param groupBy 分组条件 * @return 分组统计结果 */ public Map groupCount(String groupBy) throws ServiceException { return dao.groupCount(groupBy, DbWhere.NONE); } /** * 开始递归查询
* recursiveBy(codeField, parentField) 按什么字段进行递归查询
* startBy 起始编号
* filterBy 数据过滤条件, 过滤哪些数据参与递归 (如数据状态,租户编号等条件)
* searchBy 结果搜索条件 (如用户输入的查询条件) 这些条件如果放在filterWhere中将无法生成完整的树
* 注意: 查询结果包括startCode节点的自身记录, 如果不需要应在searchWhere条件排除
*
    List<SysDept> depts = qdbcBoot.crudStream(SysDept.class)
        .recursiveBy("deptCode", "parentCode") // 按什么进行递归
        .startBy("D01", "D02") // 起始编号
        .filterBy("tenantCode").equals("T001").end() // 租户编号
        .searchBy("id").notIn("D01", "D02").end() // 查询子节点, 但不要包含起始编号自身
        .listChildren();
        // .listParents();
     * 
* * @param codeField 编号字段名 * @param parentField 上级编号字段名 * @return 返回后续流式操作对象 */ public RecursiveQueryStream recursiveBy(String codeField, String parentField) { return new RecursiveQueryStream<>(dao, codeField, parentField); } /** * 实体类操作
*
    int rows = qdbcBoot.crudStream(SysUser.class)
        .entity(user)
        .insert();
        // .update();
     * 
* * @param entity 实体类 * @return 返回后续流式操作对象 */ public CrudOnAfterEntityStream entity(T entity) { VerifyTools.requireNonNull(entity, "entity"); return new CrudOnAfterEntityStream<>(dao, entity); } /** * 实体类操作
*
    int rows = qdbcBoot.crudStream(SysUser.class)
        .entity(user)
        .insert();
        // .update();
     * 
* * @param entity 实体类 * @return 返回后续流式操作对象 */ public CrudOnAfterEntityStream entity(Map entity) { VerifyTools.requireNotBlank(entity, "entity"); return new CrudOnAfterEntityStream<>(dao, entity); } /** * 实体批量操作
*
    List<String> ids = qdbcBoot.crudStream(SysUser.class)
        .entities(user)
        .insert();
        // .update();
     * 
* * @param entities 实体类 * @return 返回后续流式操作对象 */ public CrudOnAfterEntitiesStream entities(List entities) { return new CrudOnAfterEntitiesStream<>(dao, entities); } /** * 设置更新条件 * * @param ud 更新条件 * @return 返回后续流式操作对象 */ public CrudOnAfterSetByStream updateBy(DbUpdate ud) { return new CrudOnAfterSetByStream<>(dao, ud); } /** * 更新操作
*
    int rows = qdbcBoot.crudStream(SysUser.class)
        .updateSet("userName").to("zhaohuihua") // 用户名修改为指定值
            .set("memberScore").add(+100) // 会员积分增加100
            .set("memberScore").add(-100) // 会员积分减少100
            .set("userState").toNull() // 用户状态修改为空
            .end()
        // .whereById("U0000001")
        .where("userId").equals("U0000001")
            .and("userState").in(UserState.NORMAL, UserState.LOCKED)
            .end()
        .update();
     * 
* * @param fieldName 字段名 * @return 返回后续流式操作对象 */ public DbUpdateForFieldCore> updateSet(String fieldName) { DbUpdate ud = new DbUpdate(); CrudOnAfterSetByStream next = new CrudOnAfterSetByStream<>(dao, ud); DbUpdateForStartCore> start = new DbUpdateForStartCore<>(next, ud); return new DbUpdateForFieldCore<>(start, fieldName); } /** * 更新操作
*
    int rows = qdbcBoot.crudStream(SysUser.class)
        .updateBy()
            // 用户名修改为指定值
            // .ifHasValue() 如果userName有值(不为空)才会添加该条件
            .ifHasValue().set("userName").to(userName)
            // 用户状态修改为空
            // ifTrue(resetState) 如果resetState=true才会添加该条件
            .ifTrue(resetState).set("userState").toNull()
            .end()
        // .whereById("U0000001")
        .where("userId").equals("U0000001")
            .and("userState").in(UserState.NORMAL, UserState.LOCKED)
            .end()
        .update();
     * 
* * @return 返回后续流式操作对象 */ public DbUpdateForStartCore> updateBy() { DbUpdate ud = new DbUpdate(); CrudOnAfterSetByStream next = new CrudOnAfterSetByStream<>(dao, ud); return new DbUpdateForStartCore<>(next, ud); } /** * 逻辑删除全部记录
* qdbcBoot.crudStream(SysUser.class).logicalDelete(); * * @return 删除行数 */ public int logicalDelete() { return dao.logicalDelete(DbWhere.NONE); } /** * 物理删除全部记录
* qdbcBoot.crudStream(SysUser.class).physicalDelete(); * * @return 删除行数 */ public int physicalDelete() { return dao.physicalDelete(DbWhere.NONE); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy