首頁 > 軟體

mybatis plus中如何編寫sql語句

2022-11-28 22:02:11

sql語句是寫在對應的xml檔案中

首先要解決maven預設不載入xml檔案的問題

1.首先要寫入相關組態檔

在pom 匯入下面內容

 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>

在application中寫入如下內容

mybatis-plus:
  mapper-locations: classpath*:**/xml/*.xml

2.在對應的serviceimpl中呼叫baseMapper 介面

應為在mybatis plus 中對應的serviceImpl 介面繼承自對應的mapper介面,mapper介面又繼承自baseMapper 介面。

比如說

baseMapper.countRegisterDay(day)

3.在mapper檔案中編寫對應的介面

 Integer countRegisterDay(String day);

4.在對應的xml 中編寫sql語句

id 為方法的名字。resultType 為方法返回的型別

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.boshrong.ucentor.mapper.UcenterMemberMapper">
    <select id="countRegisterDay" resultType="java.lang.Integer">
        select count(*) from ucenter_member um where DATE (um.gmt_create)=#{day}
    </select>

</mapper>

注意若傳入的值有多個引數怎麼解決?

比如說方法為

 Integer countRegisterDay(String day,String time1);

sql 中獲取多個值的方法可以有兩種

1.方法一 ,通過索引獲取

#{0} 獲取day的值, #{1} 獲取time1的值

2.方法二, 通過@Param獲取

Integer countRegisterDay(@Param ("aa")String day,@Param ("bb")String time1);
  • #{aa},#{bb} 獲取
  • #{} 與 ${} 的區別
  • #{} 是預編譯處理,是預留位置。 Mybatis 在處理 #{} 時,會將sql 中的#{} 替換成?號,呼叫PreparedStatement 來賦值。
  • ${} 是字串替換,是拼接符。就是會將 KaTeX parse error: Expected 'EOF', got '#' at position 30: …Statement 來賦值。 #̲方式能夠很大程度防止sql注入…方式。

mybatis plus sql語句集合

獲取資料庫中某個varchar欄位的最大值

max(CONVERT(stat_date,UNSIGNED))

日期格式轉換

DATE_FORMAT(update_time,‘%Y-%m-%d %T')

字串拼接

concat(#{year},‘Y')

查詢年份的當前年份的後面一年

DATE_FORMAT(DATE_SUB(CURDATE(),interval -1 year),‘%Y')

查詢獲取當前年份

DATE_FORMAT(CURDATE(),‘%Y')

left,right函數返回args最左邊、右邊的length個字串

right(args, 2)

當前日期的前三個月日期

pay_time <![CDATA[<]]> now() - INTERVAL 3 MONTH AND now()

擷取某一個欄位中以某個字元開始擷取

  • 以從後面開始第一個橫槓為分割擷取
SUBSTRING_INDEX( dep_name, ‘-',- 1 ) depName
  • 以第一個橫槓為分割擷取
SUBSTRING_INDEX( dep_name, ‘-',1 ) depName

IFNULL() 函數

IFNULL(expression, alt_value)如果第一個引數的表示式 expression 為 NULL,則返回第二個引數的備用值。

  • 返回列表中的最大值
GREATEST(expr1, expr2, expr3, …)
  • 返回列表中的最小值
LEAST(expr1, expr2, expr3, …)
  • 計算日期 d1->d2 之間相隔的天數
DATEDIFF(d1,d2)
  • 如果表示式 expr 成立,返回結果 v1;否則,返回結果 v2。
IF(expr,v1,v2)

find_in_set(str,strlist)

  • find_in_set判斷是否包含某個字串
  • str 要查詢的字串
  • strlist 欄位名 引數以”,”分隔 如 (1,2,6,8,10,22)
  • 匹配個欄位是否為純數位 0為匹配純數位 1為匹配不是純數位
AND (TRIM(str) REGEXP ‘[^0-9.]') = 0
  • 將字串轉換為int數位型別
CAST(right(yearmth, 2) AS SIGNED)
  • 動態獲取資料庫某個欄位來作為條件
FIND_IN_SET (year_id,(SELECT
GROUP_CONCAT(DISTINCT LEFT(欄位, 4))
from table))

locate()函數

  • locate(subStr,string) :函數返回subStr在string中出現的位置
  • 只要找到返回的結果都大於0(即使是查詢的內容就是最開始部分),沒有查詢到才返回0;
// 如果字串 string 包含 subStr
locate(subStr,string) > 0
// 如果字串 string 不包含 subStr
locate(subStr,string) = 0

locate()函數實現模糊查詢

select * from user where locate('王',name)

假如現在需求是找出所有名字中含有王,但是不姓王的人找出來,我們用下面那種實現方式如下:

select * from user where locate('王',name,2)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com