zoukankan      html  css  js  c++  java
  • springboot与mybatis

    1.SpringBoot日志框架

    Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。

    springboot的提供的默认日志框架是Logback,spring-boot-starter其中包含了 spring-boot-starter-logging,所以你可以直接使用Logback日志。可以在yml中配置开启保存日志文件到本地:

    logging:
      file: init.log

    properties中:

    logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
    
    logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

    还可以 配置logging.level.*来具体输出哪些包的日志级别

    logging.level.root=INFO
    logging.level.org.springframework.web=DEBUG
    logging.level.org.hibernate=ERROR

    默认情况下,spring boot从控制台打印出来的日志级别只有ERROR, WARN 还有INFO,如果你想要打印debug级别的日志,可以通过application.properites配置debug=true,可以打印等多信息。

    在一般类中使用:

    import org.slf4j.LoggerFactory;
    import org.slf4j.Logger;
    
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    logger.info(" log.");
    logger.error("log.");
    logger.warn(" log.");
    logger.debug("log.");
    logger.trace("log.");

    如果嫌弃每次都新建Logger对象,还可以使用@Slf4j注释,不过这个注释隶属于lombok,使用lombok你不止需要lombok的依赖,还需要lombok插件(VSCode、eclipse、idea均有支持)。

    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
    </dependency>

    然后在要使用的类前面加上@Slf4j。

    @Slf4j
    @Service
    public class TodoListServiceImpl implements TodoListService {
        @Override
        public void deleteTodoObject(String note) {
            log.info(" log.");
            log.error("log.");
            log.warn(" log.");
            log.debug("log.");
            log.trace("log.");
        }
    }

    就可以使用进行使用。

    @:https://www.cnblogs.com/lixuwu/p/5804793.html

    https://blog.csdn.net/flysun3344/article/details/80555746

    https://www.cnblogs.com/weiapro/p/7633645.html

    2.Mybatis的使用

    依赖:

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>

    Mybatis包扫描:

    @MapperScan("com.chriswei.cache.mapper")
    //在Main类上

    Mybatis的CRUD:

    @Mapper
    public interface EmployeeMapper {
        @Select("SELECT * FROM EMPLOYEE WHERE ID = #{ID}")
        public Employee getEmployeeById(Integer id);
    
        @Update("UPDATE EMPLOYEE SET LASTNAME=#{lastName},EMAIL=#{email},GENDER=#{gender},DID=#{dId} WHERE ID=#{id}")
        public void updateEmployee(Employee employee);
    
        @Delete("DELETE FROM EMPLOYEE WHERE ID=#{ID}")
        public void deleteEmployeeById(Integer id);
    
        @Insert("INSERT INTO EMPLOYEE(LASTNAME,EMAIL,GENDER,DID) VALUES(#{lastName},#{email},#{gender},#{dId})")
        public void insertEmployee(Employee employee);
    }
    //只需要写接口就行了
    //特别注意,SQL语句中的实体类属性要区分大小写,#{lastName}不能写成#{LASTNAME}。

    另外,关于@Param标签,有时候或者只有一个数据传入的时候,往往不需要也能映射到,但是有多个参数的时候,就需要加上,不然会出现映射不到的情况。

        @Update("Update TODOLIST SET note=#{newNote} where note=#{oldNote}")
        public void updateNote(@Param("oldNote")String oldNote, @Param("newNote")String newNote);

    报错类型为:error:nested exception is org.apache.ibatis.binding.BindingException: Parameter 'newNote' not found. Available parameters are [0, 1, param1, param2]

    也可以使用配置文件来写SQL语句,关键配置就一句

    #配置.xml文件路径
    mybatis.mapper-locations=classpath:mapper/*.xml

    然后你可以在mapper.xml中指定一些sql了。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
    
    <mapper namespace="com.chriswei.cache.mapper.EmployeeMapper">
        <select id="getEmployeeById" parameterType="Integer" resultType="com.chriswei.cache.bean.Employee">
            SELECT * FROM Employee WHERE ID = #{id}
        </select>
    </mapper>

    在namespace指定好路径之后,只要id跟service层的方法名字一样,就可以查询了。

     3.Springboot热加载

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>

    4.Springboot aop的使用

    依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>

    然后就可以使用了,新建一个切面类LogAnnotation

    package com.example.demo.Util;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Component
    @Aspect
    @Slf4j
    public class LogAnnotation{
        private final String POINT_CUT = "execution(* com.example.demo.service.impl.*.*(..))";
    
        @Pointcut(POINT_CUT)
        public void pointCut(){}
    
        @Before(value = "pointCut()")
        public void before(JoinPoint joinPoint){
            Signature signature = joinPoint.getSignature();
            log.info("进入:"+signature.toLongString());
        }
        @AfterReturning(value = POINT_CUT,returning = "result")
        public void doAfterReturningAdvice1(JoinPoint joinPoint,Object result){
            Signature signature = joinPoint.getSignature();
            log.info(signature.toShortString()+"执行完毕。");
            if(result!=null && result instanceof String){
                log.info("返回值:"+result,toString());
            }
        }
    }

    第一步加@Component@Aspect 两条注释,然后注册一个切入点@Pointcut(POINT_CUT) ,就可以使用其他的功能了。

    对于execution的使用:

    execution(
        modifier-pattern?  //修饰符
        ret-type-pattern  //返回类型
        declaring-type-pattern?  //方法模式
        name-pattern(param-pattern)  //参数模式
        throws-pattern?  //异常模式
    )
    
    /*
    整个表达式可以分为五个部分:
    
     1、execution(): 表达式主体。
    
     2、第一个*号:表示返回类型,*号表示所有的类型。
    
     3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
    
     4、第二个*号:表示类名,*号表示所有的类。
    
     5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
    */

    @pointcut("execution(* com.sample.service.impl..*.*(..))")

    此外,这里还有一种跟自定义注解一起使用的方法。

    首先新建一个你的自定义注释:

    import java.lang.annotation.*;
     
    /**
     * 定义系统日志注解
     * @author zhuzhe
     * @date 2018/6/4 9:24
     * @email 1529949535@qq.com
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SysLog {
        String value() default "";
    }

    然后在切入点这么写:

    @Pointcut("@annotation(com.space.aspect.anno.SysLog)")

    接下来你就可以使用自定义注解作为切入点使用了。

        @SysLog("测试")
        @GetMapping("/test")
        public String test(@RequestParam("name") String name){
            return name;
        }

    但凡使用了注解的方法,都可以被LogAnnotation类监测到了。

    更邪门的是使用环绕通知来对方法实现增强。

    @:https://blog.csdn.net/zhuzhezhuzhe1/article/details/80565067

    https://blog.csdn.net/u012326462/article/details/82529835

    https://www.jianshu.com/p/fbbdebf200c9

  • 相关阅读:
    [代码]比较XML文件差异[cl_proxy_ui_utils=>show_xml_diff]
    查看日期属性(休息日、节假日、星期几)[DAY_ATTRIBUTES_GET]
    ABAP中字符串处理方法小结(一)
    ABAP中字符串处理方法小结(二)
    [问题解决]ALV可输入状态下输入金额/数量字段小数位数提前的问题
    自适应背景图
    js原型继承
    仿留言功能
    鼠标画图效果
    照片切换,24小块分散效果
  • 原文地址:https://www.cnblogs.com/chrisweiii/p/10619664.html
Copyright © 2011-2022 走看看