يمكنك طباعة عبارات SQL بناءً على وقت التنفيذ.
نسخة الكود كما يلي:
حزمة mybatis.
استيراد java.text.dateformat ؛
استيراد java.util.date ؛
استيراد java.util.list ؛
استيراد java.util.locale ؛
استيراد java.util.properties ؛
استيراد org.apache.ibatis.executor.executor ؛
استيراد org.apache.ibatis.mapping.boundsql ؛
استيراد org.apache.ibatis.mapping.mappedStatement ؛
استيراد org.apache.ibatis.mapping.parametermapping ؛
استيراد org.apache.ibatis.plugin.Interceptor ؛
استيراد org.apache.ibatis.plugin.Intercepts ؛
استيراد org.apache.ibatis.plugin.invocation ؛
استيراد org.apache.ibatis.plugin.plugin ؛
استيراد org.apache.ibatis.plugin.signature ؛
استيراد org.apache.ibatis.reflection.metaObject ؛
استيراد org.apache.ibatis.session.configuration ؛
استيراد org.apache.ibatis.session.resulthandler ؛
استيراد org.apache.ibatis.session.rowbounds ؛
استيراد org.apache.ibatis.type.typeHandlerRegistry ؛
@intercepts ({
signature (type = executor.class ، method = "update" ، args = {medpedStatement.Class ، Object.class}) ،
signature (type = executor.class ، method = "query" ، args = {medpedStatement.class ، Object.class ،
Rowbounds.class ، resulthandler.class})})
الطبقة العامة myBatisInterceptor تنفذ اعتراض {
خصائص الخصائص الخاصة ؛
اعتراض الكائن العام (الاحتجاج الاحتجاج) رمي رمي {
medpedStatement medpedStatement = (mappedStatement) invocation.getargs () [0] ؛
المعلمة الكائن = فارغة ؛
if (invocation.getargs (). الطول> 1) {
المعلمة = invocation.getargs () [1] ؛
}
String sqlid = mappedStatement.getId () ؛
BODEDSQL BODEDSQL = MEDPEDSTATEMTEMT.GETBOUNDSQL (المعلمة) ؛
تكوين التكوين = mappedStatement.getConfiguration () ؛
الكائن returnvalue = فارغة ؛
بدء طويل = system.currentTimeMillis () ؛
returnValue = invocation.proceed () ؛
End Long = System.CurrentTimeMillis () ؛
وقت طويل = (نهاية - ابدأ) ؛
إذا (الوقت> 1) {
String sql = getSQL (التكوين ، الحدود ، sqlid ، الوقت) ؛
System.err.println (SQL) ؛
}
إرجاع القيمة ؛
}
السلسلة الثابتة العامة getSQL (تكوين التكوين ، حدود الحدود ، سلسلة sqlid ، وقت طويل) {
String sql = showsql (التكوين ، الحدود) ؛
StringBuilder str = new StringBuilder (100) ؛
str.append (sqlid) ؛
str.append (":") ؛
str.append (SQL) ؛
str.append (":") ؛
str.append (time) ؛
str.append ("MS") ؛
إرجاع str.toString () ؛
}
سلسلة ثابتة خاصة getParametervalue (كائن OBJ) {
قيمة السلسلة = فارغة ؛
إذا (OBJ مثيل string) {
value = "" " + obj.toString () +" '"؛
} آخر إذا (OBJ مثيل التاريخ) {
DateFormat formatter = dateFormat.getDateTimeInstance (DateFormat.default ، DateFormat.default ، locale.china) ؛
value = "'" + formatter.format (new date ()) + "'" ؛
} آخر {
if (obj! = null) {
القيمة = obj.toString () ؛
} آخر {
القيمة = "" ؛
}
}
قيمة الإرجاع
}
السلسلة الثابتة العامة تُظهر (تكوين التكوين ، حدود الحدود) {
parameterObject = boundsql.getParameterObject () ؛
قائمة <ParmeterMapping> paramEterMappings = boundsql.getParamEterMappings () ؛
String sql = boundsql.getsql (). replaceall ("[// s]+" ، "") ؛
if (parametermappings.size ()> 0 && parameterObject! = null) {
typeHandlerRegistry typeHandlerRegistry = configuration.getTyPeHandlerRegistry () ؛
if (typeHandlerRegistry.hastypeHandler (parameterObject.getClass ())) {
sql = sql.replacefirst ("//؟" ، getParametervalue (parameterObject)) ؛
} آخر {
metaObject metaObject = configuration.newmetaObject (parameterObject) ؛
لـ (parameTermapping parameTerMapping: parametermappings) {
string propertyName = parameTerMapping.getProperty () ؛
if (metaObject.hasgetter (propertyName)) {
Object obj = metaObject.getValue (propertyName) ؛
sql = sql.replacefirst ("//؟" ، getParametervalue (OBJ)) ؛
} آخر إذا (boundsql.hasadditionalparameter (propertyName)) {
Object obj = boundsql.getAdditionalParameter (propertyName) ؛
sql = sql.replacefirst ("//؟" ، getParametervalue (OBJ)) ؛
}
}
}
}
إرجاع SQL ؛
}
الكائن العام المكون الإضافي (هدف الكائن) {
return plugin.wrap (الهدف ، هذا) ؛
}
setProperties public void (خصائص الخصائص 0) {
this.properties = properties0 ؛
}
}