1. 程式人生 > >框架 總結吧,理解不是太深

框架 總結吧,理解不是太深

1,瞭解orm-mapping框架
準備表,物件,jar包。配置檔案。hibernate操作基本步驟。使用hibernate完成增刪改查。
2.什麼是框架
(1)是一系列jar包,其本質是對jdk功能的擴充套件
(2)框架是一組程式的集合,包含了一系列最佳實戰,作用是解決某一領域問題
3.完善的持久層問題。持久層封裝資料訪問的細節,為業務邏輯層提供了面向物件的api、
1.程式碼重用性高,可以完成所有的資料訪問操作
2.可以支援多種資料庫,比如在mysql和oracle之間任意切換資料庫
3.具有相對獨立性,當持久層變化時,不會影響上一層實現
4.ORM--物件關係對映
          是一種為了解決面向物件與關係資料庫存在的不匹配現象。ORM是通過使用描述物件和資料庫之間對映的元資料,
        將java程式中的物件自動持久化到關係資料庫中。
         避免直接使用SQL語句對關係型資料庫中的資料進行操作. 減少程式碼編寫量,提高產品質量
    ORM--實現思想
        將關係資料庫中表中的記錄對映成為物件,以物件的形式展現,程式設計師可以把對資料庫的操作轉化為對物件的操作。
       因此ORM的目的是為了方便開發人員以面向物件的思想來實現對資料庫的操作。
   ORM--採用元資料描述物件-關係對映細節
       元資料通常採用 XML 格式,並且存放在專門的物件-關係對映檔案中。
  目前流行的ORM框架
      1.JPA:本身是一種ORM規範,不是ORM框架.由各大ORM框架提供實現.
      2.Hibernate:目前最流行的ORM框架.設計靈巧,效能優秀,文件豐富.
      3.MyBatis:本是apache的一個開源專案iBatis,提供的持久層框架包括SQL Maps和DAO,允許開發人員直接編寫SQL.
5. hibernate與JPA區別?---是JPA規範的一個實現

6. Query和Criteria都表示查詢物件:
    Query不僅可以使用QBC,QBE,HQL,原生SQL查詢資料,而且支援繫結引數,限制查詢記錄,批處理等操作.
    Criteria與Query介面非常相似,執行建立並執行面向物件方式的查詢.
7.一級,二級快取
use_second_level_cache true 配置二級快取供應商,執行時,一級關閉,實行二級,不必sql語句查詢
二級快取快取供應商|
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

8.get和load區別
使用get()和普通的單條查詢並沒有多大的區別,並且返回的物件也是實際的物件。
使用load()的時候返回的是一個代理物件,因為這個時候還沒有進行查詢,所以我們並沒有辦法確定要查詢的物件到底存在不存在,
所以使用load()查詢的返回值是永遠不會為空的
**即get()和load()都會使用快取,都是首先從一級快取Session中查詢,當找不到的時候再去二級快取中查詢,
當查詢不到的時候get()返回的是null,而load()則返回代理物件。

9.自動生成資料庫表:
根據物件和對映檔案,在建立SessionFactory的時候,可以生成對應的資料表:
hibernate.hbm2ddl.auto=create-drop:刪除並建立表,最後關閉SessionFactory時,刪除資料庫表.
hibernate.hbm2ddl.auto=create:刪除並建立表
hibernate.hbm2ddl.auto=update:更新表結構:
hibernate.hbm2ddl.auto=validate:驗證表結構:如果表結構和對映檔案不匹配,hibernate啟動失敗

        1,validate:
   檢查當前hibernate管理的物件對應資料庫的表結構是否匹配,如果有任何不匹配,直接報錯,hibernate啟動失敗;
      2,在生產環境中一般使用vaildate,保證當前資料庫表版本和hibernate當前物件版本匹配;

10.一對多對映總結:

分析SQL:
get方法:
    1:通過one方獲取many方,使用了延遲載入.
    2:one方的many方的屬性是一個集合,必須使用介面來宣告.
    3:不能通過if-null來判斷one方是否有many方,只能通過size方法來判斷.
   4:必須在session關閉之前使用集合物件,否則報錯:no session.
save方法:
  由One方來維護外來鍵關係,所以得發額外的兩條SQL:
   在儲存物件的時候,因為物件的關係由one方維護,所以,在儲存many方的時候,不會去修改外來鍵的值;
  只能在one方儲存完成之後,由one方傳送額外的update語句去修改many方的外來鍵的值;
11.多對一
   分析get方法:
      1:many方獲取one方的時候,使用了延遲載入,生成了代理物件
      2:可以使用if-null方式來判斷,是否存在one方.
     3:得到的one方,必須在session關閉之前例項化(獲取非OID屬性),否則報錯:no session.
  分析save方法:
      先儲存many方再儲存one方,會產生額外的SQL,這些SQL是由於持久化物件(many)的髒資料造成的;
