第十章 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 }
View Code
注意:
- 这里我三个参数都是"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 }
View Code
说明:
- 在该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 }
View Code
4、com.xxx.firstboot.mapper.UserMapper
1 public User getUserByIdAndUsernameOrPassword(@Param("id") Integer id, @Param("username") String username, @Param("password") String password);
View Code
说明:
- 这里参数的传递必须使用@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>
View Code
注意: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>
View Code
注意:在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可以参考的博客
第十章 springboot + logback相关推荐
- 记录druid整合springboot+logback配置打印sql日志
[记录druid整合springboot+logback配置打印sql日志] 整合记录 整合记录 首先看 druid 的LogFilter 为我们准备的四种logger类型 这些logger分别对应打 ...
- SpringBoot+logback实现日志打印
SpringBoot+logback 一.日志简介 1.SLF4J介绍 二.SpringBoot集成logback 1.配置文件详解 1.彩色日志 2.appender 3.root和logger详解 ...
- springboot logback日志问题
今天进行maven 的多模块开发(以springboot为主)时,遇到了logback日志问题.异常如下: Failed to instantiate [ch.qos.logback.classic. ...
- springboot logback 、log4j2
a. Spring Boot 默认的日志框架 logback b. 日志配置 b1. application.properties 配置 logging.file 和 logging.path log ...
- Spring-boot logback日志处理
1:在resources目录下面创建logback.xml配置文件 <?xml version="1.0"?> <configuration><!-- ...
- springboot logback自定义配置文件路径
//需要在项目启动项执行 static {System.setProperty("logging.config", System.getProperty("user.di ...
- springboot logback 日志配置
<configuration><!-- %m输出的信息, %p日志级别, %t线程名, %d日期, %c类的全名, %i索引 --><!-- appender是confi ...
- springboot logback配置included及时区设置问题
在微服务里使用了logback来对日志输出进行配置,由于配置文件里有很多通用的设置,所以有必要将通用的都提取到一个公共文件里,这样所有的微服务更改配置格式的话,只需更新通用文件即可,不用每个地方都改一 ...
- springboot logback 日志配置。
下面的引用 SizeAndTimeBasedRollingPolicy 只能是1.2版本以上 ,如果是spring starter 中已经引用了,直接修改日志版本号即可 即在pom中加入: < ...
最新文章
- linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...
- Fedora15使用笔记
- vue-cli3集成typescript,sass variables,多页打包
- python 文本向量化_Python文本特征抽取与向量化算法学习
- 手动编译php,手动编译安装php7的方式
- 五、会话及其会话技术
- mysql中的or_mysql中or和in的效率问题
- 文科生必备计算机知识点,文科生计算机知识点调查报告.docx
- php mysql select where_PHP MySQL Where 子句
- go15---select
- VS中常用的环境变量
- Linux中mongodb定时远程备份
- Debian下安装搜狗拼音输入法
- 不错的源码演示:admin5源码
- 360 网站服务器漏洞扫描,360Webscan
- 8.4 单片机按键介绍
- 地理信息系统实习作业——利用ArcGis计算武汉市分区土地利用类型面积
- Springboot书法比赛评分系统毕业设计-附源码200855
- SQL数据库快照删除
- 计算机是如何存储矩阵,如何存储稀疏邻接矩阵(How to store sparse adjacency matrix)
热门文章
- html中看到php代码_如何在HTML中嵌入PHP代码
- java商城pom,使用maven创建Java购物商城系统的common工程
- linux Fedora安装桌面,CentOS6.x\Red Hat\Fedora\Linux 安装Wine 1.7.48 桌面运行环境教程
- 手机超广角拍摄软件_桂林好的拍摄短视频手机软件
- 压缩文件夹_怎样压缩文件夹并发送
- 三维动画属于计算机专业吗,三维动画设计专业属于文科还是理科
- Paddle内置的网络模型
- 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题
- 舵机的脉冲指令的频率对于舵机运动影响
- 计算机信息管理技术 互联网,计算机信息管理技术在网络安全中的运用思路