1. 程式人生 > >Spring MVC 知識點整理

Spring MVC 知識點整理

extend:http://www.jianshu.com/p/bef0e52067d2

Redis儲存機制分成兩種Snapshot 和 AOF。無論是那種機制,Redis都是將資料儲存在記憶體中。

Snapshot工作原理: 是將資料先儲存在記憶體,然後當資料累計達到某些設定的伐值的時候,就會觸發一次DUMP操作,將變化的資料一次性寫入資料檔案(RDB檔案)。

AOF 工作原理 : 是將資料也是先存在記憶體,但是在儲存的時候會使用呼叫fsync來完成對本次寫操作的日誌記錄,這個日誌揭露檔案其實是一個基於Redis網路互動協議的文字檔案。AOF呼叫fsync也不是說全部都是無阻塞的,在某些系統上可能出現fsync阻塞程序的情況,對於這種情況可以通過配置修改,但預設情況不要修改。AOF最關鍵的配置就是關於呼叫fsync追加日誌檔案的平率,有兩種預設頻率,always每次記錄進來都新增,everysecond 每秒新增一次。兩個配置各有所長後面分析。由於是採用日誌追加的方式來持久話資料,所以引出了第二個日誌的概念:rewrite. 後面介紹它的由來。

儲存模式效能和安全比較:

1.效能:Snapshot方式的效能是要明顯高於AOF方式的,原因有兩點:

Snapshot採用2進位制方式儲存資料,資料檔案比較小,載入快速.
儲存的時候是按照配置中的save策略來儲存,每次都是聚合很多資料批量儲存,寫入的效率很好

而AOF則一般都是工作在實時儲存或者準實時模式下。相對來說儲存的頻率高,效率卻偏低。

2.資料安全:AOL資料安全性高於Snapshot儲存,原因:

Snapshot儲存是基於累計批量的思想,也就是說在允許的情況下,累計的資料越多那麼寫入效率也就越高,但資料的累計是靠時間的積累完成的,那麼如果在長時間資料不寫入RDB,但Redis又遇到了崩潰,那麼沒有寫入的資料就無法恢復了,但是AOF方式偏偏相反,根據AOF配置的儲存頻率的策略可以做到最少的資料丟失和較高的資料恢復能力。
說完了效能和安全,這裡不得不提的就是在Redis中的Rewrite的功能,AOF的儲存是按照記錄日誌的方式去工作的,那麼成千上萬的資料插入必然導致日誌檔案的擴大,Redis這個時候會根據配置合理觸發Rewrite操作,所謂Rewrite就是將日誌檔案中的所有資料都重新寫到另外一個新的日誌檔案中,但是不同的是,對於老日誌檔案中對於Key的多次操作,只保留最終的值的那次操作記錄到日誌檔案中,從而縮小日誌檔案的大小。這裡有兩個配置需要注意:

auto-aof-rewrite-percentage 100 (當前寫入日誌檔案的大小佔到初始日誌檔案大小的某個百分比時觸發Rewrite)
auto-aof-rewrite-min-size 64mb (本次Rewrite最小的寫入資料良)

兩個條件需要同時滿足。

