最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄的方式詳細(xì)介紹

 更新時(shí)間:2022年04月21日 12:00:21   作者:蠢蠢欲動(dòng)的貓  
這篇文章主要介紹了使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄,通過監(jiān)聽器去監(jiān)聽,當(dāng)訪問到具體的類方法,通過aop切面去獲取訪問的方法,然后將日志記錄下來,就這種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下

34、使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄

自動(dòng)日志記錄的實(shí)現(xiàn)的兩種方式:

①通過監(jiān)聽器去監(jiān)聽,當(dāng)訪問到具體的類方法,通過aop切面去獲取訪問的方法,然后將日志記錄下來
②通過攔截器,編寫一個(gè)類去繼承HandlerInterceptorAdapter,重寫preHandle,postHandle,然后在里面進(jìn)行日志記錄,編寫的類加到spring容器里

采用第一種方式:

1、第一步、定義一個(gè)注解:

Annotation 注解的作用:

@interface 表示這是一個(gè)注解類, 不是interface,是注解類 定義注解用的,是jdk1.5之后加入的,java沒有給它新的關(guān)鍵字,所以就用@interface 這么個(gè)東西表示了

@Inherited //這個(gè)Annotation 可以被繼承

@Documented //這個(gè)Annotation可以被寫入javadoc

@Target:注解的作用目標(biāo)

@Target(ElementType.TYPE) //接口、類、枚舉、注解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數(shù)
@Target(ElementType.CONSTRUCTOR) //構(gòu)造函數(shù)
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Retention(RetentionPolicy.RUNTIME) //可以用來修飾注解,是注解的注解,稱為元注解。

public enum RetentionPolicy {   
    SOURCE, // 編譯器處理完Annotation后不存儲(chǔ)在class中   
    CLASS, // 編譯器把Annotation存儲(chǔ)在class中,這是默認(rèn)值   
    RUNTIME // 編譯器把Annotation存儲(chǔ)在class中,可以由虛擬機(jī)讀取,反射需要   
} 

創(chuàng)建一個(gè)注解:

default 0 相當(dāng)于set和get方法,添加一個(gè)默認(rèn)值

/**
 * 系統(tǒng)日志注解
 * 
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AutoLog {

	/**
	 * 日志內(nèi)容
	 * 
	 * @return
	 */
	String value() default "";
	 * 日志類型
	 * @return 1:登錄日志;2:操作日志;3:訪問日志;4:異常日志;5:定時(shí)任務(wù);
	int logType() default CommonConstant.LOG_TYPE_2;
	
	 * 操作日志類型
	 * @return (1查詢,2添加,3修改,4刪除)
	int operateType() default 0;
}

CommonConstant 相關(guān)的配置

public interface CommonConstant {

	/**
	 * 正常狀態(tài)
	 */
	public static final Integer STATUS_NORMAL = 0;
	 * 禁用狀態(tài)
	public static final Integer STATUS_DISABLE = -1;
	 * 刪除標(biāo)志
	public static final Integer DEL_FLAG_DELETED = 1;
	 * 未刪除
	public static final Integer DEL_FLAG_UNDELETED = 0;
	 * 系統(tǒng)日志類型: 登錄
	public static final int LOG_TYPE_1 = 1;
	
