關鍵是擴大自己的視野,因為有的我真的不知道可以這樣寫?
比如:
一:if test --可以去掉多余的and
<if test = "defaultQuery and sum == false"> AND (sysdate - T.CREATED) < 90 </if>
<if test = "limit30 and sum == false"> AND (sysdate - T.CREATED) < 30 </if>
sql排序語句order by、test里面的表達式,limit30是model中的一個布爾變量,sum是統布爾計變量,
如果limit30 傳 true ,sum 傳 false,就是不統計,那么 test 表達式就為 true,那么就會走后面的語句(只查詢近30天的記錄),否則不走。
如果前端不傳limit30,布爾默認為false,那么怎么都不會走下面的。也就是
要查90天就是 傳 defaultQuery = true,要查30天 就傳limit30 = true.
二:一個字段代表多層意思進行搜索
<!--按照 產品描述,物料號,內部型號,外部型號 進行搜索-->
<if test = "productName != null and productName != '' ">AND ( T1.X_NAME like '%'||#{productName}||'%' OR T1.PART_NUM like '%'||#{productName}||'%'OR T2.ATTRIB_01 like '%'||#{productName}||'%'OR T2.ATTRIB_02 like '%'||#{productName}||'%')
</if>
java執行sql語句?三:mybatis調用存儲過程寫法
<select id = "quote2agreement" statementType = "CALLABLE" parameterType="java.util.Map"><![CDATA[{call QUOTE_TO_AGREE_COMMIT( #{AGREE_ID,mode=IN,jdbcType=VARCHAR} )}]]>
</select>
QUOTE_TO_AGREE_COMMIT 這個應該是 存儲過程的名字。 ()這個應該存儲過程要用到的參數
statementType = “CALLABLE” 這個應該是固定寫法,如果是調用存儲過程的話。
java生成sql文件、四:有的話,再寫。到PLSQL去看了下 文件夾 Procedures(存儲過程),看了很多 綠色P圓圈,可能就是Procedures的標志吧看了上面的 QUOTE_TO_AGREE_COMMIT 這個。所以看看別人是怎么寫存儲過程的。
create or replace procedure QUOTE_TO_AGREE_COMMIT(AGREE_ID in varchar2) isAGREE_ID1 varchar2(50) := null ; -----合同Id OPPTY_ID1 varchar2(50) := null ; -----商機Id QUOTE_ID1 varchar2(50) := null ; -----報價Id CHANNEL_ID varchar2(50) := null ; -----招投標結果,中標渠道Id Standard_Payment varchar2(100) := null ; -----客戶標準付款方式Payment_Days varchar2(100) := null ; -----客戶賬期 Black_Type varchar2(100) := null ; -----黑名單類型PR_ADDR_ID varchar2(50) := null ; -----客戶地址Id ATTRIB_07 varchar2(50) := null ; -----付款Id ORDER_DATES varchar2(50) := null ; -----預期天數 LoginID varchar2(50) := null ; -----用戶Id beginAGREE_ID1 := AGREE_ID;
/* select substr( AGREE_ID,0,instr(AGREE_ID,';') -1 ) tt into AGREE_ID1 from dual;select substr( AGREE_ID,0,instr(AGREE_ID,';') +1,length(AGREE_ID) ) tt into LoginID from dual; *//*根據合同Id,匹配其他邏輯需要的信息*/select T.QUOTE_ID,T.OPTY_ID,T.CREATED_BY into QUOTE_ID1,OPTY_ID1,LoginID from siebel.s_doc_agree T where T.ROW_ID = AGREE_ID1;
/* \*獲取當前登錄人的用戶Id*\
select t2.row_id into LoginID from siebel.s_user T2 where T2.LOGIN in (select t.USERNAME from user_users T);
*/
--如果合同Id 和 商機Id 都不為空的情況下,將招投標結果客戶 寫到合同下單渠道
IF ( AGREE_ID1 IS NOT NULL AND OPPTY_ID1 IS NOT NULL) THEN select T.CHANNEL_IDinto CHANNEL_IDfrom sieble.CX_BIDDING_RE Twhere T.OPTY_ID = OPPTY_ID1and ROWNUM <= 1;
--如果招投標結果的中標渠道不為空,獲取中標渠道客戶的賬期信息
if ( CHANNEL_ID is not null ) thenselect T2.ATTRIB_47,T2.ATTRIB_59,T.X_BLACK_TYPE,T.PR_ADDR_ID,T2.ATTRIB_07into Standard_Payment,Payment_Days,Black_Type,PR_ADDR_ID,ATTRIB_07from siebel.s_org_ext T, siebel.s_org_ext_x T2where T.ROW_ID = CHANNEL_IDand T.ROW_ID = T2.PAR_ROW_ID(+);
/*把中標渠道客戶設置到生成的合同上,并同時更新賬期信息*/update siebel.s_Doc_Agree T set T.X_ACCOUNT_ID = CHANNEL_ID,T.BILL_TO_ADDR_ID = PR_ADDR_ID,T.X_CONSIGNEE_ADD_ID =PR_ADDR_ID,T.X_CONSIGNEE_ACC_ID =CHANNEL_ID,T.X_CUS_PAY_ID =ATTRIB_07,T.X_BLACK_TYPE =Black_Type,T.X_ACCNT_DAYS =Payment_Days,T.X_ACCNT_PAY_TYPE =Standard_Paymentwhere T.ROW_ID = AGREE_ID1;commit;end if; --判定招投標結果 尾
END IF; --判定合同ID 和商機Id 都不為空/*將報價銷售團隊,復制到生成的合同中*/
siebel.quote_to_agree_add_position(AGREE_ID1,QUOTE_ID1); --這應該是個寫好的方法吧。/*回寫報價下產品清單的請求數量*/
siebel.UPDATE_QUOTE_ITEM_NUM(QUOTE_ID1);/*更新商機的銷售階段*/
siebel.Change_Oppty_Stage(OPPTY_ID1);/*報價生成合同后回寫標記*/
siebel.Update_Quote_Flag(QUOTE_ID1);/*下單客戶是否轉交易 置為Y,并且通過ERP視圖 獲取下單客戶的預期款天數*/
siebel.ORDER_ACCOUNT_CHECK(QUOTE_ID1,ORDER_DATES);/*對生成的合同進行邏輯操作*/
siebel.UPDATE_AGREE(AGREE_ID1,LoginID);/*檢查合同行的意向單價與報價行是否一致,解決小數點問題*/
--siebel.QUOTE_TO_AGREE_FIXPRICE(AGREE_ID1,QUOTE_ID1);end QUOTE_TO_AGREE_COMMIT;
五:創建表,創建索引
偶爾看到的,語法如下:
--create table創建表
create table S_DOC_AGREE
(
row_id varchar(15) not null,
created DATE default sysdate not null,
created_by varchar(15) not null,
last_upd DATE default sysdate not null,
dcking_num number(22,7) default 0,
active_id char(1) default 'N' not null,
agr_active_id char(1) default 'Y' not null,
name varchar2(50) not null,
rev_num number(22,7) not null,
eff_date DATE,
desc_text varchar2(255)
...
)--表空間
tablespace SIEBELDATApctfree 10initrans 1maxtrans 255storage ( intial 1M next 8K minextends 1 maxextends unlimited);--create / recreate indexs 創建索引
create index S_DOC_AGREE_F52 on S_DOC_AGREE(FN_ACCNT_ID)tablespace SIEBELINDEXpctfree 10initrans 2maxtrans 255storage ( initial 1M next 1M minextends 1 maxextends unlimited );...
--grant/revoke object privileges 賦予/撤回 對象特權。grant select ,insert,update ,delete on S_DOC_AGREE to IF_USER with grant option; //賦予增刪改查權限?、grant select ,insert,update ,delete on S_DOC_AGREE to SSE_ROLE;
六:今天看到了 一個新的標簽,Mybatis中的sql。也可能是我之前忘記了,可能不常用吧,還是寫下來。
<select id="getHomeFunctionList" resultMap="HomeFunctionMapperTwo" parameterType="com.xxxxx.model.setting.HomeFunctionModel" >select t.* ,case when t1.parentid is null and t.name != '公共辦公' then 'N' else 'Y' end as ISCHILDRENfrom t_home_function tleft join ( select distinct a.parentid from t_home_function a where a.parentid is not null) t1 on t.id=t1.parentidwhere <if test ="type != -1"> t.type = #{type}</if><choose> <!--我日,第一次在項目中看到。這個感覺和 if test 沒區別吧--><when test="parentId != null and parentId != '' "> and t.parentid = #{parentId}</when><otherwise>and t.parentid is null </otherwise></choose>order by idx
</select>
七:2019-3-25今天在SettingMapper中 又看到了一個新的sql,update標簽的
應該是是修改密碼。 T_CONFIG中的VALUE字段是 密碼。具體可以看 另一篇文章:登陸接口補充
我去,后來我又看到了 好多啊。還有insert ,delete 里面都有這種寫法。insert內有selectKey標簽
<!--更新語句后,執行插入,在執行查詢?可以這樣寫?、 插入語句,這樣寫 有問題吧? insert into 表 (字段) select ?????->
<sql id="insertLog">insert into T_LOG (ID , opration,content,created,loginname)select ( select max(id)+1 from (select id from T_LOG union all select 0 from dual) ) , '${opration}', '${content}' , systimestamp,#{loginname}from dual ;
</sql><!--修改密碼:編輯配置信息-->
<update id="editConfig" parameterType="com.xxxxx.commmon.model.ConfigModel">beginupdate T_CONFIG set VALUE = #{value} where KEY = #{rowId} ;<include refid = "isnertLog"><property name="opration" value="編輯配置信息" /><property name="content" value="id = ${rowId} ,新值 = ${value}" /></include>end ;
</update><!--編輯關鍵字-->
<insert id="editKey" parameterType="com.xxxxx.model.setting.KeyModel">begin<!--這個表示在執行 insert 語句之前,首先執行 selectKey(不一定為主鍵字段)語句,并把得到的結果 賦值給 totalRecords.--><selectKey keyProperty="totalRecords" resultType="int" order="BEFORE"> select count(1) from T_PERMISSION_KEY where KEY = #{rowId}</selectKey><if test="totalRecords != 0">update T_PERMISSION_JEY set (NAME,DESCRIPTION,TYPE) = (select #{name} , #{decription} ,#{type} from dual)where KEY = #{rowId};<include refid = "isnertLog"><property name="opration" value="更新關鍵字" /><property name="content" value="id = ${rowId} ,名稱 => ${name}" /></include></if><if test="totalRecords == 0">insert into T_PERMISSION_KEY set (KEY,NAME,DESCRIPTION,TYPE) values (#{rowId},#{name} , #{decription} ,#{type}) ;<include refid = "isnertLog"><property name="opration" value="新增關鍵字" /><property name="content" value="id = ${rowId} ,名稱 => ${name}" /></include></if> end;
</insert><!--刪除關鍵字-->
<delete id="delKey" parameterType="com.xxxx.model.setting.KeyModel" >beindelete from T_PERMISSION_KEY where KEY = #{rowId};<include refid = "isnertLog"><property name="opration" value="刪除關鍵字" /><property name="content" value="id = ${rowId}" /></include>end;
</delete>
其中涉及的KeyModel如下:
包:com.xxxxx.model.setting
KeyModel(埋點信息) extends BaseModel
name—名稱 decription—描述 int type= -1;—類型
其實埋點是啥,我不是不清楚。不知道用的多不多。
八:2019-03-27:今天Siebel又提供我了一個sql,里面用到了一個關鍵字 EXISTS,可能我很久沒寫過了,都忘記怎么用了。今天就下下來回憶回憶.基本計數很少用count(*) ,都是用COUNT(1),我在mapper.xml中都沒看到過COUNT() .
1可以刪除 0不可以刪除
SELECT COUNT(1) FROM DUAL
WHERE ( EXISTS ( select 1 from SIEBEL.CX_UBID_APPLY T1 WHERE T1.ROW_ID = #{rowId} AND CREATED_BY = #{loginId} ) OR EXISTS ( select 1 from SIEBEL.S_LST_OF_VAL T2 WHERE T2.TYPE= 'DH_UNBID_MANAGER' AND T2.NAME = '非標管理員' AND T2.ACTIVE_FLG = 'Y' AND T2.LANG_ID = 'CHS' AND INSTR(T2.DESC_TEXT,#{loginName})>0 ) )AND EXISTS( select 1 from SIEBEL.CX_UBID_APPLY T1 WHERE T1.ROW_ID = #{rowId} AND (T1.X_FCHECKSTATUS IS NULL OR T1.X_FCHECKSTATUS = '未啟動') )
九:如果可以請使用 【between and】 或者【Exists】來代替 【in,not in】;
如果一個擴展虛擬表 被多次重復使用 請使用【with】語法。
sql優化的本質是:避免全表掃描,盡量使用索引。
比如:模糊搜索的時候盡量使用“a%”(走索引),不要使用“%a%”.(不走索引)
INSTR(T1.X_FTASKERS, #{loginName}) > 0
這個呢類似于
T1.X_FTASKERS like '%'||#{loginName}||'%'
十:Model中的get set方法
ContractModel
public String getMyAccountType(){if("甲方".equals(this.getAccountType())){ return "甲方客戶";}if( "戰略工程商".equals(this.getChannelAccountType()) || "核心工程商".equals(this.getChannelAccountType()) ||"普通工程商".equals(this.getChannelAccountType()) ||"中小工程商".equals(this.getChannelAccountType()) ){ return “工程商”;}return "分銷商";
}
十一:HTTP代碼
400----BadRequest : 1前段提交的字段與后臺尸體類型不一致。2后臺需要json字符串類型,前段沒有將對象轉化為String類型。
404—路徑錯誤
405—請求方法get,post使用錯誤
415—(media-Type)傳輸的數據格式錯誤
203—重定向
500—服務器錯誤,也就是內部代碼有問題
304—查詢的數據走的是本地緩存。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态