記錄快捷編碼東西

1、idea中引入 lombok 插件,簡潔bean代碼

效果:不用自己手寫 get/set方法,只需要聲明屬性就行

在pom.xml中引入

<dependency>
    <groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.6</version>
	<!--<scope>provided</scope>-->
</dependency>

File-->Settings,或者使用快捷鍵Ctrl+Alt+S進入到設置頁面

Plugins進行插件的安裝,在右側選擇Browse repositories...,然後在搜索頁面輸入lombok可以查詢鼠標點擊右側Install按鈕,點擊安裝

在進入Build,Execution,Deployment-->選擇Compiler-->選中Annotation Processors,然後在右側勾選Enable annotation processing。

最後在實體類上加註解 @Data即可使用

 

2、springboot 啓動類配置端口,便於查看

//使用代碼指定端口8080
int port = 8080;
	if(!NetUtil.isUsableLocalPort(port)) {
		System.err.printf("端口%d被佔用了,無法啓動%n", port );
    	System.exit(1);
    }
new SpringApplicationBuilder(ProductServiceApplication.class).properties("server.port=" + port).run(args);

3、熱部署插件JRebel 

效果:部署之後採用JRebel啓動,修改之後不用重啓

     安裝插件

4、快捷鍵

Ctrl + F 在當前文件進行文本查找
Ctrl + O 快速重寫父類方法
Ctrl + P 方法參數提示
Ctrl + W 遞進式選擇代碼塊
Ctrl + Z 撤銷
Ctrl + Alt + L 格式化代碼 可以對當前文件和整個包目錄使用
Ctrl + Alt + B 在某個調用的方法名上使用會跳到具體的實現處
Ctrl + Alt + L 格式化代碼 可以對當前文件和整個包目錄使用
Ctrl + Alt + M 快速抽取方法(提取公共代碼封裝爲一個方法)
Ctrl + Alt + O 優化導入的類和包 可以對當前文件和整個包目錄使用
Ctrl + Alt + T 對選中的代碼彈出環繞選項彈出層(選if try/catch 等)
Ctrl + Alt + V 快速引進變量(自動聲明變量,如調用方法有個返回值不用手寫自動生成了)
Ctrl + Shift + U 對選中的代碼進行大/小寫輪流轉換
Ctrl + Shift + W 遞進式取消選擇代碼塊
Ctrl + Shift + Z 取消撤銷
Ctrl + Shift + / 代碼塊註釋
Ctrl + Shift + + 展開所有代碼
Ctrl + Shift + - 摺疊所有代碼
Ctrl + Shift + Space 智能代碼提示
Ctrl + Shift + Enter 自動結束代碼,行末自動添加分號

5、IDEA啓動項目:

效果:針對一些老闆項目實用,插件tomcat檢驗機制很低可以說沒有,一些老項目用tomcat會報jar包或者版本等問題,採用插件就可以忽略依然啓動。

啓動項目之前用到有,外部的tomcat,idea自帶的tomcat,maven,springboot的啓動類。

記錄一個插件,對比tomcat更快,更小 pom.xml 增加 

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	<artifactId>tomcat7-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<path>/</path>
		<port>8080</port>
		<uriEncoding>UTF-8</uriEncoding>
	</configuration>
</plugin>

 

6、二進制文件轉base64:

String base64 = new sun.misc.BASE64Encoder().encode(file.getBytes());

7、自定義快捷代碼 idea

自定義註釋:

類:File-->settings-->Editor-->File and Code Templates-->Files

/**
  * Copyright (C), 2019-${YEAR}, XXX有限公司
  * FileName: ${NAME}
  * Author:   PanY
  * Date:     ${DATE} ${TIME}
  * Description: ${DESCRIPTION}
  * History:
  * <author>          <time>          <version>          <desc>
  * 作者姓名           修改時間           版本號              描述
  */放在類的最頂部
/**
 * 〈一句話功能簡述〉<br> 
 * 〈${DESCRIPTION}〉
 *
 * @author PanY
 * @create ${DATE}
 * @since 1.0.0
 */放在類名上

