com.jwmoon.framework.sql.MyBatisQueryResolver.java Source code

Java tutorial

Introduction

Here is the source code for com.jwmoon.framework.sql.MyBatisQueryResolver.java

Source

/**
 * @ MyBatisQueryResolver.java
 * 
 * Copyright 2016 NHN Techorus Corp. All rights Reserved. 
 * NHN Techorus PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.jwmoon.framework.sql;

import java.lang.reflect.Field;
import java.util.List;

import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 *
 * @brief   : 
 * @author   : (jwmoon@nhn-techorus.com)
 * @Date   : 2016/02/10
 */
public class MyBatisQueryResolver implements QueryResolver {

    @Autowired
    SqlSessionFactory sqlSessionFactory;

    public String getQuery(String queryId, Object paramObject) {
        SqlSession session = sqlSessionFactory.openSession();
        String query = resolveQuery(session, queryId, paramObject);
        session.close();
        return query;
    }

    private String resolveQuery(SqlSession sqlSession, String queryId, Object sqlParam) {

        BoundSql boundSql = sqlSession.getConfiguration().getMappedStatement(queryId).getSqlSource()
                .getBoundSql(sqlParam);

        String sql = boundSql.getSql();
        //System.out.println(" ? SQL : " + sql);

        Object paramObj = boundSql.getParameterObject();

        if (paramObj != null) {
            List<ParameterMapping> paramMapping = boundSql.getParameterMappings();

            Class<? extends Object> paramClass = paramObj.getClass();

            for (ParameterMapping mapping : paramMapping) {
                String propValue = mapping.getProperty();
                try {
                    Field field = paramClass.getDeclaredField(propValue);
                    field.setAccessible(true); //  private?   

                    Class<?> javaType = mapping.getJavaType();

                    if (String.class == javaType) {
                        sql = sql.replaceFirst("\\?", "'" + field.get(paramObj) + "'");
                    } else {
                        sql = sql.replaceFirst("\\?", "'" + field.get(paramObj).toString() + "'");
                    }

                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return sql;
    }
}