2019年2月19日19:25:42java
版本 2.1.3.RELEASEmysql
1,本地開發須要加依賴庫,保存實時熱更新ajax
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>
配置是否開啓spring
spring.devtools.add-properties=false
2,eclipse 格式化代碼熱鍵衝突,熱鍵是ctrl+shift+f 若是使用搜狗輸入法,在配置裏面取消掉sql
3,java代碼提示,Window ——> Preferences ——> Java ——> Editor ——> Content Assist 數據庫
[auto activation triggers for java]自動補全觸發器,默認是".", 這個位置能夠設置成26個字母外加'.':.abcdefghijklmnopqrstuvwxyz(不區分大小寫)json
[auto activation triggers for javadoc]javadoc的觸發器,默認是"@#".windows
4,@Controller 和 @RestControllerapi
@Controller 在使用模板的時候使用返回 是這個請求安全
若是隻返回body數據在方法加上 @ResponseBody
若是隻返回body數據就直接加上@RestController 註解
5,Loading class `com.mysql.jdbc.Driver'. This is deprecated.注意spring boot的版本
application.properties 修改
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
6,關於業務分層
@Service用於標註業務層組件,
@Controller用於標註控制層組件(如struts中的action),
@Repository用於標註數據訪問組件,即DAO組件,
@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註
7,開發手冊 ghost win10缺乏hh.exe
最簡單的方式就是其餘原裝系統中複製hh.exe(windows目錄),hhctrl.ocx,itss.dll,itircl.dll(windows/system32目錄)。
1.將裏面的hh.exe文件放置電腦 C:\Windows目錄下;
2.將 hhctrl.ocx ,itss.dll ,itircl.dll三個文件放置 C:\Windows\System32 目錄下;
3.以管理員方式打開cmd,輸入:
4.regsvr32 hhctrl.ocx
5.regsvr32 itss.dll
6regsvr32 itircl.dll 提示成功便可
8,根據表生產表模型
網頁工具:http://java.bejson.com/generator/
eclipse 自帶工具jpa工具 mybatis也有相似工具
jpa工具添加
https://blog.csdn.net/xwnxwn/article/details/53304153
https://blog.csdn.net/abc997995674/article/details/80227396
建議使用jpa tools
9,freemarker 配置
10,設置eclipse設置IDE編碼
https://blog.csdn.net/qq_20936333/article/details/81322007
11, @getMapping與@postMapping @RequestMapping
@getMapping與@postMapping 首先要了解一下@RequestMapping註解。 @RequestMapping用於映射url到控制器類的一個特定處理程序方法。可用於方法或者類上面。也就是能夠經過url找到對應的方法。 @RequestMapping有8個屬性。 value:指定請求的實際地址。 method:指定請求的method類型(GET,POST,PUT,DELETE)等。 consumes:指定處理請求的提交內容類型(Context-Type)。 produces:指定返回的內容類型,還能夠設置返回值的字符編碼。 params:指定request中必須包含某些參數值,才讓該方法處理。 headers:指定request中必須包含某些指定的header值,才讓該方法處理請求。 @getMapping與@postMapping是組合註解。 @getMapping = @requestMapping(method = RequestMethod.GET)。 @postMapping = @requestMapping(method = RequestMethod.POST)。
12,api返回restful風格的json數據格式,建議直接使用map作數據返回不用寫 RequestMapping的一些參數
public class ResponseHelper { public static Map<String, Object> responseData(int code, String message, Object data) { Map<String, Object> objects = new HashMap<String, Object>(); objects.put("code", code); objects.put("message", message); objects.put("data", data); return objects; } public static Map<String, Object> responseMessage(int code, String message) { Map<String, Object> objects = new HashMap<String, Object>(); objects.put("code", code); objects.put("message", message); return objects; } }
使用@RestController 註解,配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai
13,關於數據存儲時間和數據庫返回時間不一致好比相差13,14個小時,是由於mysql的配置時區致使的
通常直接設置默認時區加8個小時就oK
[mysqld] default-time-zone='+8:00'
14,數據庫主鍵生成策略
@GeneratedValue:
@GeneratedValue 用於標註主鍵的生成策略,經過strategy 屬性指定。默認狀況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
在javax.persistence.GenerationType中定義瞭如下幾種可供選擇的策略:
–IDENTITY:採用數據庫ID自增加的方式來自增主鍵字段,Oracle 不支持這種方式;
–AUTO: JPA自動選擇合適的策略,是默認選項;
–SEQUENCE:經過序列產生主鍵,經過@SequenceGenerator 註解指定序列名,MySql不支持這種方式
–TABLE:經過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可使應用更易於數據庫移植。
通常MySQL使用 @GeneratedValue(strategy = GenerationType.IDENTITY)
15字段自動更新
啓動類加@EnableJpaAuditing @EnableJpaAuditing @EntityListeners(AuditingEntityListener.class) 是用於監聽實體類添加或者刪除操做的。 @JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true) 這個註解是用於在除了在獲取createAt,updateAt屬性時進行操做,其餘建立和更新操做都由jpa完成 @Column(nullable = false, updatable = false) 其中updatable = false表示不進行更新操做 @CreatedDate 表示該字爲建立時間字段,在這個實體被insert時,設置值;@LastModifiedDate同理
16:請求參數接收的格式
@RequestParam post 請求不支持json格式
ajax的時候,爲了方即可以使用get,可是不安全
$("#apply_link_form").submit(function(){ parent.layer.close(index); //再執行關閉 $.ajax({ async: false, type: "POST", url:'${pageContext.request.contextPath}/link/apply', contentType : "application/x-www-form-urlencoded; charset=utf-8", data:$("#apply_link_form").serialize(), dataType: "text", success: function () { }, error: function () { } }) })
contentType : "application/x-www-form-urlencoded; charset=utf-8",
這個是關鍵
17:spring-boot @Component和@Bean的區別
@Component 是用在類上的
@Component
public class Student {
private String name = "lkm";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Bean 須要在配置類中使用,即類上須要加上@Configuration註解
@Configuration
public class WebSocketConfig {
@Bean
public Student student(){
return new Student();
}
}
若是你想要將第三方庫中的組件裝配到你的應用中,在這種狀況下,是沒有辦法在它的類上添加@Component註解的,所以就不能使用自動化裝配的方案了,可是咱們可使用@Bean。
18.jpa參考手冊
https://blog.csdn.net/qq_37939251/article/details/83052613
https://blog.csdn.net/yswknight/article/details/79257372
19,list的在for循環的時候使用add ,remove都會出現java.util.ConcurrentModificationException
解決辦法:使用Iterator的add ,remove
20,Iterator引發的java.util.NoSuchElementException異常
不論什麼狀況
一個while裏面不能調用兩次next,不會邊界溢出,異常錯誤名稱很明顯
demo
public List<AdminPermission> filterMenu(List<AdminPermission> permissionList, BigInteger adminId) throws Exception { List<BigInteger> adminPermission = getAdminPermission(permissionList, adminId); System.err.println(adminPermission.toString()); // 過濾菜單,目前固定三層 // list的在for循環的時候使用add ,remove都會出現java.util.ConcurrentModificationException // 使用Iterator的remove Iterator<AdminPermission> itr = permissionList.iterator(); while (itr.hasNext()) { List<AdminPermission> child1 = itr.next().getChild(); Iterator<AdminPermission> itr1 = child1.iterator(); while (itr1.hasNext()) { List<AdminPermission> child2 = itr1.next().getChild(); Iterator<AdminPermission> itr2 = child2.iterator(); while (itr2.hasNext()) { if (!adminPermission.contains(itr2.next().getId())) { itr2.remove(); } } // 必須這樣寫,否則會溢出邊界 if (child2.size() == 0) { itr1.remove(); } } if (child1.size() == 0) { itr.remove(); } } return permissionList;
21:getOne 方法出現 org.hibernate.LazyInitializationException: could not initialize proxy [com.zs.logistics.model.New#656] - no Session
主要是由於 數據庫模型有些字段懶加載致使的
解決辦法:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
在操做的實體上加上
@Proxy(lazy = false)
這個任何使用對加載性能有影響的,本身斟酌,我的建議,配置爲主,由於你不知要其餘開發人員的開發習慣,規避bug
22,freemarker時間,數字格式化
https://blog.csdn.net/pengpengpeng85/article/details/52070602
23;PageRequest pageable 翻頁問題是從0開始的,可是頁面翻頁是從1開始,減一就能夠,須要添加判斷
PageRequest pageRequest = PageRequest.of(pageNo - 1, pageSize, sort);
24,com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
錯誤緣由json化字段有null的值
發現是實體類中有的字段值爲null,因此在json化的時候,fasterxml.jackson將對象轉換爲json報錯
解決辦法:
在實體類上面加上註解 @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
25,Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自動生成時間和修改者
1.實體類加註解 /** * 建立時間 */ @CreatedDate @Column(name = "create_time") private Date createTime; /** * 修改時間 */ @LastModifiedDate @Column(name = "modify_time") private Date modifyTime; 2.實體類頭加註解 @EntityListeners(AuditingEntityListener.class) 3.SpringBoot啓動類加註解 @EnableJpaAuditing
在spring jpa中,支持在字段或者方法上進行註解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy,從字面意思能夠很清楚的瞭解,這幾個註解的用處。
@CreatedDate
表示該字段爲建立時間時間字段,在這個實體被insert的時候,會設置值
@CreatedBy
表示該字段爲建立人,在這個實體被insert的時候,會設置值
@LastModifiedDate、@LastModifiedBy同理
25,添加阿里雲鏡像
pom.xml
<repositories> <repository> <id>central</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <layout>default</layout> <!-- 是否開啓發布版構件下載 --> <releases> <enabled>true</enabled> </releases> <!-- 是否開啓快照版構件下載 --> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
簡單版
<repositories> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories>
26,This compilation unit is not on the build path of java project
.project 文件 加上
<nature>org.eclipse.jdt.core.javanature</nature>
27,editor does not contain a main type
在 解決方法: 對着:src 路徑右鍵 -> Build Path -> Use as Source Folder
28,java.sql.SQLNonTransientConnectionException: Could not create connection to driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/yinliu?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true driver: com.mysql.cj.jdbc.Driver
29,com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
mysql配置文件添加
wait_timeout=1814400
30 jpa映射 json格式數據
<!-- https://mvnrepository.com/artifact/com.vladmihalcea/hibernate-types-5 --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-5</artifactId> <version>2.4.3</version> </dependency>
並將此行添加到實體 @TypeDef(name = "json", typeClass = JsonStringType.class)
@Type( type = "json" name = "json_value") @Column( columnDefinition = "json" ) private List<String> jsonValue;
31,mysql tinyint 若是使用unsigned 是1-255,因此映射到jpa不能使用byte 須要int,java沒有無符號定義,byte 是-127到128
32,單引號,雙引號的區別
單引號引的數據 是char類型的——》單引號只能引一個字符(表示單個字符)雙引號引的數據 是String類型的——》而雙引號能夠引0個及其以上(引用字符串)char類型的值用單引號引發來的單個字符如: char a = 'b' 而java中的雙引號 表示字符串 一個或多個字符 如 String c = "abc" String d="a" 和char d=‘a’