12.註解
@Column :表示對映屬性,和表的欄位進行關聯
@ManyToOne:表示對映關係中的多對一
@JoinColumn:表示外來鍵對映屬性,和表的外來鍵欄位進行關聯
@OneToMany:表示對映關係中的一對多,一對多時,外來鍵的維護需要翻轉交給多的一方進行維護,
需要配置反轉屬性mappedBy,屬性取值為多的一方的對映屬性名稱。相當於xml配置檔案中的Inverse="true"。
@OrderBy:表示排序欄位
一對多對映中使用:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "表名")
@OrderBy(clause = "cityId asc")
public Set<City> getCities() {
return this.cities;
}

13。Maven*********************************************
-----構建,編譯程式碼,執行測試,打包,部署應用,執行伺服器。
依賴,專案依賴大量的第三方包,第三方包又依賴另外的包,對依賴包管理非常麻煩

14.Spring-Mvc************************************
-----模型model(javabean), 檢視view(jsp/img) 控制器Controller(Action/servlet)
目前web應用中,99%的專案都會使用mvc模式開發.

15,Spring-Mvc簡介:
Spring MVC是基於MVC模式的一個框架,它解決WEB開發中常見的問題(引數接收、檔案上傳、表單驗證、國際化、等等),
而且使用簡單,與spring無縫整合。
16.核心包:
commons.logging-1.1.1.jar
spring-beans-4.3.5.RELEASE.jar
spring-context-----------.RELEASE.jar
spring-core-4.3.5.RELEASE.jar
spring-expression-4.3.5.RELEASE.jar
spring-web-4.3.5.RELEASE.jar spring 對web專案的支援。
spring-webmvc-4.3.5.RELEASE.jar spring mvc核心包
17. 層數:
j2ee應用程式分為三層
表現層(控制層) @Controller @Scope @Nullable
業務邏輯層(服務Service) @Service
資料持久層(DAO) @Resposotory
18.中文亂碼處理
以前編碼我們自己寫,request.setCharacterEncoding("utf-8");
既然是重複的程式碼,更傾向於抽取抽取,springMVC已經做了這樣的工作了.
在web.xml中配置符編碼過濾器
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

19.傳值方式:
//return "userList"; //預設情況下通過檢視轉換器轉發到指定的jsp,
無法通過重定向的方式訪問web-inf下的jsp頁面
//return "forward:/userList.jsp"; //轉發到指定的jsp
return "redirect:/userList.jsp"; //重定向到指定的jsp
//return "redirect:/list"; //重定向到指定的action
//return "forward:/list"; //轉發到指定的action

20.配置檔案上傳 xml中
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設定上傳檔案的最大尺寸為1MB -->
<property name="maxUploadSize">
<value>1048576</value>
</property>
</bean>
匯入包:com.springsource.org.apache.commons.fileupload-1.2.0.jar
com.springsource.org.apache.commons.io-1.4.0.jar

表單:<form action="/upload" method="post" enctype="multipart/form-data">
檔案:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
Controller:@RequestMapping("/upload")
public ModelAndView upload(MultipartFile file){
System.out.println(file.getContentType());//獲取到檔案型別
//file.getInputStream();//獲取到檔案流
System.out.println(file.getName());//上傳過來的檔名
System.out.println(file.getOriginalFilename());//檔案原始名稱
System.out.println(file.getSize());//檔案大小
//需要獲取到檔案上傳的那個檔案
FileOutputStream os = null;
try{
//需要將檔案儲存到伺服器的某個目錄下
//名字需要通過UUID來重新命名
String lastName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String startName = UUID.randomUUID().toString();
String fileName = startName+lastName;
System.out.println(fileName);
os = new FileOutputStream(new File("D:/file",fileName));
InputStream is = file.getInputStream();
IOUtils.copy(is, os);
}catch(Exception e){
e.printStackTrace();
}finally{
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ModelAndView mv = new ModelAndView("upload.jsp");
return mv;
}
檔案下載

檔案下載,SpringMVC並沒有做過多的封裝,還是使用原來的下載方式

@RequestMapping(value="/download")
//如果你不想使用springmvc預設的ModelAndView的方式,使用@ResponseBody註解
@ResponseBody//該方法響應內容全都有response控制,(springmvc不會做任務事情)
public void download(HttpServletResponse response) throws Exception{
response.setHeader("Content-Disposition", "attachment;filename=a.jpg");
OutputStream out = response.getOutputStream();
FileInputStream in= new FileInputStream("D:\\1.jpg");
IOUtils.copy(input, out);
in.close();
out.close();
}