第十章 springboot + logback

logback是boot默认的日志首选,个人觉得是最好的日志实现(比log4j好)

下边,在之前的代码基础上增加一个功能,该功能要实现mybatis的and or联查功能,并通过logback日志在控制台去查看输出的sql情况。

即实现如下sql的功能:

SELECT * FROM tb_user WHERE id = ? AND (username=? OR `password`= ?);

该语句需要用到xml格式。

注意:由本节开始,springboot采用了1.3.0.

1、com.xxx.firstboot.web.UserController

 1     @ApiOperation("测试mybatis and or联查")
 2     @ApiImplicitParams({
 3         @ApiImplicitParam(paramType="query",name="id",dataType="int",required=false, value="用户的id",defaultValue="1"),
 4         @ApiImplicitParam(paramType="query",name="username",dataType="String",required=false,value="用户的姓名",defaultValue="zhaojigang"),
 5         @ApiImplicitParam(paramType="query",name="password",dataType="String",required=false,value="用户的密码",defaultValue="wangna")
 6     })
 7     @ApiResponses({
 8         @ApiResponse(code=400,message="请求参数没填好"),
 9         @ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
10     })
11     @RequestMapping(value="/testMybatisAndOrUnion",method=RequestMethod.GET)
12     public User getUserByIdAndUsernameOrPassword(@RequestParam(name="id",required=false) Integer id,
13                                                  @RequestParam(name="username",required=false) String username,
14                                                  @RequestParam(name="password",required=false) String password) {
15         return userService.getUserByIdAndUsernameOrPassword(id, username, password);
16     }

注意

  • 这里我三个参数都是"required=false",是为了测试。
  • id使用Integer是为了让其可以为null来测试,如果改成int的话如果前端不传参数就会出问题。
    • 这也是Integer的一个用途