方法:File-->Settings-->Editor-->Live Templates   與自定義快捷代碼是一樣的,新建一個group 命名爲 **  

**
 * 功能描述: <br>
 * 〈$end$〉
$param$
 * @author PanY
 * @date $date$ $time$
 * @return $return$
 */     複製進入

點擊模板頁面最下方的警告,來設置將模板應用於那些場景,一般選擇EveryWhere-->Java

選擇右側的Edit variables按鈕

groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n' : '')}; return result", methodParameters())

8、某些特定的情況下使用service

如果在工具類,需要使用service(一般不會這樣,可能有特殊情況)

1、在工具類上加註解 @Component   

    @Component
                public class AccOpenService 

2、第二寫一個自己service   這裏類名叫  AccOpenService  實際並不是

    private static AccOpenService accOpenService;

3、和controller一樣引用某個service

        @Autowired
        ImageRetentionService imageRetentionService;

4、寫加載方法

        @PostConstruct
	public void init() {
    	    accOpenService = this;
	    accOpenService.imageRetentionService = this.imageRetentionService;
	}

 後面就可以使用,imageRetentionService.save等方法

9、mybatis的xml

<select
  id="selectPerson"
  parameterType="int"
  parameterMap="deprecated"
  resultType="hashmap"
  resultMap="personResultMap"
  flushCache="false"
  useCache="true"
  timeout="10"
  fetchSize="256"
  statementType="PREPARED"
  resultSetType="FORWARD_ONLY">
id	在命名空間中唯一的標識符,俗稱方法名稱與dao層相對應。
parameterType	將會傳入這條語句的參數類的完全限定名或別名。俗稱入參,傳入的參數類型和名稱 默認值爲未設置(unset)可以不傳。
resultType	返回期望類型。 注意如果返回的是集合,那應該設置爲集合的類型 java.util.list,可以使用 resultType 或 resultMap,但不能同時使用。
resultMap	外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多複雜映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同時使用。
flushCache	將其設置爲 true 後,只要語句被調用,都會導致本地緩存和二級緩存被清空,默認值:false。
useCache	將其設置爲 true 後,將會導致本條語句的結果被二級緩存緩存起來,默認值:對 select 元素爲 true。
timeout	這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值爲未設置(unset)(依賴驅動)。
fetchSize	這是一個給驅動的提示,嘗試讓驅動程序每次批量返回的結果行數和這個設置值相等。 默認值爲未設置(unset)(依賴驅動)。
<insert
  id="insertAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  keyProperty=""
  keyColumn=""
  useGeneratedKeys=""
  timeout="20">

<update
  id="updateAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">

<delete
  id="deleteAuthor"
  parameterType="domain.blog.Author"
  flushCache="true"
  statementType="PREPARED"
  timeout="20">
id	命名空間中的唯一標識符,方法名稱。
parameterType	將要傳入參數的完全限定類名或別名。MyBatis 可以通過類型處理器推斷出具體傳入語句的參數,默認值爲未設置(unset)。
flushCache	將其設置爲 true 後,只要語句被調用,本地緩存和二級緩存被清空,默認值:true(對於 insert、update 和 delete 語句)。
timeout	這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值爲未設置(unset)(依賴驅動)。
useGeneratedKeys	(僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關係數據庫管理系統的自動遞增字段),默認值:false。
keyProperty	(僅對 insert 和 update 有用)唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設置它的鍵值,默認值:未設置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn	(僅對 insert 和 update 有用)通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當主鍵列不是表中的第一列的時候需要設置。如果希望使用多個生成的列,也可以設置爲逗號分隔的屬性名稱列表。
添加設置多個,使用循環
<foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
</foreach> 

 

元素中的語句將會首先運行,table 的 id 會被設置,然後插入語句會被調用。提供一個與數據庫中自動生成主鍵類似的行爲,保持了代碼的簡潔
<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">
selectKey 