	 * 系統(tǒng)日志類型: 操作
	public static final int LOG_TYPE_2 = 2;
    /**
     * 系統(tǒng)日志類型: 訪問
     */
	public static final int LOG_TYPE_3 = 3;
     * 系統(tǒng)日志類型: 異常
    public static final int LOG_TYPE_4 = 4;
     * 系統(tǒng)日志類型: 定時(shí)任務(wù)
    public static final int LOG_TYPE_5 = 5;
     * 系統(tǒng)日志類型: 用戶管理
    public static final int LOG_TYPE_6 = 6;
     * 系統(tǒng)登陸日志:正常賬戶密碼登錄
    public static final int OPERATE_TYPE_LT1_1 = 1;
     * 系統(tǒng)登陸日志:二維碼登陸
    public static final int OPERATE_TYPE_LT1_2 = 2;
     * 系統(tǒng)登陸日志:?jiǎn)吸c(diǎn)登陸
    public static final int OPERATE_TYPE_LT1_3 = 3;
     * 系統(tǒng)登陸日志:登出
    public static final int OPERATE_TYPE_LT1_4 = 4;
     * 系統(tǒng)登陸日志:模擬登陸
    public static final int OPERATE_TYPE_LT1_5 = 5;
	 * 操作日志類型: 查詢
	public static final int OPERATE_TYPE_LT2_1 = 1;
	 * 操作日志類型: 添加
	public static final int OPERATE_TYPE_LT2_2 = 2;
	 * 操作日志類型: 更新
	public static final int OPERATE_TYPE_LT2_3 = 3;
	 * 操作日志類型: 刪除
	public static final int OPERATE_TYPE_LT2_4 = 4;
	 * 操作日志類型: 導(dǎo)入
	public static final int OPERATE_TYPE_LT2_5 = 5;
	 * 操作日志類型: 導(dǎo)出
	public static final int OPERATE_TYPE_LT2_6 = 6;
     * 訪問日志類型: 進(jìn)入
    public static final int OPERATE_TYPE_LT3_1 = 1;
     * 異常日志類型: 普通操作即代碼錯(cuò)誤
    public static final int OPERATE_TYPE_LT4_1 = 1;
     * 異常日志類型: 非法操作即越權(quán)操作
    public static final int OPERATE_TYPE_LT4_2 = 2;
	public static final String CLIENT_TYPE_PC="0";
	public static final String CLIENT_TYPE_MOBILE="1";
	/** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */
    public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
    /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */
    public static final Integer SC_OK_200 = 200;
    
    /**訪問權(quán)限認(rèn)證未通過 510*/
    public static final Integer SC_JEECG_NO_AUTHZ=510;
    /** 登錄用戶Shiro權(quán)限緩存KEY前綴 */
    public static String PREFIX_USER_SHIRO_CACHE  = "shiro:cache:org.jeecg.modules.shiro.authc.ShiroRealm.authorizationCache:";
    /** 登錄用戶Token令牌緩存KEY前綴 */
    public static final String PREFIX_USER_TOKEN  = "prefix_user_token_";
    /** Token緩存時(shí)間:3600秒即一小時(shí) */
    public static final int  TOKEN_EXPIRE_TIME  = 3600;
     *  0:一級(jí)菜單
    public static final Integer MENU_TYPE_0  = 0;
   /**
    *  1:子菜單 
    */
    public static final Integer MENU_TYPE_1  = 1;
     *  2:按鈕權(quán)限
    public static final Integer MENU_TYPE_2  = 2;
    /**通告對(duì)象類型(USER:指定用戶,ALL:全體用戶)*/
    public static final String MSG_TYPE_UESR  = "USER";
    public static final String MSG_TYPE_ALL  = "ALL";
    /**發(fā)布狀態(tài)(0未發(fā)布,1已發(fā)布,2已撤銷)*/
    public static final String NO_SEND  = "0";
    public static final String HAS_SEND  = "1";
    public static final String HAS_CANCLE  = "2";
    /**閱讀狀態(tài)(0未讀,1已讀)*/
    public static final String HAS_READ_FLAG  = "1";
    public static final String NO_READ_FLAG  = "0";
    /**優(yōu)先級(jí)(L低,M中,H高)*/
    public static final String PRIORITY_L  = "L";
    public static final String PRIORITY_M  = "M";
    public static final String PRIORITY_H  = "H";
     * 短信模板方式  0 .登錄模板、1.注冊(cè)模板、2.忘記密碼模板
    public static final String SMS_TPL_TYPE_0  = "0";
    public static final String SMS_TPL_TYPE_1  = "1";
    public static final String SMS_TPL_TYPE_2  = "2";
     * 狀態(tài)(0無效1有效)
    public static final String STATUS_0 = "0";
    public static final String STATUS_1 = "1";
     * 同步工作流引擎1同步0不同步
    public static final String ACT_SYNC_0 = "0";
    public static final String ACT_SYNC_1 = "1";
     * 消息類型1:通知公告2:系統(tǒng)消息
    public static final String MSG_CATEGORY_1 = "1";
    public static final String MSG_CATEGORY_2 = "2";
     * 是否配置菜單的數(shù)據(jù)權(quán)限 1是0否
    public static final Integer RULE_FLAG_0 = 0;
    public static final Integer RULE_FLAG_1 = 1;
     * 用戶狀態(tài) 0凍結(jié) 1正常 2待定
    public static final Integer USER_FREEZE = 0;
    public static final Integer USER_NORMAL = 1;
     * 用戶刪除標(biāo)志位 0未刪 1已刪
    public static final Integer USER_DELETE_NO=0;
    public static final Integer USER_DELETE_YES=1;
    /**字典翻譯文本后綴*/
    public static final String DICT_TEXT_SUFFIX = "_dictText";
    public static final String ITEM_DISPLAY = "_display";
     * 表單設(shè)計(jì)器主表類型
    public static final Integer DESIGN_FORM_TYPE_MAIN = 1;
     * 表單設(shè)計(jì)器子表表類型
    public static final Integer DESIGN_FORM_TYPE_SUB = 2;
     * 表單設(shè)計(jì)器URL授權(quán)通過
    public static final Integer DESIGN_FORM_URL_STATUS_PASSED = 1;
     * 表單設(shè)計(jì)器URL授權(quán)未通過
    public static final Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2;
     * 表單設(shè)計(jì)器新增 Flag
    public static final String DESIGN_FORM_URL_TYPE_ADD = "add";
     * 表單設(shè)計(jì)器修改 Flag
    public static final String DESIGN_FORM_URL_TYPE_EDIT = "edit";
     * 表單設(shè)計(jì)器詳情 Flag
    public static final String DESIGN_FORM_URL_TYPE_DETAIL = "detail";
     * 表單設(shè)計(jì)器復(fù)用數(shù)據(jù) Flag
    public static final String DESIGN_FORM_URL_TYPE_REUSE = "reuse";
     * 表單設(shè)計(jì)器編輯 Flag (已棄用)
    public static final String DESIGN_FORM_URL_TYPE_VIEW = "view";
     * online參數(shù)值設(shè)置(是:Y, 否:N)
    public static final String ONLINE_PARAM_VAL_IS_TURE = "Y";
    public static final String ONLINE_PARAM_VAL_IS_FALSE = "N";
     * 文件上傳類型(本地:local,Minio:minio,阿里云:alioss)
    public static final String UPLOAD_TYPE_LOCAL = "local";
    public static final String UPLOAD_TYPE_MINIO = "minio";
    public static final String UPLOAD_TYPE_OSS = "alioss";
     * 員工身份 (1:普通員工  2:上級(jí))
    public static final Integer USER_IDENTITY_1 = 1;
    public static final Integer USER_IDENTITY_2 = 2;
     * 日期格式
    public static final String TIME_FORMAT_YMD = "yyyy-MM-dd";
    public static final String TIME_FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss";
    public static final String TIME_FORMAT_YMDHMSSZ = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
}

