java输出sql结果_mybatis通过打印完整的sql语句以及
执⾏结果操作
开发过程中,如果使⽤mybatis做为orm框架,经常需要打印出完整的sql语句以及执⾏的结果做为参考。
虽然mybatis结合⽇志框架可以做到,但打印出来的通常都是sql和参数分开的。
有时我们需要调试这条sql的时候,就需要把参数填进去,这样未免有些浪费时间。
此时我们可以通过实现mybatis来做到打印带参数的完整的sql,以及结果通过json输出到控制台。
直接看代码和使⽤⽅法吧:
mybatis打印不带问号的完整sql语句
dateformat;
import java.util.date;
import java.util.list;
import java.util.locale;
import java.util.properties;
import matcher;
import llectionutils;
import org.utor;
import org.apache.ibatis.mapping.boundsql;
import org.apache.ibatis.mapping.mappedstatement;
import org.apache.ibatis.mapping.parametermapping;
import org.apache.ibatis.plugin.*;
import org.aobject;
import org.apache.figuration;
import org.apache.sulthandler;
import org.apache.wbounds;
import org.pe.typehandlerregistry;import语句
/**
* mybatis打印不带问号的完整sql语句
*
* @author gogym
* @version 2018年8⽉13⽇
* @see mybatisinterceptor
* @since
@intercepts({
@signature(type = executor.class, method = "update", args = {mappedstatement.class,
object.class}),
@signature(type = executor.class, method = "query", args = {mappedstatement.class,
object.class, rowbounds.class, resulthandler.class})})
@suppresswarnings({"unchecked", "rawtypes"})
public class mybatisinterceptor implements interceptor
{
@override
public object intercept(invocation invocation)
throws throwable
{
try
{
// 获取xml中的⼀个select/update/insert/delete节点,是⼀条sql语句
mappedstatement mappedstatement = (args()[0];
object parameter = null;
// 获取参数,if语句成⽴,表⽰sql语句有参数,参数格式是map形式
if (args().length > 1)
{
parameter = args()[1];
system.out.println("parameter = " + parameter);
}
string sqlid = id(); // 获取到节点的id,即sql语句的id
system.out.println("sqlid = " + sqlid);
boundsql boundsql = boundsql(parameter); // boundsql就是封装mybatis最终产⽣的sql类configuration configuration = figuration(); // 获取节点的配置
string sql = getsql(configuration, boundsql, sqlid); // 获取到最终的sql语句
system.out.println("sql = " + sql);
}
catch (exception e)
{
e.printstacktrace();
// 执⾏完上⾯的任务后,不改变原有的sql执⾏过程
return invocation.proceed();
}
// 封装了⼀下sql语句,使得结果返回完整xml路径下的sql语句节点id + sql语句
public static string getsql(configuration configuration, boundsql boundsql, string sqlid)
{
string sql = showsql(configuration, boundsql);
stringbuilder str = new stringbuilder(100);
str.append(sqlid);
str.append(":");
str.append(sql);
string();
}
/
/ 如果参数是string,则添加单引号, 如果是⽇期,则转换为时间格式器并加单引号; 对参数是null和不是null的情况作了处理private static string getparametervalue(object obj)
{
string value = null;
if (obj instanceof string)
{
value = "'" + string() + "'";
}
else if (obj instanceof date)
{
dateformat formatter = datetimeinstance(dateformat.default,
dateformat.default, locale.china);
value = "'" + formatter.format(new date()) + "'";
}
else
{
if (obj != null)
{
value = string();
}
{
value = "";
}
}
return value;
}
// 进⾏?的替换
public static string showsql(configuration configuration, boundsql boundsql)
{
// 获取参数
object parameterobject = parameterobject();
list parametermappings = parametermappings();
// sql语句中多个空格都⽤⼀个空格代替
string sql = sql().replaceall("[\\s]+", " ");
if (collectionutils.isnotempty(parametermappings) && parameterobject != null)
{
// 获取类型处理器注册器,类型处理器的功能是进⾏java类型和数据库类型的转换
typehandlerregistry typehandlerregistry = pehandlerregistry();
// 如果根据lass()可以到对应的类型,则替换
if (typehandlerregistry.lass()))
{
sql = placefirst("\\?",
matcher.quotereplacement(getparametervalue(parameterobject)));
}
else
{
// metaobject主要是封装了originalobject对象,提供了get和set的⽅法⽤于获取和设置originalobject的属性值,主要⽀持对javabean、collection、map三种类型对象的操作
metaobject metaobject = wmetaobject(parameterobject);
for (parametermapping parametermapping : parametermappings)
{
string propertyname = property();
if (metaobject.hasgetter(propertyname))
object obj = value(propertyname);
sql = placefirst("\\?",
matcher.quotereplacement(getparametervalue(obj)));
}
else if (boundsql.hasadditionalparameter(propertyname))
{
// 该分⽀是动态sql
object obj = additionalparameter(propertyname); sql = placefirst("\\?",
matcher.quotereplacement(getparametervalue(obj)));
}
else
{
// 打印出缺失,提醒该参数缺失并防⽌错位
sql = placefirst("\\?", "缺失");
}
}
}
}
return sql;
}
@override
public object plugin(object target)
{
return plugin.wrap(target, this);
}
@override
public void setproperties(properties properties)
{
}
}
打印结果:
import java.util.properties;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论