第十章 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可以參考的博客

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM