# Spring-Mybatis **Repository Path**: Jyokiyi/spring-mybatis ## Basic Information - **Project Name**: Spring-Mybatis - **Description**: springmvc+mybatis+maven - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-05-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #Spring-Mybatis ####说明 > 学习搭框架确实是很有意思的,从中可以学到很多知识点。也会有很深入理解,那就说说在这次里遇到的问题和感受。 ## maven的使用 * 第一次使用,感觉是很不错的jar依赖管理工具。它可以在依赖A.jar包的时候,它会自动下载A.jar包所依赖的jar包。感兴趣的伙伴可以到maven的官网详细系统的学习一下。[maven官网](http://maven.apache.org/index.html) ## log4j2的使用 * 本次使用Mybatis,但是操作数据库的时候,我想打印出SQL文,但是总是不能显示出来(默认的输出地是console,默认的级别是ERROR级别)。但是看了[log4j2](http://logging.apache.org/log4j/2.x/log4j-users-guide.pdf)使用文档中LogEvent的级别与相应的LoggerConfig关联的级别对应关系如下表:
LogEvent LevelLoggerConfig Level
TRACEDEBUGINFOWARNERRORFATALOFF
ALLYESYESYESYESYESYESNO
TRACEYESNONONONONONO
DEBUGYESYESNONONONONO
INFOYESYESYESNONONONO
WARNYESYESYESYESNONONO
ERRORYESYESYESYESYESNONO
FATALYESYESYESYESYESYESNO
OFFNONONONONONONO
左边是Event的Level,右边是LoggerConfig的Level。Yes的意思就是这个event可以被LoggerConfig的filter接受,no的意思就是不能被filter接受。 这里把level(LogEvent的级别)设置为debug级别就可以了。如下(log4j2.xml文件中): ``` ``` * log4j的日志级别 1. DEBUG Level: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息. 2. INFO level: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息. 3. WARN level: 表明会出现潜在错误的情形,就是显示警告信息. 4. ERROR level: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息. 5. FATAL level: 指出每个严重的错误事件将会导致应用程序的退出. 6. ALL level: 是最低等级的,用于打开所有日志记录. 7. OFF level: 是最高等级的,用于关闭所有日志记录. 8. log4j建议只使用五个级别,级别顺序(由低到高): DEBUG < INFO < WARN < ERROR < FATAL ## spring的事务管理 * 基于注解的事务管理 需要在配置文件中开启注解支持,如下: ``` ``` 之后你可以在代码中使用```@Transactional```为方法或者类开启事务模式,以支持事务的提交和回滚。说到这里突然想到,之前我是在applicationContext.xml扫描所有组件``````,并没有把controller和service层分开扫描。发生错误时事务没有回滚而是提交到数据库了。网上查了一下,原来是controller和service层没有分开扫描,致使service层在事务管理注入spring容器之前就注入到了容器中,成了普通的spring bean。 之后我把applicationContext.xml拆成了applicationContext.xml和spring-servlet.xml两个文件,spring-servlet.xml中只扫描controller层注入spring容器中,applicationContext.xml扫描service层注入spring容器中并将事务管理激活。 * 基于xml配置的aop来管理事务 推荐使用这种方式。因为方便管理和维护,注解方法比较分散维护不方便。 * 事务回滚(亲测) 1. 默认遇到throw new RuntimeException("...");会回滚 2. 需要捕获的throw new Exception("...");不会回滚 3. 抛出的Exception,在数据库层默认是“超时”错误。 可以通过类似@Transactional(rollbackFor=Exception.class)的来重新配置。 默认spring 事务只在发生未被捕获的 RuntimeExcetpion时才回滚。spring Aop异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样Aop代理才能捕获到方法的异常,才能进行回滚,默认情况下Aop只捕获RuntimeExcetpion的异常,但可以通过 配置来捕获特定的异常并回滚换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeExcetpion(),这样程序异常时才能被Aop捕获进而回滚 ## Mybatis * [Mybatis官网](http://www.mybatis.org/mybatis-3/zh/index.html) 接口名和对应的映射文件xml的文件名可以不相同,但是xml文件中的namespace一定要与接口名相同,否则会报错,找不到接口中对应的方法。 ## MySQL * jdbc.properties 1. 在新的mysql-connector-java-6.0.3-bin.jar包中,driverClassName的改变了从```com.mysql.jdbc.Driver```改成了```com.mysql.cj.jdbc.Driver```. 2. 连接的url要加上```useSSL=true&serverTimezone=CTT```才可以,如下: ```url=jdbc:mysql://127.0.0.1:3306/dailycost?characterEncoding=utf8&useSSL=true&serverTimezone=CTT``` 3. 当```serverTimezone```设置为```UTC```(国际协调时间)或者```GMT```(格林尼治标准时间是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间。)时,数据库数据的时间都是和当前时间相差8小时。 4. ```serverTimezone```的设置参考```java.time.ZoneId```类,把它设置为```CTT```即上海的时间,这样就可以保障数据插入数据库的时间和系统时间保持一致。