2、第二步、編寫一個(gè)切面

@Aspect 表示這是一個(gè)切面

@Component 告訴spring 這是一個(gè)bean ,注入

@annotation 獲取定義的注解

@Pointcut 切點(diǎn),

@Pointcut("@annotation(xx.AutoLog)") 表示,使用了這個(gè)注解的,就是切入點(diǎn)

@Around的作用

既可以在目標(biāo)方法之前織入增強(qiáng)動(dòng)作,也可以在執(zhí)行目標(biāo)方法之后織入增強(qiáng)動(dòng)作;
可以決定目標(biāo)方法在什么時(shí)候執(zhí)行,如何執(zhí)行,甚至可以完全阻止目標(biāo)目標(biāo)方法的執(zhí)行;
可以改變執(zhí)行目標(biāo)方法的參數(shù)值,也可以改變執(zhí)行目標(biāo)方法之后的返回值; 當(dāng)需要改變目標(biāo)方法的返回值時(shí),只能使用Around方法;
雖然Around功能強(qiáng)大,但通常需要在線程安全的環(huán)境下使用。因此,如果使用普通的Before、AfterReturing增強(qiáng)方法就可以解決的事情,就沒有必要使用Around增強(qiáng)處理了。

ProceedingJoinPoint 環(huán)繞通知,主要作用找到程序執(zhí)行中的可識(shí)別的點(diǎn),當(dāng)aop的切入點(diǎn)

  1. 環(huán)繞通知 ProceedingJoinPoint 執(zhí)行proceed方法的作用是讓目標(biāo)方法執(zhí)行,這也是環(huán)繞通知和前置、后置通知方法的一個(gè)最大區(qū)別。
  2. 簡(jiǎn)單理解,環(huán)繞通知=前置+目標(biāo)方法執(zhí)行+后置通知,proceed方法就是用于啟動(dòng)目標(biāo)方法執(zhí)行的.
/**
 * 系統(tǒng)日志,切面處理類
 *
 */