2、com.xxx.firstboot.service.UserService

 1 @Service
 2 public class UserService {
 3
 4     private static final Logger LOGGER = LoggerFactory.getLogger(UserService.class);
 5
 6     @Autowired
 7     private UserDao userDao;
 8
 9     public User getUserByIdAndUsernameOrPassword(Integer id, String username, String password){
10         User user = userDao.getUserByIdAndUsernameOrPassword(id, username, password);
11         LOGGER.info("getUserByIdAndUsernameOrPassword success! user:‘{}‘", user);
12         return user;
13     }

说明

  • 在该service中引入了slf4j,这是日志接口,其实现可以是各种实现,包括logback,log4j等

3、com.xxx.firstboot.dao.UserDao

1     /**
2      * 测试 mybatis and or联查
3      */
4     public User getUserByIdAndUsernameOrPassword(Integer id, String username, String password){
5         return userMapper.getUserByIdAndUsernameOrPassword(id, username, password);
6     }

4、com.xxx.firstboot.mapper.UserMapper

1 public User getUserByIdAndUsernameOrPassword(@Param("id") Integer id, @Param("username") String username, @Param("password") String password);

说明

  • 这里参数的传递必须使用@Param来传递,否则xml里接收不到

    • 目前为止,只发现传递模型类(eg.User)不需要@Param注解

5、src/main/resources/mapper/UserMapper.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3
 4 <!-- 指定工作空间,要与接口名相同,源代码没有去看,猜测应该是通过"这里的namespace.下边方法的id"来定位方法的 -->
 5 <mapper namespace="com.xxx.firstboot.mapper.UserMapper">
 6     <resultMap type="User" id="userResultMap">
 7         <id property="id" column="id" />
 8         <result property="username" column="username" />
 9         <result property="password" column="password" />
10     </resultMap>
11
12     <!-- SELECT * FROM tb_user WHERE id = 1 AND (username=‘‘ OR `password`=‘wangna‘); -->
13     <select id="getUserByIdAndUsernameOrPassword" resultMap="userResultMap">
14         <![CDATA[ SELECT * FROM tb_user WHERE id = #{id}]]>
15         <trim prefix=" AND (" suffix=")" prefixOverrides="OR">
16             <if test="username != null"><![CDATA[ username = #{username}]]></if>
17             <if test="password != null"><![CDATA[ OR password = #{password}]]></if>
18         </trim>
19     </select>
20
21 </mapper>

注意:trim的作用

  • prefix=" AND (":在"被trim括起来的满足条件的语句的最前方"添加,例如添加" AND ("
  • suffix=")":在"被trim括起来的满足条件的语句的最后方"添加,例如添加")"
  • prefixOverrides="OR":被trim括起来的满足条件的语句的最前方如果是"OR"(语句中的OR前可以有多个空格,但是prefixOverrides="OR"中的OR前边不能有空格)。eg.如果上述语句中id和password传了,如果不加这个属性,就会形成如下的sql:SELECT * FROM tb_user WHERE id = 1 AND ( OR ‘password‘=‘wangna‘),该语句就错了;如果加了的话,就会使用prefix=" AND ("来覆盖" OR",就会如下sql:SELECT * FROM tb_user WHERE id = 1 AND ( ‘password‘=‘wangna‘)
  • 如果username和password都isBlank(即为null或者为""),该trim标签会判断trim内没有语句,则不会加上prefix和suffix,eg.SELECT * FROM tb_user WHERE id = 1 AND ( )(这样的情况不会出现)。

6、src/main/resources/logback.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration>
 3     <include resource="org/springframework/boot/logging/logback/base.xml" />
 4     <!-- 1、logger
 5          属性:
 6             1)name:用来指定受此logger约束的某一个包或者具体的某一个类
 7             2)level:用来设置打印级别,大小写无关(最常用的几种):DEBUG, INFO, WARN, ERROR
 8          2、
 9     -->
10     <!-- <logger name="org.springframework.web" level="DEBUG" /> -->
11
12     <!-- mybatis日志打印 -->
13     <!-- <logger name="com.ibatis" level="DEBUG" /> -->
14     <!-- <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG" /> -->
15     <!-- <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG" /> -->
16     <!-- <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG" /> -->
17
18     <!-- <logger name="java.sql.Connection" level="DEBUG" /> -->
19     <!-- <logger name="java.sql.Statement" level="DEBUG" /> -->
20     <!-- <logger name="java.sql.PreparedStatement" level="DEBUG" /> -->
21     <!-- 这一句至关重要如果没有,就无法输出sql语句 -->
22     <logger name="com.xxx.firstboot.mapper" level="DEBUG"></logger>
23  </configuration>

注意:在boot中,想在控制台打印mybatis的sql语句,只需要配置下边这一句就好了。

<logger name="com.xxx.firstboot.mapper" level="DEBUG"></logger>

即将mapper接口打入logger就行。

但是在ssm中,可能就需要该行上边的7行了。(这个没有测过不清楚)

测试:

启动应用,打开swagger。

打印出的sql语句:SELECT * FROM tb_user WHERE id = ?

打印出的sql语句:SELECT * FROM tb_user WHERE id = ? AND ( username = ? )

打印出的sql语句:SELECT * FROM tb_user WHERE id = ? AND ( password = ? )

打印出的sql语句:SELECT * FROM tb_user WHERE id = ? AND ( username = ? OR password = ? )

根据测试可以发现,id是必须的,这也是我的项目的需求(而这里不传id,只是为了测试而已),如果id也不是必须,就要考虑trim的位置以及prefixOverrides的值(可以使用AND|OR这样的表示或)

参考自:

http://stackoverflow.com/questions/21718097/how-to-configure-logback-for-mybatis-to-print-my-sql

http://aub.iteye.com/blog/1896611 关于logback可以参考的博客

时间: 2024-12-12 21:06:26

第十章 springboot + logback的相关文章

利用SpringBoot+Logback手写一个简单的链路追踪

目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简单的链路追踪,下面详细介绍下. 一.实现原理 Spring Boot默认使用LogBack日志系统,并且已经引入了相关的jar包,所以我们无需任何配置便可以使用LogBack打印日志. MDC(Mapped Diagnostic Context,映射调试上下文)是log4j和logback提供的一种

spring-boot logback日志常用配置解释

1)引入 spring-boot默认日志系统就是logback日志框架 spring-boot引入logback的maven依赖关系树如下: 2)配置 在application.properties文件中 #backlog setting logging.config=logback-spring.xml 或者在 application-dev.yml文件中 logging: config: classpath:logback-spring.xml logback-spring.xml配置详解

windows下启动tomcat,日志乱码问题,日志架构springboot+logback

最近在做架构迁移工作,将原有springmvc项目调整至springboot架构上,迁移完后,发现用springboot以jar包形式启动正常,用tomcat去启动时日志乱码,但是项目部署至Linux环境启动也正常,以下是日志乱码代码: <?xml version="1.0" encoding="UTF-8"?><configuration><include resource="org/springframework/boot

SpringBoot+logback实现按业务输出日志到不同的文件

公司有个项目,需要和几个第三方系统对接.这种项目,日志一定要记录详细,不然出了问题就是各种甩锅.虽然项目里面和第三方系统对接相关的业务记录的日志很详细,但是由于整个项目的日志都在一个文件中,排查问题时比较麻烦.因此希望可以把这些和第三方对接的日志生成在另外一个单独的文件.这也就是标题中的实现按业务输出日志到不同的文件,下面开始讲解具体的实现方案. 一.方案 由于需要按业务生成不同的日志文件,看到按业务来区分,我的第一感觉就是业务其实是可以按包名来区分的.所以其实我们只要实现不同的包下面的日志输出

springboot logback 配置 通配符不行就这样

<?xml version="1.0" encoding="UTF-8"?><configuration> <property name="log.home" value="D:\\logs" /> <!-- 彩色日志 --> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" c

SpringBoot+logback实现日志打印

logback介绍 logback是一款开源的日志框架,内核重写了,是基于log4j基础进行改良的.其官网为logback.qos.ch.logback在性能上有很大提升,拥有更多特性. logback-core:是其它两个模块的基础模块 logback-classic:log4j的改良版本,实现了Slf4j API logback-access:集成Servle环境时就需要logback了,可以提供Http访问的接口 日志级别 日志级别:ERROR, WARN, INFO, DEBUG or

第二十章 springboot + consul(1)

consul的具体安装与操作查看博客的consul系列. 一.启动consul (1个server+1个client,方便起见,client使用本机):查看:http://www.cnblogs.com/java-zhao/p/5375132.html 1.开启虚拟机-->切换到vagrantFile中配置的节点 vagrant up vagrant ssh n110 2.启动server(n110) consul agent -server -bootstrap-expect=1  -data

第一章 目录

第一条 mybatis and or联查 第十章 springboot + logback 第二条 logback下console打印mybatis的sql语句 第十章 springboot + logback 第三条

深入实践Springboot实战.pdf文档

第一部分:基础应用开发 (1~5章)针对性的介绍了Springboot入门.数据库的使用和访问性能提升.界面设计安全设计等重要技术知识,以实用性为主,旨在帮助读者快速掌握Springboot开发和精髓,尽快融入生产实践中. 第一章 Springboot入门 第二章 在Springboot中使用数据库 第三章 Springboot界面设计 第四章 提高数据库访问性能 第五章 Springboot安全设计 第二部分:分布式应用开发 (6~9章)用生产环境中的实际案例讲解了如何使用Springboot