아쉽게 블로그 포스팅을 거의 못하고 있어서...시간 내서 작성을 하려고 합니다^-^good~
오늘의 포스팅은! mybatis logger쪽 입니다.
환경 :
Spring 3.1
mybatis-3.1.1.jar
서론 :
현재 mybatis에서는 sql문과 parameter 부분이 서로 나뉘어져 logging되고 있습니다.
개발을 할 때 param이 많다면 일일이 매핑 시켜서 오렌지나, sql develop 등등으로 보기에는 너무 힘이 들 것 입니다. 그래서 간단히..mybatis 소스를 조작하여 개발하여 보았습니다만..
개발자 local용이라는 단점이 있습니다. server용은 아닙니다..ㅋㅋ;;
기본 제공 변경 후
ex) select * from acetDB => select * from acetDB
where 1=1 and aaa in(?. ?) => where 1=1 and aaa in(100. 200)
본론 :
어떻게 구현을 했는지..창피하지만...사실 고친것도 없습니다..;;
한번 살펴보겠습니다^-^
mybatis 소스 중에 org/apache/ibatis/logging/jdbc 의 패키지 밑에 아래의 소스를 수정하였습니다.
BaseJdbcLogger.java
ConnectionLogger.java
PreparedStatementLogger.java
새롭게 만든 소스
PrintQueryParam.java
간단히 위의 소스에 대해서 설명을 드리자면..
ConnectionLogger.java : 요놈이 SQL문을 가지고 있습니다.
PreparedStatementLogger.java : 요놈은 parameter의 값을 가지고 있습니다.
BaseJdbcLogger.java : 요녀석은 ConnectionLogger, PreparedStatementLogger java에서 상속하여 쓰고 있는 Adapter 패턴 처럼 보입니다. 또한 Dynamic Proxy 패턴도 쓰입니다. 오픈소스는 디자인 패턴의 놀이터?? 인 것 같습니다..ㅋㅋ;
ex) public final class ConnectionLogger extends BaseJdbcLogger implements InvocationHandler {
.......................
}
그래서...서로 다른 java와 값들...어떻게 한곳으로 몰아서 작업을 통해서 sql문과 파라미터를 함께 찍어줄수 있을까...고민했습니다...
그래서 일단은 개발자 local 즉, 혼자서 개발 시에 사용 할 수 있는 ver을 만들었습니다.
How? 요즘..디자인 패턴을 내부에서 스터디를 하고 있는터라..떠오르는것이..Singleton 패턴 이였습니다--;;
간단히 말하면..
기본적인 Singleton 패턴이며, ConnectionLogger와 PreparedStatementLogger에서 공통의 객체를 공유하되
saveSql 이라는 녀석에다가 쿼리를 ConnectionLogger에서 넣어주게 되고, PreparedStatementLogger에서 쿼리문을 꺼내다가 파라미터와 합치는 작업을 하게 되어집니다.
1) PrintQueryParam.java
package org.apache.ibatis.logging.jdbc;
public class PrintQueryParam {
private static PrintQueryParam printQueryParam;
private String saveSql=null;
private PrintQueryParam(){}
public static PrintQueryParam getInstance(){ if(printQueryParam == null){ synchronized(PrintQueryParam.class){ if(printQueryParam == null){ printQueryParam = new PrintQueryParam(); } } }
return printQueryParam;
}
public String getSaveSql() { return saveSql; }
public void setSaveSql(String saveSql) { this.saveSql = saveSql; }
}
2) ConnectionLogger.java
/* * Copyright 2009-2012 The MyBatis Team * * 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.apache.ibatis.logging.jdbc;
/* * Creates a logging version of a connection * * @param conn - the original connection * @return - the connection with logging */ public static Connection newInstance(Connection conn, Log statementLog) { InvocationHandler handler = new ConnectionLogger(conn, statementLog); ClassLoader cl = Connection.class.getClassLoader(); return (Connection) Proxy.newProxyInstance(cl, new Class[]{Connection.class}, handler); }
/* * return the wrapped connection * * @return the connection */ public Connection getConnection() { return connection; }
}
3) PreparedStatementLogger.java
/* * Copyright 2009-2012 The MyBatis Team * * 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.apache.ibatis.logging.jdbc;
/* * Creates a logging version of a PreparedStatement * * @param stmt - the statement * @param sql - the sql statement * @return - the proxy */ public static PreparedStatement newInstance(PreparedStatement stmt, Log statementLog) { InvocationHandler handler = new PreparedStatementLogger(stmt, statementLog); ClassLoader cl = PreparedStatement.class.getClassLoader(); return (PreparedStatement) Proxy.newProxyInstance(cl, new Class[]{PreparedStatement.class, CallableStatement.class}, handler); }
/* * Return the wrapped prepared statement * * @return the PreparedStatement */ public PreparedStatement getPreparedStatement() { return statement; }
}
4) BaseJdbcLogger.java
/* * Copyright 2009-2011 The MyBatis Team * * 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.apache.ibatis.logging.jdbc;