@Aspect
@Component
public class AutoLogAspect {
    @Autowired
    private ISysLogService sysLogService;

    @Pointcut("@annotation(xx.AutoLog)")
    public void logPointCut() {

    }


    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //執(zhí)行方法
        Object result = point.proceed();
        //執(zhí)行時(shí)長(zhǎng)(毫秒)
        long time = System.currentTimeMillis() - beginTime;

        //保存日志
        saveSysLog(point, time);

        return result;
    }

    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        SysLog sysLog = new SysLog();
        AutoLog syslog = method.getAnnotation(AutoLog.class);
        if (syslog != null) {
            //注解上的描述,操作日志內(nèi)容
            sysLog.setLogContent(syslog.value());
            sysLog.setLogType(syslog.logType());

        }

        //請(qǐng)求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        sysLog.setMethod(className + "." + methodName + "()");


        //設(shè)置操作類型
        if (sysLog.getLogType() == CommonConstant.LOG_TYPE_2) {
            sysLog.setOperateType(getOperateType(methodName, syslog.operateType()));
        }

        //請(qǐng)求的參數(shù)
        Object[] args = joinPoint.getArgs();
        try {
            String params = JSONObject.toJSONString(args);
            sysLog.setRequestParam(params);
        } catch (Exception e) {

        }
        try {
            //獲取request
            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
            //設(shè)置IP地址
            sysLog.setIp(IPUtils.getIpAddr(request));
        } catch (Exception e) {

        }
        //獲取登錄用戶信息
        LoginUser sysUser = null;
        try {
            sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {

        }
        if (sysUser != null) {
            sysLog.setUserId(sysUser.getId());
            sysLog.setUserName(sysUser.getUserName());
            sysLog.setRealName(sysUser.getRealName());
            sysLog.setOrgId(sysUser.getNowOrgId());
            sysLog.setOrgName(sysUser.getNowOrgName());
        }
        //耗時(shí)
        sysLog.setCostTime(time);
        sysLog.setCreateTime(new Date());
        //保存系統(tǒng)日志
        sysLogService.save(sysLog);
    }

    /**
     * 獲取操作類型
     */
    private int getOperateType(String methodName, int operateType) {
        if (operateType > 0) {
            return operateType;
        }
        if (methodName.startsWith("list")) {
            return CommonConstant.OPERATE_TYPE_LT2_1;
        }
        if (methodName.startsWith("add")) {
            return CommonConstant.OPERATE_TYPE_LT2_2;
        }
        if (methodName.startsWith("edit")) {
            return CommonConstant.OPERATE_TYPE_LT2_3;
        }
        if (methodName.startsWith("delete")) {
            return CommonConstant.OPERATE_TYPE_LT2_4;
        }
        if (methodName.startsWith("import")) {
            return CommonConstant.OPERATE_TYPE_LT2_5;
        }
        if (methodName.startsWith("export")) {
            return CommonConstant.OPERATE_TYPE_LT2_6;
        }
        return CommonConstant.OPERATE_TYPE_LT2_1;
    }

    @AfterThrowing(pointcut = "logPointCut()", throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Throwable ex) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        SysLog sysLog = new SysLog();

        StackTraceElement[] stackTraceElements = ex.getStackTrace();
        String rootExceptionName = ex.getClass().getName();

        StringBuilder resultContent = new StringBuilder("異常類:" + rootExceptionName);

        int count = 0;
        int maxTrace = 3;
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            if (stackTraceElement.getClassName().contains("com.lingxu") && count < maxTrace) {
                resultContent.append("\n出現(xiàn)于").append(stackTraceElement.getClassName())
                        .append("類中的").append(stackTraceElement.getMethodName())
                        .append("方法中 位于該類文件的第").append(stackTraceElement.getLineNumber())
                        .append("行)");
                count++;
                if (count == maxTrace) {
                    break;
                }
            }
        }


        sysLog.setExceptionContent(resultContent.toString());

        AutoLog syslog = method.getAnnotation(AutoLog.class);


        if (syslog != null) {
            //注解上的描述,操作日志內(nèi)容
            sysLog.setLogContent(syslog.value() + "出現(xiàn)異常");
            sysLog.setLogType(CommonConstant.LOG_TYPE_4);
        }

        //請(qǐng)求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        sysLog.setMethod(className + "." + methodName + "()");


        //設(shè)置操作類型
        sysLog.setOperateType(CommonConstant.OPERATE_TYPE_LT4_1);

        //請(qǐng)求的參數(shù)
        Object[] args = joinPoint.getArgs();
        try {
            String params = JSONObject.toJSONString(args);
            sysLog.setRequestParam(params);
        } catch (Exception e) {

        }
        try {
            //獲取request
            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
            //設(shè)置IP地址
            sysLog.setIp(IPUtils.getIpAddr(request));
        } catch (Exception e) {

        }
        try {
            //獲取登錄用戶信息
            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            if (sysUser != null) {
                sysLog.setUserId(sysUser.getId());
                sysLog.setUserName(sysUser.getUserName());
                sysLog.setRealName(sysUser.getRealName());
                sysLog.setOrgId(sysUser.getNowOrgId());
                sysLog.setOrgName(sysUser.getNowOrgName());

            }
        } catch (Exception e) {
        }
        //保存系統(tǒng)日志
        sysLogService.save(sysLog);
    }
}

