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

org.dromara.hutool.db.Entity Maven / Gradle / Ivy

There is a newer version: 6.0.0.M3
Show newest version
/*
 * Copyright (c) 2013-2024 Hutool Team and hutool.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.dromara.hutool.db;

import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.set.SetUtil;
import org.dromara.hutool.core.func.SerSupplier;
import org.dromara.hutool.core.map.Dict;
import org.dromara.hutool.core.reflect.method.MethodUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.array.ArrayUtil;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.db.sql.SqlUtil;

import java.nio.charset.Charset;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.RowId;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Set;

/**
 * 数据实体对象
* 数据实体类充当两个角色:
* 1. 数据的载体,一个Entity对应数据库中的一个row
* 2. SQL条件,Entity中的每一个字段对应一个条件,字段值对应条件的值 * * @author loolly */ public class Entity extends Dict { private static final long serialVersionUID = -1951012511464327448L; // --------------------------------------------------------------- Static method start /** * 创建Entity * * @return Entity */ public static Entity of() { return new Entity(); } /** * 创建Entity * * @param tableName 表名 * @return Entity */ public static Entity of(final String tableName) { return new Entity(tableName); } /** * 将PO对象转为Entity * * @param Bean对象类型 * @param bean Bean对象 * @return Entity */ public static Entity parse(final T bean) { return of(null).parseBean(bean); } /** * 将PO对象转为Entity * * @param Bean对象类型 * @param bean Bean对象 * @param isToUnderlineCase 是否转换为下划线模式 * @param ignoreNullValue 是否忽略值为空的字段 * @return Entity */ public static Entity parse(final T bean, final boolean isToUnderlineCase, final boolean ignoreNullValue) { return of(null).parseBean(bean, isToUnderlineCase, ignoreNullValue); } /** * 将PO对象转为Entity,并采用下划线法转换字段 * * @param Bean对象类型 * @param bean Bean对象 * @return Entity */ public static Entity parseWithUnderlineCase(final T bean) { return of(null).parseBean(bean, true, true); } // --------------------------------------------------------------- Static method end /* 表名 */ private String tableName; /* 字段名列表,用于限制加入的字段的值 */ private Set fieldNames; // region ----- Constructor /** * 构造 */ public Entity() { } /** * 构造 * * @param tableName 数据表名 */ public Entity(final String tableName) { this.tableName = tableName; } /** * 构造 * * @param tableName 数据表名 * @param caseInsensitive 是否大小写不敏感 * @since 4.5.16 */ public Entity(final String tableName, final boolean caseInsensitive) { super(caseInsensitive); this.tableName = tableName; } // endregion // --------------------------------------------------------------- Getters and Setters start /** * @return 获得表名 */ public String getTableName() { return tableName; } /** * 设置表名 * * @param tableName 表名 * @return 本身 */ public Entity setTableName(final String tableName) { this.tableName = tableName; return this; } /** * @return 字段集合 */ public Set getFieldNames() { return this.fieldNames; } /** * 设置字段列表,用于限制加入的字段的值 * * @param fieldNames 字段列表 * @return 自身 */ public Entity setFieldNames(final Collection fieldNames) { if (CollUtil.isNotEmpty(fieldNames)) { this.fieldNames = SetUtil.of(true, fieldNames); } return this; } /** * 设置字段列表,用于限制加入的字段的值 * * @param fieldNames 字段列表 * @return 自身 */ public Entity setFieldNames(final String... fieldNames) { if (ArrayUtil.isNotEmpty(fieldNames)) { this.fieldNames = SetUtil.ofLinked(fieldNames); } return this; } /** * 通过lambda批量设置值 * @param fields lambda,不能为空 * @return this */ @Override public Entity setFields(final SerSupplier... fields) { return (Entity) super.setFields(fields); } /** * 添加字段列表 * * @param fieldNames 字段列表 * @return 自身 */ public Entity addFieldNames(final String... fieldNames) { if (ArrayUtil.isNotEmpty(fieldNames)) { if (null == this.fieldNames) { return setFieldNames(fieldNames); } else { Collections.addAll(this.fieldNames, fieldNames); } } return this; } // --------------------------------------------------------------- Getters and Setters end /** * 将值对象转换为Entity
* 类名会被当作表名,小写第一个字母 * * @param Bean对象类型 * @param bean Bean对象 * @return 自己 */ @Override public Entity parseBean(final T bean) { if (StrUtil.isBlank(this.tableName)) { this.setTableName(StrUtil.lowerFirst(bean.getClass().getSimpleName())); } return (Entity) super.parseBean(bean); } /** * 将值对象转换为Entity
* 类名会被当作表名,小写第一个字母 * * @param Bean对象类型 * @param bean Bean对象 * @param isToUnderlineCase 是否转换为下划线模式 * @param ignoreNullValue 是否忽略值为空的字段 * @return 自己 */ @Override public Entity parseBean(final T bean, final boolean isToUnderlineCase, final boolean ignoreNullValue) { if (StrUtil.isBlank(this.tableName)) { final String simpleName = bean.getClass().getSimpleName(); this.setTableName(isToUnderlineCase ? StrUtil.toUnderlineCase(simpleName) : StrUtil.lowerFirst(simpleName)); } return (Entity) super.parseBean(bean, isToUnderlineCase, ignoreNullValue); } /** * 过滤Map保留指定键值对,如果键不存在跳过 * * @param keys 键列表 * @return Dict 结果 * @since 4.0.10 */ @Override public Entity filterNew(final String... keys) { final Entity result = new Entity(this.tableName); result.setFieldNames(this.fieldNames); for (final String key : keys) { if (this.containsKey(key)) { result.put(key, this.get(key)); } } return result; } @Override public Entity removeNew(final String... keys) { return (Entity) super.removeNew(keys); } // -------------------------------------------------------------------- Put and Set start @Override public Entity set(final String field, final Object value) { return (Entity) super.set(field, value); } @Override public Entity setIgnoreNull(final String field, final Object value) { return (Entity) super.setIgnoreNull(field, value); } // -------------------------------------------------------------------- Put and Set end // -------------------------------------------------------------------- Get start /** * 获得Clob类型结果,如果结果类型非Clob,不做转换,直接抛出异常 * * @param field 参数 * @return Clob */ public Clob getClob(final String field) { return (Clob) get(field); } /** * 获得Blob类型结果,如果结果类型非Blob,不做转换,直接抛出异常 * * @param field 参数 * @return Blob * @since 3.0.6 */ public Blob getBlob(final String field) { return (Blob) get(field); } @Override public Time getSqlTime(final String field, final Time defaultValue) { final Object obj = get(field); Time result = null; if (null != obj) { try { result = (Time) obj; } catch (final Exception e) { // try oracle.sql.TIMESTAMP result = MethodUtil.invoke(obj, "timeValue"); } } return ObjUtil.defaultIfNull(result, defaultValue); } @Override public Date getDate(final String field, final Date defaultValue) { final Object obj = get(field); Date result = null; if (null != obj) { try { result = (Date) obj; } catch (final Exception e) { // try oracle.sql.TIMESTAMP result = MethodUtil.invoke(obj, "dateValue"); } } return ObjUtil.defaultIfNull(result, defaultValue); } @Override public Timestamp getSqlTimestamp(final String field, final Timestamp defaultValue) { final Object obj = get(field); Timestamp result = null; if (null != obj) { try { result = (Timestamp) obj; } catch (final Exception e) { // try oracle.sql.TIMESTAMP result = MethodUtil.invoke(obj, "timestampValue"); } } return ObjUtil.defaultIfNull(result, defaultValue); } @Override public String getStr(final String field, final String defaultValue) { return getStr(field, CharsetUtil.UTF_8, defaultValue); } /** * 获得字符串值
* 支持Clob、Blob、RowId * * @param field 字段名 * @param charset 编码 * @param defaultValue 默认值 * @return 字段对应值 */ public String getStr(final String field, final Charset charset, final String defaultValue) { final Object obj = getObj(field, defaultValue); if (obj instanceof Clob) { return SqlUtil.clobToStr((Clob) obj); } else if (obj instanceof Blob) { return SqlUtil.blobToStr((Blob) obj, charset); } else if (obj instanceof RowId) { final RowId rowId = (RowId) obj; return StrUtil.str(rowId.getBytes(), charset); } return super.getStr(field, defaultValue); } /** * 获得rowid * * @return RowId */ public RowId getRowId() { return getRowId("ROWID"); } /** * 获得rowid * * @param field rowid属性名 * @return RowId */ public RowId getRowId(final String field) { final Object obj = this.get(field); if (null == obj) { return null; } if (obj instanceof RowId) { return (RowId) obj; } throw new DbException("Value of field [{}] is not a rowid!", field); } // -------------------------------------------------------------------- Get end // -------------------------------------------------------------------- 特殊方法 start @Override public Entity clone() { return (Entity) super.clone(); } // -------------------------------------------------------------------- 特殊方法 end @Override public String toString() { return "Entity {tableName=" + tableName + ", fieldNames=" + fieldNames + ", fields=" + super.toString() + "}"; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy