Search in sources :

Example 6 with TableMapper

use of indi.mybatis.flying.models.TableMapper in project mybatis.flying by limeng32.

the class SqlBuilder method buildInsertSql.

/**
 * 由传入的对象生成insert sql语句
 *
 * @param object
 *            pojo @return String @throws IllegalAccessException @throws
 *            IllegalArgumentException @throws NoSuchFieldException @throws
 *            SecurityException @throws NoSuchMethodException @throws
 *            InvocationTargetException @throws Exception
 *            RuntimeException @throws
 */
public static String buildInsertSql(Object object, FlyingModel flyingModel) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    String ignoreTag = flyingModel.getIgnoreTag();
    KeyHandler keyHandler = flyingModel.getKeyHandler();
    Map<?, ?> dtoFieldMap = PropertyUtils.describe(object);
    TableMapper tableMapper = buildTableMapper(getTableMappedClass(object.getClass()));
    String tableName = tableMapper.getTableName();
    tableSql = new StringBuffer();
    StringBuffer valueSql = new StringBuffer();
    tableSql.append(INSERT_INTO_).append(tableName).append(_OPENPAREN);
    valueSql.append(VALUES_OPENPAREN);
    boolean allFieldNull = true;
    boolean uniqueKeyHandled = false;
    for (FieldMapper fieldMapper : tableMapper.getFieldMapperCache().values()) {
        Object value = dtoFieldMap.get(fieldMapper.getFieldName());
        if (!fieldMapper.isInsertAble() || ((value == null && !fieldMapper.isOpVersionLock()) || (fieldMapper.getIgnoreTagSet().contains(ignoreTag)))) {
            continue;
        } else if (((FieldMapper) fieldMapper).isOpVersionLock()) {
            value = 0;
            ReflectHelper.setValueByFieldName(object, fieldMapper.getFieldName(), value);
        }
        allFieldNull = false;
        tableSql.append(fieldMapper.getDbFieldName()).append(COMMA);
        valueSql.append(POUND_OPENBRACE);
        if (fieldMapper.isForeignKey() || fieldMapper.isCrossDbForeignKey()) {
            valueSql.append(fieldMapper.getFieldName()).append(DOT).append(fieldMapper.getForeignFieldName());
        } else {
            valueSql.append(fieldMapper.getFieldName());
        }
        valueSql.append(COMMA).append(JDBCTYPE_EQUAL).append(fieldMapper.getJdbcType().toString());
        if (fieldMapper.getTypeHandlerPath() != null) {
            valueSql.append(COMMA_TYPEHANDLER_EQUAL).append(fieldMapper.getTypeHandlerPath());
        }
        if (fieldMapper.isUniqueKey()) {
            uniqueKeyHandled = true;
            if (keyHandler != null) {
                handleInsertSql(keyHandler, valueSql, fieldMapper, object, uniqueKeyHandled);
            }
        }
        valueSql.append(CLOSEBRACE_COMMA);
    }
    if (keyHandler != null && !uniqueKeyHandled) {
        FieldMapper temp = tableMapper.getUniqueKeyNames()[0];
        tableSql.append(temp.getDbFieldName()).append(COMMA);
        handleInsertSql(keyHandler, valueSql, temp, object, uniqueKeyHandled);
    }
    if (allFieldNull) {
        throw new BuildSqlException(BuildSqlExceptionEnum.nullField);
    }
    tableSql.delete(tableSql.lastIndexOf(COMMA), tableSql.lastIndexOf(COMMA) + 1);
    valueSql.delete(valueSql.lastIndexOf(COMMA), valueSql.lastIndexOf(COMMA) + 1);
    return tableSql.append(CLOSEPAREN_).append(valueSql).append(CLOSEPAREN).toString();
}
Also used : BuildSqlException(indi.mybatis.flying.exception.BuildSqlException) TableMapper(indi.mybatis.flying.models.TableMapper) KeyHandler(indi.mybatis.flying.type.KeyHandler) FieldMapper(indi.mybatis.flying.models.FieldMapper)

Example 7 with TableMapper

use of indi.mybatis.flying.models.TableMapper in project mybatis.flying by limeng32.

the class SqlBuilder method dealMapperAnnotationIterationForCount.

private static void dealMapperAnnotationIterationForCount(Object object, StringBuffer fromSql, StringBuffer whereSql, TableName originTableName, Mapperable originFieldMapper, String fieldPerfix, AtomicInteger index, TableName lastTableName) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    Map<?, ?> dtoFieldMap = PropertyUtils.describe(object);
    TableMapper tableMapper = buildTableMapper(getTableMappedClass(object.getClass()));
    QueryMapper queryMapper = buildQueryMapper(object.getClass(), getTableMappedClass(object.getClass()));
    TableName tableName = new TableName(tableMapper, index.getAndIncrement(), lastTableName.getMap());
    /*
		 * 在第一次遍历中,处理好fromSql。 如果originFieldMapper为null则可认为是第一次遍历
		 */
    if (originFieldMapper == null) {
        fromSql.append(tableName.sqlSelect());
    }
    /*
		 * 在非第一次遍历中,处理fieldPerfix和fromSql。
		 * 如果originFieldMapper和originTableName均不为null则可认为是非第一次遍历
		 */
    String temp = null;
    if (originFieldMapper != null && originTableName != null) {
        /* 处理fieldPerfix */
        temp = originFieldMapper.getFieldName();
        if (fieldPerfix != null) {
            temp = fieldPerfix + DOT + temp;
        }
        /* 处理fromSql */
        fromSql.append(_LEFT_JOIN_).append(tableName.sqlSelect()).append(_ON_).append(originTableName.sqlWhere()).append(originFieldMapper.getDbFieldName()).append(_EQUAL_).append(tableName.sqlWhere()).append(originFieldMapper.getDbAssociationUniqueKey());
    }
    /* 处理fieldMapper中的条件 */
    for (Mapperable fieldMapper : tableMapper.getFieldMapperCache().values()) {
        Object value = dtoFieldMap.get(fieldMapper.getFieldName());
        if (value == null) {
            continue;
        }
        /* 此处当value拥有TableMapper或QueryMapper标注时,开始进行迭代 */
        if (fieldMapper.isForeignKey()) {
            dealMapperAnnotationIterationForCount(value, fromSql, whereSql, tableName, fieldMapper, temp, index, tableName);
        } else {
            dealConditionEqual(whereSql, fieldMapper, tableName, temp, false, 0);
        }
    }
    /* 处理queryMapper中的“且”条件 */
    for (ConditionMapper conditionMapper : queryMapper.getConditionMapperCache().values()) {
        Object value = dtoFieldMap.get(conditionMapper.getFieldName());
        if (value == null) {
            continue;
        }
        dealConditionMapper(conditionMapper, value, whereSql, tableName, temp, false, 0);
    }
    /* 处理queryMapper中的“或”条件 */
    for (OrMapper orMapper : queryMapper.getOrMapperCache().values()) {
        Object value = dtoFieldMap.get(orMapper.getFieldName());
        if (value == null) {
            continue;
        }
        dealConditionOrMapper(orMapper, value, whereSql, tableName, temp);
    }
}
Also used : TableName(indi.mybatis.flying.models.TableName) ConditionMapper(indi.mybatis.flying.models.ConditionMapper) OrMapper(indi.mybatis.flying.models.OrMapper) TableMapper(indi.mybatis.flying.models.TableMapper) Mapperable(indi.mybatis.flying.models.Mapperable) QueryMapper(indi.mybatis.flying.models.QueryMapper)

Example 8 with TableMapper

use of indi.mybatis.flying.models.TableMapper in project mybatis.flying by limeng32.

the class SqlBuilder method buildDeleteSql.

/**
 * 由传入的对象生成delete sql语句
 *
 * @param object
 *            pojo
 * @return sql
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 * @throws IllegalAccessException
 * @throws RuntimeException
 */
