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

sf.database.jdbc.extension.ObjectFastJsonMapping Maven / Gradle / Ivy

The newest version!
package sf.database.jdbc.extension;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.core.JsonProcessingException;
import sf.common.exception.SmallOrmException;
import sf.database.dialect.DBDialect;
import sf.database.jdbc.type.TypeHandler;
import sf.database.meta.ColumnMapping;
import sf.spring.util.Assert;
import sf.tools.StringUtils;

import java.lang.reflect.Type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

/**
 * 扩展Java-DB的映射规则,将复杂对象转换为JSON与数据库中的文本进行对应
 * @author
 */
public class ObjectFastJsonMapping implements TypeHandler {
    private SerializerFeature feature = null;
    private SerializerFeature[] features = new SerializerFeature[0];
    private Class clazz = (Class) Object.class;
    private Type genericType;

    @Override
    public void setDefaultJavaType(Class clz) {
        Assert.notNull(clz, "自定义类型不能为空");
        clazz = clz;
    }

    @Override
    public Class getDefaultJavaType() {
        return clazz;
    }

    @Override
    public int getSqlType() {
        return Types.CLOB;
    }

    @Override
    public void setColumnMapping(ColumnMapping columnMapping) {
        this.genericType = columnMapping.getFieldAccessor().getGenericType();
        this.clazz = (Class) columnMapping.getClz();
    }

    @Override
    public T get(ResultSet rs, int n) throws SQLException {
        String o = rs.getString(n);
        if (StringUtils.isEmpty(o))
            return null;
        return getObject(o);
    }


    @Override
    public T get(ResultSet rs, String columnName) throws SQLException {
        String o = rs.getString(columnName);
        if (StringUtils.isEmpty(o))
            return null;
        return getObject(o);
    }

    @Override
    public T get(CallableStatement cs, int index) throws SQLException {
        String o = cs.getString(index);
        if (StringUtils.isEmpty(o))
            return null;
        return getObject(o);
    }

    @Override
    public T get(CallableStatement cs, String parameterName) throws SQLException {
        String o = cs.getString(parameterName);
        if (StringUtils.isEmpty(o))
            return null;
        return getObject(o);
    }

    private T getObject(String o) {
        if (genericType != null) {
            return JSON.parseObject(o, genericType);
        } else {
            return JSON.parseObject(o, clazz);
        }
    }

    @Override
    public void update(ResultSet rs, String columnLabel, Object value) throws SQLException {
        String s = toJson(value);
        rs.updateString(columnLabel, s);
    }

    @Override
    public void update(ResultSet rs, int columnIndex, Object value) throws SQLException {
        String s = toJson(value);
        rs.updateString(columnIndex, s);
    }

    @Override
    public Object set(PreparedStatement ps, Object obj, int index) throws SQLException {
        if (obj == null) {
            ps.setNull(index, getSqlType());
        } else {
            String s = toJson(obj);
            ps.setString(index, s);
        }
        return null;
    }

    @Override
    public Object set(CallableStatement cs, Object obj, String parameterName) throws SQLException {
        if (obj == null) {
            cs.setNull(parameterName, getSqlType());
        } else {
            String s = toJson(obj);
            cs.setString(parameterName, s);
        }
        return null;
    }

    @Override
    public String getSqlExpression(Object value, DBDialect profile) {
        String s = JSON.toJSONString(value);
        return ObjectJacksonMapping.wrapSqlStr(s);
    }

    public SerializerFeature getFeature() {
        return feature;
    }

    public void setFeature(SerializerFeature feature) {
        this.feature = feature;
        this.features = new SerializerFeature[]{feature};
    }

    protected String toJson(Object obj) {
        if (obj instanceof String) {
            return (String) obj;
        }
        return JSON.toJSONString(obj, features);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy