com.xiaoleilu.hutool.db.Entity Maven / Gradle / Ivy
The newest version!
package com.xiaoleilu.hutool.db;
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.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.xiaoleilu.hutool.collection.CollectionUtil;
import com.xiaoleilu.hutool.lang.Dict;
import com.xiaoleilu.hutool.util.ArrayUtil;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.ReflectUtil;
import com.xiaoleilu.hutool.util.StrUtil;
/**
* 数据实体对象
* 数据实体类充当两个角色:
* 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 create() {
return new Entity();
}
/**
* 创建Entity
* @param tableName 表名
* @return Entity
*/
public static Entity create(String tableName) {
return new Entity(tableName);
}
/**
* 将PO对象转为Entity
* @param Bean对象类型
* @param bean Bean对象
* @return Entity
*/
public static Entity parse(T bean) {
return create(null).parseBean(bean);
}
/**
* 将PO对象转为Entity
* @param Bean对象类型
* @param bean Bean对象
* @param isToUnderlineCase 是否转换为下划线模式
* @param ignoreNullValue 是否忽略值为空的字段
* @return Entity
*/
public static Entity parse(T bean,boolean isToUnderlineCase, boolean ignoreNullValue) {
return create(null).parseBean(bean,isToUnderlineCase,ignoreNullValue);
}
/**
* 将PO对象转为Entity,并采用下划线法转换字段
* @param Bean对象类型
* @param bean Bean对象
* @return Entity
*/
public static Entity parseWithUnderlineCase(T bean) {
return create(null).parseBean(bean,true,true);
}
//--------------------------------------------------------------- Static method end
/*表名*/
private String tableName;
/*字段名列表,用于限制加入的字段的值*/
private Set fieldNames;
//--------------------------------------------------------------- Constructor start
public Entity() {
}
/**
* 构造
* @param tableName 数据表名
*/
public Entity(String tableName) {
this.tableName = tableName;
}
//--------------------------------------------------------------- Constructor end
//--------------------------------------------------------------- Getters and Setters start
/**
* @return 获得表名
*/
public String getTableName() {
return tableName;
}
/**
* 设置表名
* @param tableName 表名
* @return 本身
*/
public Entity setTableName(String tableName) {
this.tableName = tableName;
return this;
}
/**
*
* @return 字段集合
*/
public Set getFieldNames() {
return this.fieldNames;
}
/**
* 设置字段列表
* @param fieldNames 字段列表
* @return 自身
*/
public Entity setFieldNames(List fieldNames) {
if(CollectionUtil.isNotEmpty(fieldNames)){
this.fieldNames = new HashSet(fieldNames);
}
return this;
}
/**
* 设置字段列表
* @param fieldNames 字段列表
* @return 自身
*/
public Entity setFieldNames(String... fieldNames) {
if(ArrayUtil.isNotEmpty(fieldNames)){
this.fieldNames = CollectionUtil.newHashSet(fieldNames);
}
return this;
}
/**
* 添加字段列表
* @param fieldNames 字段列表
* @return 自身
*/
public Entity addFieldNames(String... fieldNames) {
if(ArrayUtil.isNotEmpty(fieldNames)){
if(null == this.fieldNames){
return setFieldNames(fieldNames);
}else{
for (String fieldName : fieldNames) {
this.fieldNames.add(fieldName);
}
}
}
return this;
}
//--------------------------------------------------------------- Getters and Setters end
/**
* 将值对象转换为Entity
* 类名会被当作表名,小写第一个字母
*
* @param Bean对象类型
* @param bean Bean对象
* @return 自己
*/
@Override
public Entity parseBean(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(T bean,boolean isToUnderlineCase, boolean ignoreNullValue) {
if(StrUtil.isBlank(this.tableName)) {
String simpleName=bean.getClass().getSimpleName();
this.setTableName(
isToUnderlineCase ? StrUtil.toUnderlineCase(simpleName) : StrUtil.lowerFirst(simpleName)
);
}
return (Entity) super.parseBean(bean,isToUnderlineCase,ignoreNullValue);
}
//-------------------------------------------------------------------- Put and Set start
/**
* PUT方法做了过滤限制,如果此实体限制了属性名,则忽略限制名列表外的字段名
* @param key 名
* @param value 值
*/
@Override
public Object put(String key, Object value) {
if(CollectionUtil.isEmpty(fieldNames) || fieldNames.contains(key)){
super.put(key, value);
}
return null;
}
@Override
public Entity set(String field, Object value) {
return (Entity) super.set(field, value);
}
@Override
public Entity setIgnoreNull(String field, Object value) {
return (Entity) super.setIgnoreNull(field, value);
}
//-------------------------------------------------------------------- Put and Set end
//-------------------------------------------------------------------- Get start
/**
* 获得Clob类型结果
* @param field 参数
* @return Clob
*/
public Clob getClob(String field){
return get(field, null);
}
/**
* 获得Blob类型结果
* @param field 参数
* @return Blob
* @since 3.0.6
*/
public Blob getBlob(String field){
return get(field, null);
}
@Override
public Time getTime(String field) {
Object obj = get(field);
Time result = null;
if(null != obj){
try {
result = (Time)obj;
} catch (Exception e) {
//try oracle.sql.TIMESTAMP
result = ReflectUtil.invoke(obj, "timeValue", new Object[]{});
}
}
return result;
}
@Override
public Date getDate(String field) {
Object obj = get(field);
Date result = null;
if(null != obj){
try {
result = (Date)obj;
} catch (Exception e) {
//try oracle.sql.TIMESTAMP
result = ReflectUtil.invoke(obj, "dateValue", new Object[]{});
}
}
return result;
}
@Override
public Timestamp getTimestamp(String field) {
Object obj = get(field);
Timestamp result = null;
if(null != obj){
try {
result = (Timestamp)obj;
} catch (Exception e) {
//try oracle.sql.TIMESTAMP
result = ReflectUtil.invoke(obj, "timestampValue", new Object[]{});
}
}
return result;
}
@Override
public String getStr(String field) {
return getStr(field, CharsetUtil.CHARSET_UTF_8);
}
/**
* 获得字符串值
* 支持Clob、Blob、RowId
*
* @param field 字段名
* @param charset 编码
* @return 字段对应值
* @since 3.0.6
*/
public String getStr(String field, Charset charset) {
final Object obj = get(field);
if(obj instanceof Clob){
return DbUtil.clobToStr((Clob)obj);
}else if(obj instanceof Blob){
return DbUtil.blobToStr((Blob)obj, charset);
}else if(obj instanceof RowId){
final RowId rowId = (RowId)obj;
return StrUtil.str(rowId.getBytes(), charset);
}
return super.getStr(field);
}
/**
* 获得rowid
* @return RowId
*/
public RowId getRowId(){
return getRowId("ROWID");
}
/**
* 获得rowid
* @param field rowid属性名
* @return RowId
*/
public RowId getRowId(String field){
Object obj = this.get(field);
if(null == obj){
return null;
}
if(obj instanceof RowId){
return (RowId)obj;
}
throw new DbRuntimeException("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 - 2025 Weber Informatics LLC | Privacy Policy