public static String buildDeleteSql(Object object) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    if (null == object) {
        throw new BuildSqlException(BuildSqlExceptionEnum.nullObject);
    }
    Map<?, ?> dtoFieldMap = PropertyUtils.describe(object);
    TableMapper tableMapper = buildTableMapper(getTableMappedClass(object.getClass()));
    String tableName = tableMapper.getTableName();
    StringBuffer sql = new StringBuffer();
    sql.append(DELETE_FROM_).append(tableName).append(WHERE_);
    for (FieldMapper fieldMapper : tableMapper.getUniqueKeyNames()) {
        sql.append(fieldMapper.getDbFieldName());
        Object value = dtoFieldMap.get(fieldMapper.getFieldName());
        if (value == null) {
            throw new BuildSqlException(new StringBuffer(BuildSqlExceptionEnum.deleteUniqueKeyIsNull.toString()).append(fieldMapper.getDbFieldName()).toString());
        }
        sql.append(EQUAL_POUND_OPENBRACE).append(fieldMapper.getFieldName()).append(COMMA).append(JDBCTYPE_EQUAL).append(fieldMapper.getJdbcType().toString()).append(CLOSEBRACE_AND_);
    }
    for (FieldMapper f : tableMapper.getOpVersionLocks()) {
        sql.append(f.getDbFieldName()).append(EQUAL_POUND_OPENBRACE).append(f.getFieldName()).append(CLOSEBRACE_AND_);
    }
    sql.delete(sql.lastIndexOf(AND), sql.lastIndexOf(AND) + 3);
    return sql.toString();
}
Also used : BuildSqlException(indi.mybatis.flying.exception.BuildSqlException) TableMapper(indi.mybatis.flying.models.TableMapper) FieldMapper(indi.mybatis.flying.models.FieldMapper)

Example 9 with TableMapper

use of indi.mybatis.flying.models.TableMapper in project mybatis.flying by limeng32.

the class SqlBuilder method buildCountSql.

/**
 * 由传入的对象生成count sql语句
 *
 * @param object
 *            pojo
 * @return sql
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 * @throws IllegalAccessException
 * @throws RuntimeException
 */