keyProperty	selectKey 語句結果生成的列。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn	匹配屬性的返回結果集中的列名稱。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
resultType	結果的類型。MyBatis 通常可以推斷出來,寫上也不會有什麼問題。如果希望作用於多個生成的列,則可以使用 Object 或 Map。
order	這可以被設置爲 BEFORE 或 AFTER。如果設置爲 BEFORE,那麼它會首先生成主鍵,設置 keyProperty 然後執行插入語句。如果設置爲 AFTER,那麼先執行插入語句,然後是 selectKey 中的語句 - 這和 Oracle 數據庫的行爲相似,在插入語句內部可能有嵌入索引調用。
statementType	與前面相同,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 語句的映射類型,分別代表 PreparedStatement 和 CallableStatement 類型。

 

Sql:用來定義可重用的 SQL 代碼段
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

refid="userColumns" 使用哪個sql代碼段  name="alias" 代碼段中的謀個變量名  value="t1" 參數

屬性值也可以被用在 include 元素的 refid 屬性裏或 include 元素的內部語句中
<sql id="sometable">
  ${prefix}Table
</sql>

<sql id="someinclude">
  from
    <include refid="${include_target}"/>
</sql>

<select id="select" resultType="map">
  select
    field1, field2, field3
  <include refid="someinclude">
    <property name="prefix" value="Some"/>
    <property name="include_target" value="sometable"/>
  </include>
</select>
查詢 字段:field1, field2, field3  表爲 Some 或者 ${prefix}Table 兩種寫法
${column} = #{value} ${}與#{}的區別   ${}會直接用,#{}佔位符並安全地設置參數,更安全,就如採用(?)這種設置參數
應用場景:當根據 名稱查詢一條數據,id查詢一條數據,手機號碼查詢一條數據。單寫需要三個方法,採用${}與#{}一個就好

@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);

User user = findByColumn("id",id);
User user = findByColumn("name",id);

*用這種方式接受用戶的輸入,並將其用於語句中的參數是不安全的,會導致潛在的 SQL 注入攻擊,因此要麼不允許用戶輸入這些字段,要麼自行轉義並檢驗
使用外部的 resultMap 解決列名不匹配
<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>
column:數據庫名稱  property:實體類名稱
constructor - 用於在實例化類時,注入結果到構造方法中
idArg - ID 參數;標記出作爲 ID 的結果可以幫助提高整體性能
arg - 將被注入到構造方法的一個普通結果
id – 一個 ID 結果;標記出作爲 ID 的結果可以幫助提高整體性能
result – 注入到字段或 JavaBean 屬性的普通結果
association – 一個複雜類型的關聯;許多結果將包裝成這種類型
    嵌套結果映射 – 關聯本身可以是一個 resultMap 元素,或者從別處引用一個
collection – 一個複雜類型的集合
    嵌套結果映射 – 集合本身可以是一個 resultMap 元素,或者從別處引用一個
discriminator – 使用結果值來決定使用哪個 resultMap
case – 基於某些值的結果映射
    嵌套結果映射 – case 本身可以是一個 resultMap 元素,因此可以具有相同的結構和元素,或者從別處引用一個

 

 

問題記錄

1、Oracle 遇到一個需求,A表的某個列在B表中存在則表示A已經有反之則否,是與否需要在頁面展示出來

方法1:在A表新增一個字段,在插入數據時進行判斷添加數據

方法2:直接採用sql語句,儘量少改動已經寫好的底層數據操作(考慮到項目的耦合度,改了可能有其他的聯動需要修改或者一些錯誤,工作量稍大且繁雜)

sql爲:select   A.id , A.name , decode(B.uname , A.name , '是' , '否') as showstring
from user A left join userInfo B on A.name = B.uname    關鍵爲:decode(a表字段 , b表字段 , '相同展示' , '不相同展示')

 

2、當實體類中的字段與需要的字段或者數據庫不同時,例如

@ParamName("bookCharge.checkNumber")
private String bookChargeCheckNumber; 需要@ParamName

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章