Spring Data for KSDG 2012/09

43
實作資料存取 的抽象化 Cd Chen http://www.niceStudio.com.tw/

description

這是 Cd Chen 在 2012/09 於 KSDG 的技術分享之投影片。

Transcript of Spring Data for KSDG 2012/09

Page 1: Spring Data for KSDG 2012/09

實作資料存取的抽象化

Cd Chenhttp://www.niceStudio.com.tw/

Page 2: Spring Data for KSDG 2012/09

陳永昇 (Cd Chen)經歷:• 乃師實業技術總監• 恆逸資訊講師• 聯成電腦講師• 碩誠資訊研發部經理專長:• Unix / Linux 系統管理與開發• Java / Python / Perl / Objective-C / C / C++ / PHP / Ruby• Security / Agile / OOAD

Page 3: Spring Data for KSDG 2012/09

• 全部都是 Java

• 完全不遵守 JSR

• 包含可能影響身心健康的內容

Page 4: Spring Data for KSDG 2012/09

不斷改變的需求

世間永遠不會改變的是...

Page 5: Spring Data for KSDG 2012/09

給我寫⼀一隻 “指令模式”

統計訂單金額的程式

Page 6: Spring Data for KSDG 2012/09

public static void main(String[] args){ System.out.println(“開始統計”); List<Order> orders = // ...; double sum = 0.0; for (Order order : orders) { sum += order.getPrice(); } System.out.println( “總金額是: ” + sum );}

Page 7: Spring Data for KSDG 2012/09

給我寫⼀一隻 “指令模式”“視窗介面”

統計訂單金額的程式

Page 8: Spring Data for KSDG 2012/09

http://i.mtime.com/3176183/blog/5709802/

Page 9: Spring Data for KSDG 2012/09

內聚 & 耦合

Page 10: Spring Data for KSDG 2012/09

Controller

View Model

Page 11: Spring Data for KSDG 2012/09

Data Access

Business Logic

Presentation

Page 12: Spring Data for KSDG 2012/09

單⼀一責任原則

Page 13: Spring Data for KSDG 2012/09

Data Access

Business Logic

PresentationConsoleUI

OrderService

OrderRepository

Page 14: Spring Data for KSDG 2012/09

給我寫⼀一隻 “指令模式”“網頁介面”

統計訂單金額的程式

Page 15: Spring Data for KSDG 2012/09

Data Access

Business Logic

PresentationConsoleUIHtmlUI

OrderService

OrderRepository

Page 16: Spring Data for KSDG 2012/09

針對介面而非實作

Page 17: Spring Data for KSDG 2012/09

<<use>>

Presentation

Main

<<class>>ConsoleUserInterface

+showHint()+showPrice(price: double)

UserInterface+showHint()

+showPrice(price: double)

Page 18: Spring Data for KSDG 2012/09

Data Access

Business Logic

Presentation

Repository

Service

ConsoleUI

public interface UserInterface { void showHint(); void showPrice(double price);}

public class ConsoleUI implements UserInterface {

public void showHint() { System.out.println("����"); }

public void showPrice(double price) { System.out.println("��� " + price); }}

public static void main(String[] args) { UserInterface ui = ConsoleUI(); ui.showHint(); List<Order> orders = // �... double price = 0.0; for (Order order : orders) price += order.getPrice(); ui.showPrice(price);}

Page 19: Spring Data for KSDG 2012/09

Data Access Layer??

Page 20: Spring Data for KSDG 2012/09

關聯式資料庫 NoSQL 其他

•Native Driver•JDBC•Hibernate•JPA•...

•MongoDB•CouchDB•Redis•HBase•...

•File•Web Service•...

Page 21: Spring Data for KSDG 2012/09

資料儲存在“檔案資料庫”

“關聯式資料庫”“NoSQL 資料庫”

...

Page 22: Spring Data for KSDG 2012/09

<<class>>OrderRepositoryJpaImpl

+findAll(): List<Order>

<<use>>

Data Access

Main

OrderRepository+findAll(): List<Order>

Page 23: Spring Data for KSDG 2012/09

Data Access

Business Logic

Presentation

Service

ConsoleUI

Repository

public interface OrderRepository { List<Order> findAll();}

public class OrderRepositoryJpaImpl implements OrderRepository {

public List<Order> findAll() { // � JPA ��������� ��… }}

public static void main(String[] args) { UserInterface ui = ConsoleUI(); ui.showHint(); OrderRepository repo = new OrderRepositoryJpaImpl(); List<Order> orders = repo.findAll(); double price = 0.0; for (Order order : orders) price += order.getPrice(); ui.showPrice(price);}

Page 24: Spring Data for KSDG 2012/09
Page 25: Spring Data for KSDG 2012/09

Spring Data

Page 26: Spring Data for KSDG 2012/09

降低 DAL 耦合

Spring Data

•減少 DAL 開發•簡化 DAL 實作•支援 QueryDSL

Page 27: Spring Data for KSDG 2012/09
Page 28: Spring Data for KSDG 2012/09

IoC & AOP

Page 29: Spring Data for KSDG 2012/09

注入實作細節,定義於外部的設定中,降低元件間的耦合,進而提

高維護的彈性

// OrderRepositorypublic interface OrderRepository { List<Order> findAll();}

// Main Class@AutowiredOrderRepository repo;

@AutowiredUserInterface ui;

public static void main(String[] args) { ui.showHint(); List<Order> orders = repo.findAll(); double price = 0.0; for (Order order : orders) price += order.getPrice(); ui.showPrice(price);}

Page 30: Spring Data for KSDG 2012/09

Base Commons關聯式資料庫 JDBC / JPA Big Data Apache HadoopData-Grid GemFireHTTP RESTDocument MongoDBGraph Neo4jColumn Stores HBaseKey-Value Redis

Page 31: Spring Data for KSDG 2012/09

+save(entity: T): T+findOne(id: ID): T+findAll(): Iterator<T>+count(): Long+delete(entity: T)+exists(id: ID): boolean ...

+findAll(sort: Sort): Iterator<T>+findAll(pageable: Pageable): Page<T>

CrudRepository

Repository

PagingAndSortingRepository

Page 32: Spring Data for KSDG 2012/09

Example:Spring Data JPA

Page 33: Spring Data for KSDG 2012/09

減少 DAL 的開發

Page 34: Spring Data for KSDG 2012/09

public class OrderRepositoryJpaImpl implements OrderRepository {

List<Order> findAll() { EntityManager em = Query q = em.createQuery(“SELECT o FROM Order o”); List<Order> results = new ArrayList<Order>(); for(Order order : q.getResultList()) { results.add(order); } return results; }} No Spring-Datapublic interface OrderJpaRepository extends JpaRepository<Order, Long>, OrderRepository {

}

Yes, Spring-Data!!

Page 35: Spring Data for KSDG 2012/09

簡化 DAL 的實作

Page 36: Spring Data for KSDG 2012/09

Method Name Keywords

Page 37: Spring Data for KSDG 2012/09

findByFFFKKK欄位名稱

Keyword

Page 38: Spring Data for KSDG 2012/09

public interface OrderJpaRepository extends JpaRepository<Order, Long>, OrderRepository {

List<Order> findByDate(Date date);

List<Order> findByCustomer(Customer customer);

List<Order> findByCustomerAndDate(Customer c, Date d);

List<Order> findByCustomer_NameLike(String name);

List<Order> findByDateBefore(Date theDate);

List<Order> findByPriceLessThan(double price);

// ...}

Method Name Keywords

Page 39: Spring Data for KSDG 2012/09

Logic KeywordAFTER After / IsAfterBEFORE Before / IsBeforeCONTAINING Containing / IsContaining / ContainsBETWEEN Between / IsBetweenENDING WITH EndingWith / IsEndingWith / EndsWithEXISTS ExistsFALSE False / IsFalseGREATER THAN GreaterThan / IsGreaterThan

GREATER THAN EQUALS GreaterThanEqual / IsGreaterThanEqual

IN In / IsIn

IS Is / Equals

IS NOT NULL NotNull / IsNotNull

Page 40: Spring Data for KSDG 2012/09

Logic Keyword

IS NULL Null / IsNull

LESS THAN LessThan / IsLessThan

LESS THAN EQUALS LessThanEqual / IsLessThanEqual

LIKE Like / IsLike

NEAR Near / IsNear

NOT Not / IsNot

NOT LIKE NotLike / IsNotLike

REGEX Regex / MatchesRegex / Maches

STARTING WITH StartingWith / IsStartingWith / StartsWith

TRUE True / IsTrue

WITHIN Within / IsWithin

Page 41: Spring Data for KSDG 2012/09

@Query Annotation

Page 42: Spring Data for KSDG 2012/09

// Order@Entity@NamedQuery( name=”Order.findByProfitThan100”, query=”select o from Order o where price - cost > 100”)class Order { // ...}

// OrderJpaRepositorypublic interface OrderJpaRepository extends JpaRepository<Order, Long>, OrderRepository {

List<Order> findByProfitThan100();

@Query(“select o from Order o where price - cost > 0”) List<Order> findByPositiveProfit();

@Query(“select o from Order o where price > ?1”) List<Order> findByPriceGreaterThanArg(double price);

// ....} @Query Annotation

Page 43: Spring Data for KSDG 2012/09

Thank you.http://slidesha.re/Oa2LYT