public static String buildCountSql(Object object) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    if (null == object) {
        throw new BuildSqlException(BuildSqlExceptionEnum.nullObject);
    }
    TableMapper tableMapper = buildTableMapper(getTableMappedClass(object.getClass()));
    ai = new AtomicInteger(0);
    TableName tableName = new TableName(tableMapper, 0, null);
    selectSql = new StringBuffer();
    selectSql.append(SELECT_COUNT_OPENPAREN).append(tableName.sqlWhere());
    /*
		 * 如果有且只有一个主键,采用select count("主键")的方式;如果无主键或有多个主键(联合主键),采用select
		 * count(*)的方式。
		 */
    if (tableMapper.getUniqueKeyNames().length == 1) {
        selectSql.append(tableMapper.getUniqueKeyNames()[0].getDbFieldName());
    } else {
        selectSql.append(ASTERISK);
    }
    selectSql.append(CLOSEPAREN);
    fromSql = new StringBuffer(FROM);
    whereSql = new StringBuffer(WHERE_);
    dealMapperAnnotationIterationForCount(object, fromSql, whereSql, null, null, null, ai, tableName);
    if (selectSql.indexOf(COMMA) > -1) {
        selectSql.delete(selectSql.lastIndexOf(COMMA), selectSql.lastIndexOf(COMMA) + 1);
    }
    if (WHERE_.equals(whereSql.toString())) {
        whereSql = new StringBuffer();
    } else if (whereSql.indexOf(AND) > -1) {
        whereSql.delete(whereSql.lastIndexOf(AND), whereSql.lastIndexOf(AND) + 3);
    }
    return selectSql.append(fromSql).append(whereSql).toString();
}
Also used : TableName(indi.mybatis.flying.models.TableName) BuildSqlException(indi.mybatis.flying.exception.BuildSqlException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TableMapper(indi.mybatis.flying.models.TableMapper)

Example 10 with TableMapper

use of indi.mybatis.flying.models.TableMapper in project mybatis.flying by limeng32.

the class SqlBuilder method dealMapperAnnotationIterationForSelectAll.

private static void dealMapperAnnotationIterationForSelectAll(Object object, StringBuffer selectSql, StringBuffer fromSql, StringBuffer whereSql, TableName originTableName, Mapperable originFieldMapper, String fieldPerfix, AtomicInteger index, TableName lastTableName, String ignoreTag) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    Map<?, ?> dtoFieldMap = PropertyUtils.describe(object);
    TableMapper tableMapper = buildTableMapper(getTableMappedClass(object.getClass()));
    QueryMapper queryMapper = buildQueryMapper(object.getClass(), getTableMappedClass(object.getClass()));
    TableName tableName = null;
    if (lastTableName == null) {
        tableName = new TableName(tableMapper, index.getAndIncrement(), null);
    } else {
        tableName = new TableName(tableMapper, index.getAndIncrement(), lastTableName.getMap());
    }
    /*
		 * 在第一次遍历中,处理好selectSql和fromSql。 如果originFieldMapper为null则可认为是第一次遍历
		 */
    if (originFieldMapper == null) {
        fromSql.append(tableName.sqlSelect());
        for (Mapperable fieldMapper : tableMapper.getFieldMapperCache().values()) {
            if ((!fieldMapper.getIgnoreTagSet().contains(ignoreTag))) {
                selectSql.append(tableName.sqlWhere()).append(fieldMapper.getDbFieldName()).append(COMMA);
            }
        }
    }
    /*
		 * 在非第一次遍历中,处理fieldPerfix和fromSql。
		 * 如果originFieldMapper和originTableName均不为null则可认为是非第一次遍历
		 */
    String temp = null;
    if (originFieldMapper != null && originTableName != null) {
        /* 处理fieldPerfix */
        temp = originFieldMapper.getFieldName();
        if (fieldPerfix != null) {
            temp = fieldPerfix + DOT + temp;
        }
        /* 处理fromSql */
        fromSql.append(_LEFT_JOIN_).append(tableName.sqlSelect()).append(_ON_).append(originTableName.sqlWhere()).append(originFieldMapper.getDbFieldName()).append(_EQUAL_).append(tableName.sqlWhere()).append(originFieldMapper.getDbAssociationUniqueKey());
    }
    /* 处理fieldMapper中的条件 */
    for (Mapperable fieldMapper : tableMapper.getFieldMapperCache().values()) {
        Object value = dtoFieldMap.get(fieldMapper.getFieldName());
        if (value == null) {
            continue;
        }
        /* 此处当value拥有TableMapper或QueryMapper标注时,开始进行迭代 */
        if (fieldMapper.isForeignKey()) {
            dealMapperAnnotationIterationForSelectAll(value, selectSql, fromSql, whereSql, tableName, fieldMapper, temp, index, tableName, null);
        } else {
            dealConditionEqual(whereSql, fieldMapper, tableName, temp, false, 0);
        }
    }
    /* 处理queryMapper中的“且”条件 */
    for (ConditionMapper conditionMapper : queryMapper.getConditionMapperCache().values()) {
        Object value = dtoFieldMap.get(conditionMapper.getFieldName());
        if (value == null) {
            continue;
        }
        dealConditionMapper(conditionMapper, value, whereSql, tableName, temp, false, 0);
    }
    /* 处理queryMapper中的“或”条件 */
    for (OrMapper orMapper : queryMapper.getOrMapperCache().values()) {
        Object value = dtoFieldMap.get(orMapper.getFieldName());
        if (value == null) {
            continue;
        }
        dealConditionOrMapper(orMapper, value, whereSql, tableName, temp);
    }
}
Also used : TableName(indi.mybatis.flying.models.TableName) ConditionMapper(indi.mybatis.flying.models.ConditionMapper) OrMapper(indi.mybatis.flying.models.OrMapper) TableMapper(indi.mybatis.flying.models.TableMapper) Mapperable(indi.mybatis.flying.models.Mapperable) QueryMapper(indi.mybatis.flying.models.QueryMapper)

Aggregations

TableMapper (indi.mybatis.flying.models.TableMapper)10 FieldMapper (indi.mybatis.flying.models.FieldMapper)7 BuildSqlException (indi.mybatis.flying.exception.BuildSqlException)5 Mapperable (indi.mybatis.flying.models.Mapperable)3 TableName (indi.mybatis.flying.models.TableName)3 ConditionMapperAnnotation (indi.mybatis.flying.annotations.ConditionMapperAnnotation)2 FieldMapperAnnotation (indi.mybatis.flying.annotations.FieldMapperAnnotation)2 TableMapperAnnotation (indi.mybatis.flying.annotations.TableMapperAnnotation)2 ConditionMapper (indi.mybatis.flying.models.ConditionMapper)2 OrMapper (indi.mybatis.flying.models.OrMapper)2 QueryMapper (indi.mybatis.flying.models.QueryMapper)2 Annotation (java.lang.annotation.Annotation)2 Field (java.lang.reflect.Field)2 KeyHandler (indi.mybatis.flying.type.KeyHandler)1 ArrayList (java.util.ArrayList)1 Map (java.util.Map)1 WeakHashMap (java.util.WeakHashMap)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 Column (javax.persistence.Column)1