Mysql 通用任意單錶查詢API設計

2021-10-05 03:07:34 字數 4094 閱讀 8898

1/資料庫任意單錶查詢的重複勞動

2/資料庫任意單錶多業務需要不同欄位的重複勞動

#說明1/黑名單設計,解決敏感表和敏感字段攔截

2/防sql注入處理,對key,value的合法性進行驗證

3/對於表名暴露給前端,有兩種處理方式,一種由node層來傳參,一種伺服器新增乙個表名對映,實現邏輯表與物理表的聯絡

4/為了效能考慮,fields與filter為必填項

5/可擴充套件:加入分頁查詢,可以實現任意表的分頁查詢

使用場景:

1

/根據id查詢,返回id,name欄位}2

/in查詢}3

/like查詢}}

4/範圍查詢 大於,小於}}

5/反向查詢,不等於}}

6/巢狀邏輯範圍查詢,$and,$or

,"name":}

}}where group_account=

'001' and (type !=

1 or name like '富貴%')7

/根據關鍵字模糊匹配,倒序前5條記錄},

"sort":,

"limit":5

}

#實體物件

@data

@builder

@allargsconstructor

@noargsconstructor

public

class

queryreq

implements

serializable

, * "activity_type":,

* "activity_name":,

* "$and":,

* "$or":,

* "prize_configure":["1111","0001","1001"]* }

*/@notnull

(message =

"'filter' 不能為空"

)private map

filter;

/** * 返回型別 list | obj

*/private string resulttype =

"list"

;/**

* 返回記錄數

*/private integer limit;

/** * 排序,eg:

*/private linkedhashmap

sort;

/** * 是否顯示sql

*/private

boolean showsql =

false

;}

#解析器,轉sql語句

@service

@slf4j

public

class

commonservice

public object query

(queryreq queryreq)

queryreq.

getfields()

.foreach

(item-

>})

;if(queryreq.

gettable()

== null)

stringbuilder sql =

newstringbuilder

("select ");

sql.

(string.

join

(","

,queryreq.

getfields()

)); sql.

(" from ");

sql.

(queryreq.

gettable()

);sql.

(" where ");

sql.

(buildwhere

("$and"

,queryreq.

getfilter()

)); sql.

(buildsort

(queryreq.

getsort()

)); sql.(!

"list"

.equals

(queryreq.

getresulttype()

)?" limit 1 "

:queryreq.

getlimit()

== null?"":

" limit "

+queryreq.

getlimit()

);log.

debug

("generator sql:{}"

,sql.

tostring()

);if(queryreq.

isshowsql()

)try

return resultlist;

}catch

(exception e)

}private

void

validatekey

(string item)

}private

void

validatevalue

(string item)

}private string scopestr

(string item,

int start,

int end)

private string buildsort

(linkedhashmap

sort)

stringbuilder valstr =

newstringbuilder

(" order by ");

boolean isfirst =

true

;for

(string item : sort.

keyset()

)if(!isfirst)

isfirst =

false

; valstr.

(item).(

" ")

.(sort.

get(item)).

(" ");

}return valstr.

tostring()

;}private string buildwhere

(string connector,map

filter)

isfirst =

false;if

(scope.

contains

(key)

)else

if(filter.

get(key)

instanceof

map)

else

}return valstr.

tostring()

;}private string buildvariablevalue

(string key, map

filter)

string connector ="";

switch

(item)if(

!isfirst)

isfirst =

false

; valstr.

(key)

.(connector).(

buildstrvalue

(filter.

get(item)))

;}return valstr.

tostring()

;}private string buildvalue

(object val)

else

return valstr.

tostring()

;}private string buildstrvalue

(object val)

validatevalue

(val.

tostring()

);return

"'"+val.

tostring()

+"'";}

}

MySQL 單錶查詢

1 基本資料記錄查詢 列出表的所有字段 select field1,field2.fieldn from tablename 2 符號的使用 select from tablename 其中,符號 表示所有欄位名 tablename 引數表示表的名稱。3 條件資料記錄查詢 select field1...

Mysql單錶查詢優化

原文url 我最近碰到了很多效能很糟糕的mysql單錶查詢。原因很簡單 索引建立得不正確,導致執行計畫的效能低下。下面是一些能幫助你優化單錶查詢效能的要點。索引主要做3件事 過濾 filter 排序或分組 sort group 覆蓋 cover 前兩個沒什麼好說的,但並不是每個人都知道什麼叫 覆蓋索...

MySQL查詢資料之單錶查詢

單錶查詢的語法 select 字段 from 表名 查詢表中的所有資料 where 條件 加where查詢表的部分資料 eg select stu name,gender,stu on from student 不同欄位用逗號隔開 可以替換所有的字段細資訊 eg select from 表名 字段重...