3、使用自定義注解

可以在controller或者實(shí)現(xiàn)類上進(jìn)行注解的加入

	@AutoLog(value = "sss",logType = CommonConstant.LOG_TYPE_3, operateType = 2)
	@ApiOperation(value="記錄查詢?nèi)罩?分頁列表查詢", notes="記錄查詢?nèi)罩?分頁列表查詢")
	@PostMapping(value = "/queryPage")
	public Result<?> queryPage(@RequestBody SysSelectLog sysSelectLog){
		Page<SysSelectLog> page = new Page<>(sysSelectLog.getPageNo(),sysSelectLog.getPageSize());
		IPage<SysSelectLog> sysSelectLogIPage = sysSelectLogService.queryPage(page,sysSelectLog);
		return Result.ok(sysSelectLogIPage);
	}

到此這篇關(guān)于使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄的文章就介紹到這了,更多相關(guān)Aop自動(dòng)日志記錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例

    java實(shí)現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能

    java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)頁驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 從入門到精通:Java List遍歷修改的完全指南

    從入門到精通:Java List遍歷修改的完全指南

    在Java中,我們經(jīng)常需要遍歷List集合并對(duì)其中的元素進(jìn)行修改,這可以通過使用迭代器或for循環(huán)來實(shí)現(xiàn),需要的朋友可以參考下
    2023-10-10
  • 關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)

    關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)

    這篇文章主要介紹了關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java 排序算法之快速排序

    java 排序算法之快速排序

    這篇文章主要介紹了java 排序算法之快速排序,文中通過圖片和代碼講解相關(guān)知識(shí)非常詳細(xì),大家如果有需要的話可以參考一下這篇文章
    2021-09-09
  • Java的反射機(jī)制---動(dòng)態(tài)調(diào)用對(duì)象的簡(jiǎn)單方法

    Java的反射機(jī)制---動(dòng)態(tài)調(diào)用對(duì)象的簡(jiǎn)單方法

    下面小編就為大家?guī)硪黄狫ava的反射機(jī)制---動(dòng)態(tài)調(diào)用對(duì)象的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 使用list stream: 任意對(duì)象List拼接字符串

    使用list stream: 任意對(duì)象List拼接字符串

    這篇文章主要介紹了使用list stream:任意對(duì)象List拼接字符串操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Boot與Docker部署實(shí)踐

    Spring Boot與Docker部署實(shí)踐

    這篇文章主要介紹了Spring Boot與Docker部署實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java中replace與replaceAll的區(qū)別與測(cè)試

    Java中replace與replaceAll的區(qū)別與測(cè)試

    replace和replaceAll是JAVA中常用的替換字符的方法,下面這篇文章主要給大家介紹了關(guān)于Java中replace與replaceAll的區(qū)別與測(cè)試,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射實(shí)例代碼

    mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評(píng)論

文登市| 静宁县| 张掖市| 商都县| 乌苏市| 西青区| 玛纳斯县| 防城港市| 进贤县| 翼城县| 景德镇市| 曲周县| 梧州市| 东至县| 东至县| 绥中县| 泸溪县| 嘉兴市| 横峰县| 三河市| 开化县| 临安市| 彰化县| 来宾市| 通许县| 博乐市| 英山县| 花莲县| 德化县| 汨罗市| 镇宁| 同江市| 吉林省| 宁河县| 景东| 邹平县| 旬邑县| 大姚县| 淳化县| 开原市| 萝北县|