Redis不支援Java的HashMap,Redis有自己的資料結構
但可以使用Jedis (Jedis是redis的java版本的客戶端實現) 來處理HashMap

 /**
  * redis操作Map
  */
 @Test
 public void testMap() {
     //-----新增資料----------  
     Map<String, String> map = new
HashMap<String, String>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user",map); //取出user中的name,執行結果:[minxr]-->注意結果是一個泛型的List //第一個引數是存入redis中map物件的key,後面跟的是放入map中的物件的key,後面的key可以跟多個,是可變引數 List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //刪除map中的某個鍵值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //因為刪除了,所以返回的是null System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數2 System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true System.out.println(jedis.hkeys("user"));//返回map物件中的所有key System.out.println(jedis.hvals("user"));//返回map物件中的所有value Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } }
  • Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,hash等資料結構的儲存;

  • Redis支援資料的備份,即master-slave模式的資料備份。

  • Redis支援資料的持久化。

  • Redis在很多方面支援資料庫的特性,可以這樣說他就是一個數據庫系統,而memcached只是簡單地K/V快取。

  • 它們在效能方面差別不是很大,讀取方面尤其是針對批量讀取效能方面memcached佔據優勢。當然redis也有他的優點,如永續性、支援更多的資料結構。

  • Redis和Memcache都是將資料存放在記憶體中,都是記憶體資料庫。不過memcache還可用於快取其他東西,例如圖片、視訊等等;

  • 虛擬記憶體--Redis當實體記憶體用完時,可以將一些很久沒用到的value 交換到磁碟;

  • 過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10;

  • 分散式--設定memcache叢集,利用magent做一主多從; redis可以做一主多從。都可以一主一從;

  • 儲存資料安全--memcache掛掉後,資料不可恢復;redis可以定期儲存到磁碟(持久化),資料丟失後可以通過aof恢復;

  • Redis支援資料的備份,即master-slave模式的資料備份;

  • 應用場景不一樣:Redis出來作為NoSQL資料庫使用外,還能用做訊息佇列、資料堆疊和資料快取等;Memcached適合於快取SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等。

所以在選擇方面如果有持久方面的需求或對資料型別和處理有要求的應該選擇redis。如果簡單的key/value 儲存應該選擇memcached。

MySQL 中order by 與group by的順序 是:
select -> from -> where -> group by -> order by

注意:group by 比order by先執行,order by不會對group by 內部進行排序,如果group by後只有一條記錄,那麼order by 將無效。要查出group by中最大的或最小的某一欄位使用 max或min函式。
例:

select
sum(click_num) as totalnum,
max(update_time) as update_time,
count(*) as totalarticle
from
article_detail
where
userid =1
group by
userid
order by
update_time
desc
  • 開發對比
    開發速度Hibernate的真正掌握要比Mybatis來得難些。
    Mybatis框架相對簡單很容易上手,但也相對簡陋些。
    個人覺得要用好Mybatis還是首先要先理解好Hibernate。

  • 開發社群
    Hibernate 與Mybatis都是流行的持久層開發框架,但Hibernate開發社群相對多熱鬧些,支援的工具也多,更新也快,當前最高版本4.1.8。
    而Mybatis相對平靜,工具較少,當前最高版本3.2。
    開發工作量Hibernate和MyBatis都有相應的程式碼生成工具。可以生成簡單基本的DAO層方法。
    針對高階查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的對映機制,開發者無需關心SQL的生成與結果對映,可以更專注於業務流程。

  • Mybatis優勢MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。-
    MyBatis容易掌握,而Hibernate門檻較高。

  • Hibernate優勢Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果對映。

  • Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。

  • Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

  • Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳。

  • hibernate是在jdbc上進行了一次封裝,而mybatis基於原生的jdbc,因此mybatis天生就有執行速度上的優勢。

  • mybatis開放了外掛介面,把很多功能介面都開放了,網上大神寫的外掛多得很;按註解生成自動生成sql的外掛早就有了;還有快取的外掛等等。可以說,只要肯在mybatis上花時間,你會發現orm這一塊的所有問題它都有解決方案。這方面不是說hibernate不好,但是我還真沒聽說過hibernate有外掛了

需求:使用MyBatis往MySQL資料庫中插入一條記錄後,需要返回該條記錄的自增主鍵值。

  • 方法1:在mapper中指定keyProperty屬性,示例如下:

useGeneratedKeys="true":設定是否使用JDBC的getGenereatedKeys方法獲取主鍵並賦值到keyProperty設定的領域模型屬性中。(適用於MySQL、sqlserver資料庫,Oracle不能使用,使用selectkey子節點做)

keyProperty="userId":賦值的物件的屬性名稱。
新增完成後,直接根據物件屬性取值

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId"
parameterType="com.chenzhou.mybatis.User">  
    insert into user(userName,password,comment)  
    values(#{userName},#{password},#{comment})  
</insert>  

如上所示,我們在insert中指定了keyProperty="userId",其中userId代表插入的User物件的主鍵屬性。

User.java

public class User {  
    private int userId;  
    private String userName;  
    private String password;  
    private String comment;  
      
    //setter and getter  
}  
UserDao.java
public interface UserDao {  
  
    public int insertAndGetId(User user);  
  
}  

測試:

User user = new User();  
user.setUserName("chenzhou");  
user.setPassword("xxxx");  
user.setComment("測試插入資料返回主鍵功能");  
  
System.out.println("插入前主鍵為:"+user.getUserId());  
userDao.insertAndGetId(user);//插入操作  
System.out.println("插入後主鍵為:"+user.getUserId());  

輸出:

插入前主鍵為:0  
插入後主鍵為:15  

查詢資料庫:

如上所示,剛剛插入的記錄主鍵id為15

 <insert 
    id="insertUser"  parameterType="com.entity.user">
     insert into test (name) values (#{name})
<selectKey keyProperty="id" resultType="java.lang.Integer">      
   select LAST_INSERT_ID() as id      
</selectKey>    
</insert>

後臺程式碼不變。
各個資料庫獲取方式不一樣,本例根據mysql為例。其他請各自根據需要查詢。

相關推薦

Spring MVC 知識點整理

extend:http://www.jianshu.com/p/bef0e52067d2 Redis儲存機制分成兩種Snapshot 和 AOF。無論是那種機制,Redis都是將資料儲存在記憶體中。 Snapshot工作原理: 是將資料先儲存在記憶體,然後當資料累計達到某些設定的伐值的時候,就會觸發一次D

Spring MVC 知識點記憶

upd 表單bean 知識點 model pub public 所有 方案 abc   1.Dao 用的 @Repository   2.Handler 用的 @Controller   3. @Autowired 消除了對get set方法   4. @RequestM

Spring MVC面試整理

直接 mark 如果 void struts 視圖 限制 線程安全問題 mapping Spring MVC執行過程 客戶端的請求提交到dispatcherServlet DispatcherServlet查詢一個或者多個handlermapping ,找請求的Cont

spring boot 知識點整理

在一個@Configuration註解的類裡面,用@Bean去註解需要例項化的類,@Configuration和@Bean是spring 3.0之後開始支援的一組新註解,實現自動裝配,從而可以支援完全無XML配置。如下形式: 1、下面是根據條件裝配bean 2、如何自定義start

Spring MVC 知識點集合

【轉自】http://www.admin10000.com/document/6436.html 一、SpringMVC基礎入門,建立一個HelloWorld程式   1.首先,匯入SpringMVC需要的jar包。   2.新增Web.xml配置檔案中關於Spring

Spring重要知識點整理

actor ise 核心部分 依賴註入 邏輯 ima ntp app pla 一、IOC(Inversion of Control):控制反轉   (1)Spring Core最核心部分   (2)需要先了解依賴註入(Denpendency Injection)/把底層

Spring的一些零碎知識點整理

Spring Spring配置屬性文件 Web工程中配置Spring 引入Spring配置文件 Spring在web項目中的初始化類 在Web工程中配置Spring 要想在Web工程中配置Spring,首先需要在工程加入spring-web包,我這裏使用的是maven的web工程,pom.

Struts2、Spring MVCSpring優缺點整理

Struts2的優點 Struts2 是一個相當強大的Java Web開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。Struts2現在在Java Web開發界的地位可以說是大紅

Spring boot+Shiro+ spring MVC+swagger UI +Mybatis+mysql+Vue +Element UI 之四 vue 基本知識點概述

Vue.js是當下很火的一個JavaScript MVVM庫,它是以資料驅動和元件化的思想構建的。相比於Angular.js,Vue.js提供了更加簡潔、更易於理解的API,使得我們能夠快速地上手並使用Vue.js。Vue.js(讀音 /vjuː/, 類似於 view) 是一

Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute、@SessionAttributes以及Model的使用介紹

1、Model:儲存資料的作用域物件,相當於request 向model中新增資料,方式一,通過addAttribute方法: @RequestMapping("/save") public String save(Model model,int i

Spring MVC相關內容整理(面試福利哦)

最近有同事問了我很多關於spring mvc的問題,大抵都是用於面試的,平時沒人關注這些的,有些問題把我問的也是一愣一愣的,今天有空順便就整理了下涉及到spring的相關資料問題,不管簡單或者無聊,算是給你們的福利吧。 一、第一個當然是關於spirng mvc的請求解析流程了,說實話,這個需

spring mvc + mybatis +junit + log4j 用到的jar包整理與討論。

這裡是基於maven專案來進行討論的。(一些解釋來自於網路其他部落格,這裡做了整理,在此說明) 1、spring相關: a、spring-core:spring核心包 這個jar檔案包含的是Spring框架的基本核心工具類,Spring其他元件要用到這個包裡的類,它是其他基

SpringSpring MVC、Struts2、、優缺點整理

開發十年,就只剩下這套架構體系了! >>>   

Spring和Springboot相關知識點整理

# 簡介 本文主要整理一些Spring & SpringBoot應用時和相關原理的知識點,對於原始碼不做沒有深入的講解。 #1. 思維導圖 右鍵新視窗開啟可以放大。 ![](https://img2020.cnblogs.com/blog/228024/202006/228024-2020062414175

SpringSpring MVC原理及配置詳解

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡

JRebel熱部署spring mvc時發生的異常。

spring error JRebel: ERROR org.zeroturnaround.bundled.javassist.CannotCompileException: [source error] no such class: handlerMethods at org.zer

Spring MVC 配置

rri splay sep static type gets source handle webpack 1, RootConfig用來配置ContextLoadListener 1 @Configuration 2 //@Import(DataConf

Spring MVC知識

spin 部分 完整 視圖轉發 必須 方法 影響 參數 lis f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優勢 性能上Struts1>SpringMvc>Struts2 開發速度上SpringMvc和Struts2差不多,

Spring mvc 跨域請求

extend ava ping mapping header true delete with ade 創建類 package Le.log; import java.io.IOException; import javax.servlet.FilterChain;im

自動加載類的知識點整理

簡單 副本 而是 ren 是個 其中 自動調用 php文件 代碼 //__tostring()方法 class Ren      //造一個人類,裏面有成員變量$name {   public $name; } $r = new Ren(); echo $r; //寫出