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啓動,修改之後不用重啓
安裝插件
- 官網註冊,註冊完就會顯示一串密鑰了:https://zeroturnaround.com/software/jrebel/trial/,然後就可以使用
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