zoukankan      html  css  js  c++  java
  • 第十章 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可以参考的博客

  • 相关阅读:
    empty() 为true
    浅谈Linux cp命令
    Centos7 出现Welcome to emergency mode!【紧急模式】
    Linux系统管理命令-systemctl 和 sshd 服务
    Linux 配置 history 命令显示操作时间、用户和登录 IP
    SHELL 中条件语句的运用 if for 条件测试语句
    CentOS 7 使用 HP 打印机
    Xmanager 5远程连接CentOS7图形化界面
    chmod命令用法详解-chmod修改目录权限
    centos crontab用法详解 定时任务的设置
  • 原文地址:https://www.cnblogs.com/java-zhao/p/5449152.html
Copyright © 2011-2022 走看看