å ¥é
ãããžã§ã¯ãã§ã¯ãããŒã¿ããŒã¹ãã¬ãŒã ã¯ãŒã¯ãé »ç¹ã«åŠçããå¿ èŠããããŸãã æŠå¿µçã«ããããã®ãã¬ãŒã ã¯ãŒã¯ã¯2ã€ã®å€§ããªã¯ã©ã¹ã«åããããšãã§ããŸãã
- ORMæå
- SQLæå
ãããã®ããã€ãã¯è¯ãã§ãããããã€ãã¯ããŸãè¯ããããŸããã ããã䞻芳çã«èšããšãSQLæåã¯ORMæåã«æ¯ã¹ãŠéçºãå£ã£ãŠããŸãã ç§ã¯éçºã§ã¯åŒ·èª¿ããŸãããæ©äŒã§ã¯åŒ·èª¿ããŸããã ãã®ã¹ã±ãŒã«ãå€æŽããããšã¯ã§ããŸããããSQLæåã®ã¢ãããŒãã®äžçã«ç°åžžãªå€èŠ³ãæäŸããããšã¯ããªãå¯èœã§ãã 誰ãæ°ã«ããªãããã£ãããžãããã
ã¡ãã£ãšããã¬ãã¥ãŒ
éåããåã«ãç§ã¯éåžžã«ç°¡æœã«äœãæãåºãããšãææ¡ããŸãã 件åã®èª°ãã¬ãã¥ãŒãã¹ãããããŠãæ§ããŸããã
ãã®ãããã¹ããŒãžã§ã¯ã ORMæåã®ã¢ãããŒãã®ä»£è¡šè ã¯æ¬¡ã®ããã«ãªããŸãã
ãããã®ä»£è¡šè ã¯ããŸããŸãªæ¹æ³ã§ä»äºãããŠããŸãã åŸè ãããšãã°DSL-wayã¯ãããŒã¿ããŒã¹ã¹ããŒãã«åŸã£ãŠçæããããªããžã§ã¯ããŸãã¯æååã®ã¿ã䜿çšããŠSQLã¯ãšãªãæ§ç¯ããããšãææ¡ããŸãã ãã®ä»ã¯ ãJavaãªããžã§ã¯ããšããŒã¿ããŒã¹ããŒãã«éã®å¯Ÿå¿ãèšè¿°ããå¿ èŠããããŸãã ãããããã€ã³ãã§ã¯ãããŸããã ãããã¯ãã¹ãŠãéçºè ãSQLã¯ãšãªã®äœæããå¯èœãªéãéé¢ããèŠè¿ãã«ORMã®æèãæäŸãããšãã1ã€ã®ã¢ã€ãã¢ã«ãã£ãŠçµã°ããŠããŸãã
äžæ¹ãSQLæåã®ã¢ãããŒãã®ä»£è¡šè ãéãŸã£ãïŒ
- Spring Framework JDBC
- sql2o ïŒæ¬åœã«æ°ã«å ¥ã£ãïŒ
- Jdbi
- æ¹é©
ããããã®åœ¢åŒã®ãããã®ãœãªã¥ãŒã·ã§ã³ã¯ãã¹ãŠã java.sqlã*ããã±ãŒãžã®ã¢ããªã³ã§ãã ãããŠããããã®ãã¬ãŒã ã¯ãŒã¯ãæ¥ã«ãªãã»ã©ãéçºè ã¯åœŒããéé¢ãããŸãã ããã§ãããããã䜿çšããå Žåã¯ãæåã«SQLã«ããŽãªãæ€èšãã次ã«ORMãæ€èšããå¿ èŠããããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®3çªç®ã®ã¯ã©ã¹ã§ãããžã§ãã¬ãŒã¿ãŒã®ååšãç¥ã£ãŠããŸãã ãã®ãããªæ±ºå®ã¯éåžžç¹å®ã®ãããžã§ã¯ãã®ããã«æžãããŠããã圌ããæ®éçã§ããããšã¯é£ããã®ã§ã圌ããããããç²åŸããããšã¯å°é£ã§ãã ãããã®ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ããç¹å®ã®ãããžã§ã¯ãã®ç¥èãããŒã¿ããŒã¹ã®ç¥èãããã³ããžãã¹èŠä»¶ã®è©³çŽ°ã䜿çšããŠãDAOå±€ãå®å šã«çæããŸãã ç§ã¯ãã®ãããªæ±ºå®ã«äºåºŠäŒããŸããã SQLã¯ãšãªããããã³ã°ãèšè¿°ãã代ããã«ãDAOã¬ã€ã€ãŒã®ãžã§ãã¬ãŒã¿ãŒãå€æŽããå¿ èŠãããå Žåã¯éåžžã«ãŸãã§ãã
äœãæªãã®ïŒ
ORM vs SQL vs Generatorsãšããããã®ã¢ãããŒããŸãã¯ãã®ã¢ãããŒãã«æå³çã«äŸ¡å€å€æãããŸããã§ããã 誰ãããç¶æ³ãšçµã¿åãããŠãäœãéžæããããèªåã§æ±ºããŸãã ããããããã§ã¯ãSQLæåã®ã¹ã¿ã€ã«è¡šçŸãšæŠå¿µè¡šçŸã®äž¡æ¹ã§ãç¹å®ã®éžæè¢ãæäŸããæºåãã§ããŠããŸãã ããããæåã«ãæ¢åã®ãœãªã¥ãŒã·ã§ã³ã®ã³ãŒãã¬ãã«ïŒããã©ãŒãã³ã¹ããããã°ãªã©-ç§ã¯ãããçç¥ããŸãïŒã§æ°ã«å ¥ããªããšèšããŸãã
- åçŽãªããšãéæããããã®ç¹å®ã®åé·æ§
- ãã€ã©ãŒãã¬ãŒãããã€ã©ãŒãã¬ãŒãããã€ã©ãŒãã¬ãŒã...ãããŠåã³ãã€ã©ãŒãã¬ãŒã
- sql-ormãŸãã¯orm-sqlãªãã·ã§ã³ã衚瀺ã§ããã³ãŒãå ã®ãã€ã³ãã®äžè¶³
- äœããã®åœ¢ã§ãæ¡ä»¶ããã£ã«ã¿ãªã³ã°ããŠSQLã¯ãšãªãæ§ç¯ãã
- ãã¬ãŒã ã¯ãŒã¯APIã䜿çšããããã®å€ãã®ç¥è-ã³ãŒããå£ãåã«+100500ã®ãšã³ãã£ãã£ã«ã€ããŠåŠã¶
äžèšã®å€ãã¯ããããªããããã奜ãã«ãªãããã«ã¯ã©ããªçš®é¡ã®ãã¬ãŒã ã¯ãŒã¯ã§ããå¿ èŠããããŸããïŒã
宣èšçãªã¹ã¿ã€ã«
ã©ã£ã¡ïŒ ç§ã¯ã·ã³ãã«ã ãšæãã®ã§ã圌ã¯ã³ãŒããæžãå§ããŸããã ããããçå£ã«ïŒ 宣èšçã ã¯ããç§ã¯åœä»€çãªãã®ããããã®ãããªããšã§å®£èšçãªã¹ã¿ã€ã«ã®æ¯æè ã§ãã 宣èšçã¢ãããŒãã«é¢ããŠãJavaã§æåã«æãæµ®ãã¶ã®ã¯äœã§ããïŒ ã¯ãããã£ã2ã€ã®ããšïŒ ã¢ãããŒã·ã§ã³ãšã€ã³ã¿ãŒãã§ãŒã¹ ã ãããã®2ã€ã®ç©è³ªã亀差ããSQLæåã®ãœãªã¥ãŒã·ã§ã³ã®ãã£ãã«ã«åããããå Žåã次ã®ããã«ãªããŸãã
ORM
public class Client { private Long id; private String name; private ClientState state; private Date regTime; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ClientState getState() { return state; } public void setState(ClientState state) { this.state = state; } public Date getRegTime() { return regTime; } public void setRegTime(Date regTime) { this.regTime = regTime; } } enum ClientState { ACTIVE(1), BLOCKED(2), DELETED(3); private int state; ClientState(int state) { this.state = state; } @TargetMethod public int getState() { return state; } @TargetMethod public static ClientState getClientState(int state) { return values()[state - 1]; // } }
public interface IClientDao { @TargetQuery(query = "SELECT id, name, state " + " FROM clients " + " WHERE id = ?", type = QT_SELECT) Client findClient(long clientId); }
éæ¿
-- CREATE TABLE clients ( id bigint NOT NULL, name character varying(127) NOT NULL, state int NULL, reg_time timestamp NOT NULL, CONSTRAINT pk_clients PRIMARY KEY (id) );
ããã¯åçŽãªå®äŸã§ããããã®æ¬è³ªã¯ãåé¡ã®ãã¬ãŒã ã¯ãŒã¯ã«åæ ãããŠãã宣èšã¹ã¿ã€ã«ã®æŠå¿µã匷調ããããšã§ãã ã¢ã€ãã¢èªäœã¯ç¢ºãã«æ°ãããã®ã§ã¯ãªãã2006幎é ã®IBMã®èšäºã§ãã®ãããªããšã«ã€ããŠã®ã¡ã¢ãèŠãŸããããäžéšã®ãã¬ãŒã ã¯ãŒã¯ã¯ãã§ã«ãã®ã¢ã€ãã¢ã䜿çšããŠããŸãã ãããããã®ãããªäŸãèŠãŠãç§ã¯åççã«ããã€ãã®è³ªåãããã§ãããïŒ
- ãããŠãIClientDaoã³ã³ãã©ã¯ããå®è£ ããã®ã¯èª°ã§ãå®è£ ã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ïŒ
- ãããŠããã£ãŒã«ãã®ãããã³ã°ã¯ã©ãã«èšè¿°ãããŠããŸããïŒ
- ãã£ãšè€éãªãã®ã¯ã©ãã§ããïŒ ãããŠããããã®äŸã¯ãã§ã«3ã»ã³ãã«ããããããŠããŸãã
ç§ã¯ããããã®è³ªåãšãã£ã³ããŒã³ã«çããŠããã¬ãŒã ã¯ãŒã¯ã®æ©èœãæããã«ããããšãææ¡ããŸãã
ãããã·ã®ã¿
>> 1ã ãããŠããã®å¥çŽã誰ãå®è£ ããã©ã®ããã«å®è£ ã«ã¢ã¯ã»ã¹ããã®ã§ããïŒ
ã³ã³ãã©ã¯ãã¯java.lang.reflect.ProxyããŒã«ã䜿çšããŠãã¬ãŒã ã¯ãŒã¯èªäœã«ãã£ãŠå®è£ ãããSQLã®ç®çã§èªåã§å®è£ ããå¿ èŠã¯ãããŸããã ãããŠãå®è£ ãžã®ã¢ã¯ã»ã¹ã¯éåžžã«ç°¡åã§ãã...ã®å©ããåããŠãã¯ãããšããã§ãäŸã§ç€ºãã®ã¯ç°¡åã§ãïŒ
IClientDao clientDao = com.reforms.orm.OrmDao.createDao(connection, IClientDao.class); Client client = clientDao.findClient(1L);
æ¥ç¶ã¯ãããšãã°java.sql.ConnectionãŸãã¯javax.sql.DataSourceã®å®è£ ããŸãã¯äžè¬çãªãªããžã§ã¯ããªã©ãããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããããã®ãªããžã§ã¯ãã§ãã ã¯ã©ã€ã¢ã³ãã¯ORMãªããžã§ã¯ãã§ããããããããã¬ãŒã ã¯ãŒã¯èªäœããã®å¯äžã®ãã®ã¯com.reforms.ormã¯ã©ã¹ã§ãã OrmDao㯠ããã¹ãŠã®ããŒãºã®98ïŒ ãã«ããŒããŸãã
ã³ã³ã»ãã
>> 2ã ãããŠããã£ãŒã«ãã®ãããã³ã°ã¯ã©ãã«èšè¿°ãããŠããŸããïŒ
äžã§çŽæããããã«ãã¹ã¿ã€ã«ãšã³ã³ã»ããã®2ã€ã®ããšã«è§ŠããŸãã 2çªç®ã®è³ªåã«çããã«ã¯ãã³ã³ã»ããã«ã€ããŠè©±ãå¿ èŠããããŸãã ã¡ãã»ãŒãžã¯ãæ°ãããã®ãææ¡ããããã«ã¯ã解決çã®æ ¹æ¬çãªèŠè§£ãå¿ èŠã§ãããšããããšã§ãã SQL-92ããŒãµãŒã¯ã©ãã§ããïŒ ãã®èããæåã«æãã€ãããšããç§ã¯ãããæããŠãäºåºŠãšåœŒå¥³ã«äŒãããšã¯ãªããšæã£ãã ããããSQLæåã®ãã¬ãŒã ã¯ãŒã¯ã䟿å©ã«ããæ¹æ³ã¯ïŒ å¥ã®ã¢ããªã³ãèŠãŸãããïŒ ãŸãã¯ããã¬ãŒã ã¯ãŒã¯ã®ãã«ããŒã«å¥ã®ãã«ããŒãããŸããïŒ ç§ã®æèŠã§ã¯ããµããŒããããŠããäžé£ã®SQLæ§é ãå¶éããããšããå§ãããŸããè¯ã劥åæ¡ãšããŠãèŠè¿ãã«äŸ¿å©ãªãã®ãæã«å ¥ããããšã§ãã ãããã³ã°ã¯ãSQLã¯ãšãªã解æããåŸã®åŒããªãŒã«åºã¥ããŠããŸãã äžèšã®äŸã§ã¯ãååã¯ãªããžã§ã¯ãã®ORMãã£ãŒã«ãåã«1察1ã§ããããããŸãã ãã¡ããããã¬ãŒã ã¯ãŒã¯ã¯ãããã³ã°ããµããŒãããããè€éã§ãããããã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
äŸ
>> 3.ãã£ãšè€éãªãã®ã¯ã©ãã§ããïŒ ãããŠããããã®äŸã¯ãã§ã«3ã»ã³ãã«ããããããŠããŸãã
ãããããã¬ãŒã ã¯ãŒã¯ãããè€éãªããšãè¡ãæ¹æ³ãç¥ããªãå ŽåãSQL-92ããŒãµãŒã«ç ©ããããç¹ã¯ãããŸããïŒ ãããã ããªã¥ãŒã ã®ãªãäŸã®ãã¹ãŠã衚瀺ããã®ã¯ç°¡åãªããšã§ã¯ãããŸããã ãã¡ãã衚瀺ããŸãããSQLã®ããŒãã«å®£èšãšJavaã³ãŒãã®äžéšã¯çç¥ããŸãã
SQLæåã®ãœãªã¥ãŒã·ã§ã³ã§ç§ãäžåºŠã奜ãŸãªãã£ãæ°å°ãªãããšã®1ã€ã¯ãSQLã¯ãšãªãäœæããå¿ èŠãããããšã§ãã ããšãã°ãç¹å®ã®ãã£ã«ã¿ãªã³ã°åºæºãæå®ãããŠããå Žåãšæå®ãããŠããªãå ŽåããããŸãã ãããŠãããããããªãã¯ãã®ãããªã³ãŒãã®æçããããã¯ããããã®åçŽåãããããŒãžã§ã³ã«ç²ŸéããŠããã§ãããïŒ
// - DAO private String makeRegTimeFilter(Date beginDate, Date endDate) { StringBuilder filter = new StringBuilder(); if (beginDate != null) { filter.append(" reg_time >= ?"); } if (endDate != null) { if (filter.length() != 0) { filter.append(" AND"); } filter.append(" reg_time < ?"); } return filter.length() == 0 ? null : filter.toString(); }
ãããŠãç§ã¯ãã®æçããç§ãå€ããããžã§ã¯ãã§æãããäŒãããã«æ£ç¢ºã«æžããŸããã ããã¯ãPreparedStatementã§å€ãèšå®ãããšãã«æ¥ä»ãã§ãã¯ãåã³è¡šç€ºããããšããäºå®ã«ããããããã§ãã ãããŠãç§ãã¡ã®å人ã¯äœãæäŸããŠããŸããïŒ ãããŠã圌ã¯åçãã£ã«ã¿ãŒãæäŸããŠããŸãã äŸã䜿çšãããšç解ãããããªããããäžå®ã®ééã§é¡§å®¢ãèŠã€ããæ¹æ³ãèŠãŠã¿ãŸãããã
public interface IClientDao { @TargetQuery(query = "SELECT id, name, state " + " FROM clients " + " WHERE regTime >= ::begin_date AND " + " regTime < ::end_date", type = QT_SELECT, orm = Client.class) List<Client> findClients(@TargetFilter("begin_date") Date beginDate, @TargetFilter("end_date") Date endDate); }
ãããŠæåŸã®è¡ã¯ãããšãã°beginDateãªã©ã®ãã©ã¡ãŒã¿ãŒå€ãnullã®å Žåãé¢é£ããSQLãã£ã«ã¿ãŒregTime> = :: begin_dateãæçµçãªSQLã¯ãšãªããåãåããããã®å Žåã次ã®è¡ãããŒã¿ããŒã¹ãµãŒããŒã«ç§»åããããšã§ãã
SELECT id, name, state FROM clients WHERE regTime < ?
äž¡æ¹ã®å€ãnullã®å ŽåãWHEREã»ã¯ã·ã§ã³ã¯æçµã¯ãšãªã«å«ãŸããŸããã ãããŠæ³šæ-ã³ãŒãã«ã¯å®£èšã®ã¿ããããããžãã¯ã¯ãããŸããã ç§ã®æèŠã§ã¯ãæ¬åœã«ä»ã®äººã®è©±ãèããããšæããŸãããããã¯åŒ·åãªæŠåšã§ããããã¬ãŒã ã¯ãŒã¯ã®åŒ·åãªåŽé¢ã§ãã Javaã³ãŒãã«ãããšãç§èªèº«ã¯æ³šéã®ãã¡ã³ã§ã¯ãªããã»ãšãã©ã®ãããžã§ã¯ãã®æ³šéã®å€ãã¯åã«ãã£ãšããããšèšãã§ãããã ãããã£ãŠã圌ã¯å®çŸ©ãã代æ¿æ段ãæäŸããŸãã-ãªããžã§ã¯ãã®beanã®ããããã£ã§ãã£ã«ã¿ãªã³ã°ããŸãïŒ
// get/set . . public class ClientFilter { private Date beginDate; private Date endDate; } public interface IClientDao { @TargetQuery(query = "SELECT id, name, state " + " FROM clients " + " WHERE regTime >= ::begin_date AND " + " regTime < ::end_date", type = QT_SELECT, orm = Client.class) List<Client> findClients(@TargetFilter ClientFilter period); }
ããªãç°¡æœã§ç解ããããããšãããããŸããã åçãã£ã«ã¿ã«ã€ããŠã¯ããµããŒãããããŸãã¯ãOVERLAPSãšMATCHãé€ããã¹ãŠã®è¿°èªããé€å€ã§ãããšããããšãå¥ã«è¿°ã¹ã䟡å€ããããŸãã ãã©ã€ããSQLã¹ããŒãã¡ã³ãã§åŸè ãèŠãããšã¯ãããŸããããSQL-92ä»æ§ã§èšåãããŠããŸãã
ãã¡ããããã¬ãŒã ã¯ãŒã¯ã¯éçãªå¿ é ãã£ã«ã¿ãŒããµããŒãããŠããŸãã ãããŠããããã¯HQLãSpringTemplateã®æ§æãšåãã§ã- 'ïŒnamed parameter' ã
確ãã«ã1ã€ã®åé¡ã¯åžžã«éçãã£ã«ã¿ãŒã«é¢é£ä»ããããŠããŸãïŒãnullãã©ã¡ãŒã¿ãŒãžã®å¿çæ¹æ³ãïŒ ç°¡åãªçãã¯ããäŸå€ãæããŠãã ãããããªãã¯ééããããªãã§ãããããšèšã£ãŠããããã§ãã ããããããã¯åžžã«å¿ èŠã§ããïŒ ããšãã°ãç¹å®ã®ã¹ããŒã¿ã¹ã®ã¯ã©ã€ã¢ã³ããããŒãããŠãããã確èªããŠã¿ãŸãããã
public interface IClientDao { @TargetQuery(query = "SELECT id, name, state " + " FROM clients " + " WHERE state = :state", type = QT_SELECT, orm = Client.class) List<Client> findClients(@TargetFilter("state") ClientState state); }
ããããããŒã¿ããŒã¹å ã®ã¯ã©ã€ã¢ã³ãã¹ããŒã¿ã¹ãååšããªãå Žåãã¿ã¹ã¯ã¯äœããã¹ãã§ããããïŒ ç¶æ åã§ã¯NULLå€ãèš±å¯ããããããã¹ããŒãã¬ã¹ã®ã¯ã©ã€ã¢ã³ããæ£ç¢ºã«æ€çŽ¢ããå¿ èŠããããŸããïŒ SQL-92ããŒãµãŒã®æŠå¿µãåã³ä¿åãããŸãã 'ïŒstate'ãã'ïŒstate ïŒã®ã¹ããŒã¿ã¹ã§ãã£ã«ã¿ãŒåŒã眮ãæããã ãã§ååã§ãã 'ãã¬ãŒã ã¯ãŒã¯ãšã³ãžã³ã¯ãWHEREã»ã¯ã·ã§ã³ã次ã®åœ¢åŒã«å€æŽããŸã' ... WHERE state IS NULL ' ããã¡ãããnullãã¡ãœããã®å ¥åã«å«ãŸããªãéãã
ãããã³ã°ã«ã€ããŠ
ã¯ãšãªã®ãã£ã«ã¿ãŒã¯ç¢ºãã«åªããŠããŸãããJavaãœãªã¥ãŒã·ã§ã³ã§ã¯ãSQLã¯ãšãªã®çµæãORMãªããžã§ã¯ããšãã®ãã€ã³ãã£ã³ã°ããã³ãšã³ãã£ãã£èªäœã®ãã€ã³ãã£ã³ã°ã«ãããã³ã°ããããšã«å€ãã®æ³šæãæãããŸãã éåžžã«å€ãã®JPAä»æ§ãã©ãã ã䟡å€ãããããèŠãŠãã ããã ãŸãã¯ãResultSetãããã¡ã€ã³ãªããžã§ã¯ããžã®ç§»è¡ããŸãã¯PreparedStatementã§ã®å€ã®èšå®ã§ãããžã§ã¯ãã確èªããŸãã é¢åã§ãããïŒ ä¿¡é Œæ§ãäœããšã¬ã¬ã³ãã§ã¯ãªããããããŸããããééããªãã·ã³ãã«ãªéãéžã³ãŸããã SQLã¯ãšãªã«çŽæ¥ãããã³ã°ãé 眮ã§ããã®ã«ããªããããŸã§ã®ãšããã«è¡ããŸããã ãããæåã«æãæµ®ãã¶ããšã§ããïŒ
äŸãèŠãŠã¿ãŸãããã ãããŠãããã«åé¡ããããŸããããŒãã«ã®ãã¹ãŠã®åãORMã¯ã©ã¹ã®ãã£ãŒã«ããšç°ãªããORMã«ãã¹ãããããªããžã§ã¯ããããå Žåãã¯ãšãªã®çµæããããããæ¹æ³ã¯ïŒ
ORMã¯ã©ã¹
public class Client { private long clientId; private String clientName; private ClientState clientState; private Address address; private Date regTime; // ... } enum ClientState { ACTIVE(1), BLOCKED(2), DELETED(3); private int state; ClientState(int state) { this.state = state; } @TargetMethod public int getState() { return state; } @TargetMethod public static ClientState getClientState(int state) { return values()[state - 1]; // } } public class Address { private long addressId; private String refCity; private String refStreet; }
public interface IClientDao { @TargetQuery(query = "SELECT cl.id AS client_id, " + // underscore_case -> camelCase " cl.name AS clientName, " + // camelCase " cl.state AS client_state, " + // any_type to enum , enum @TargetMethod " cl.regDate AS t#regTime, " + // t# - , java.sql.Timestamp -> java.util.Date " addr.addressId AS address.addressId, " + // , ? " addr.city AS address.refCity, " + " addr.street AS address.refStreet " + " FROM clients cl, addresses addr" + " WHERE id = :client_id", // type = QT_SELECT) Client findClient(long clientId); }
ãã®äŸã¯ãå®éã®æ¡ä»¶ã«ããè¿ããã®ã§ãã ãããã³ã°ã®çŸåŠã¯ééããªãäžååã§ãããããã§ããã®ãªãã·ã§ã³ã¯ç¡éã®æ³šéãxmlãã¡ã€ã«ãããç§ã«è¿ãã§ãã ã¯ããä¿¡é Œæ§ã«åé¡ããããŸããã©ã³ã¿ã€ã ãšORMãªããžã§ã¯ãã®ãªãã¡ã¯ã¿ãªã³ã°ã®åé¡ããããŸããSQLã䜿çšããŠãæ°ã«å ¥ãã®ããŒã¿ããŒã¹ã¯ã©ã€ã¢ã³ãã§ãã¹ãããããšã¯åžžã«å¯èœãšã¯éããŸããã ããããç§ã¯ããã絶æçãªç¶æ³ã ãšã¯èšããŸããããã¹ãã¯ã©ã³ã¿ã€ã ãšãªãã¡ã¯ã¿ãªã³ã°ãç¯çŽããŸãã ããŒã¿ããŒã¹ã¯ã©ã€ã¢ã³ãã§èŠæ±ã確èªããã«ã¯ããã¯ãªãŒã³ãã«ããå¿ èŠããããŸãã å¥ã®ãã€ã³ãïŒ ã©ã®SQLã¯ãšãªãããŒã¿ããŒã¹ãµãŒããŒã«éä¿¡ãããŸããïŒ ãã¹ãŠã®ASã»ã¯ã·ã§ã³ã¯ãªã¯ãšã¹ãããã«ãããããŸãã ããšãã°ãclient_idã«cidã®å€ããšã€ãªã¢ã¹ãšããŠä¿åããå¿ èŠãããå Žåã¯ããã®ãšã€ãªã¢ã¹ã®åã«ã³ãã³ãè¿œå ããå¿ èŠããããŸãïŒcl.id AS cidïŒ client_idããã³cidã¯æå¹ã§ã-> cl.id AS cid as final requestã
ãããŠæåŸã«ãå°ãã®ããžãã¹ããžãã¯
1ã€ã®æäœã1ã€ã®å®£èšã¡ãœããã§ããå Žåã®çæ³çãªã¿ãªã ãããŠãããã¯ç¢ºãã«è¯ãããšã§ãããããã¯åžžã«ããã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒã¿ã®äžéšã1ã€ã®SQLã¯ãšãªã«ãã£ãŠåœ¢æãããä»ã®éšåã2çªç®ã®SQLã¯ãšãªãªã©ã«ãã£ãŠåœ¢æãããå Žåãå€ãã®å Žåããã€ããªãããŸãã¯è€åãšã³ãã£ãã£ãååŸããå¿ èŠããããŸãã ãŸãã¯ãç¹å®ã®æ¥çããã§ãã¯ãè¡ããŸãã ãã¶ãããã¯ã¿ãªèªäœã®æ¬è³ªã§ã¯ãªããããããŸãããããã®ãããªæäœã¯éåžžè¡ãããåé¢ãããŸãããããã°ã©ã ã®ããŸããŸãªéšåããåŒã³åºãããã«å ¬éãããŸãã ããããããžãã¹ããžãã¯ãTaoã«å ¥ãããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ã§äœããã¹ãã§ããããïŒ ç§ã«ãšã£ãŠããããŠå€ãã®éçºè ã®æå€ãªããšã«ãjava8ã«ã¯ããã©ã«ãã®ã¡ãœãããç»å ŽããŸããã ãã£ããã ã¯ãã2017幎ãã€ãŒãã«ããããããã¥ãŒã¹ãæªãããšãç¥ã£ãŠããŸãããããã§ãã¬ãŒã§ããŸããïŒ ããããDAOã¬ã€ã€ãŒã®éçºã®åºç€ãšããŠæ¡çšãããŠãã宣èšåã®ã¹ã¿ã€ã«ãšãããžãã¹ããžãã¯ã®æ¢å®ã®ã¡ãœããã暪æãããšã©ããªãã§ããããã ãªããžã§ã¯ãã®ORMãã§ãã¯ãnullã«è¿œå ããå¥ã®DAOããããŒã¿ãããŒãããå¿ èŠãããå Žåã¯ã©ããªãããèŠãŠã¿ãŸãããã
public interface IClientDao { // @TargetQuery(query = "SELECT id, name, state " + " FROM clients " + " WHERE id = ?", type = QT_SELECT) Client findClient(long clientId); // IAddressDao getAddressDao(); // default Client findClientAndCheck(long clientId, long addressId) throws Exception { Client client = findClient(clientId); if (client == null) { throw new Exception(" id '" + clientId + "' "); } // , IAddressDao addressDao = getAddressDao(); client.setAddress(addressDao.loadAddress(addressId)); return client; } }
èªåãæ£ãããã©ããã¯ããããŸãããã ã€ã³ã¿ãŒãã§ã€ã¹ããã°ã©ãã³ã°ãšåŒã³ããã§ãã ãã®ãããªãã®ã å®éãç§ãäŒãããã£ãããšãã¹ãŠã ãã ããèŠå®ããããã®ãé€ãããã¬ãŒã ã¯ãŒã¯ã§ã§ããããšã¯ããã ãã§ã¯ãããŸããïŒéãããæ°ã®åã®ãµã³ããªã³ã°ãã¹ããŒã ã®ç®¡çãããŒãžä»ãïŒãã¹ãŠã§ã¯ãããŸããïŒãããŒã¿ã®é åºãã¬ããŒããæŽæ°ãèµ·åãåé€ã®æäœ
ãããã«
èªè ã®çãããç§ã¯ãã®æºããããSQLãã¬ãŒã ã¯ãŒã¯ã®äžçã«äœãæ°ãããã®ãããããããšãã§ãããã©ããã¯ç¥ããŸãããå€æããã®ã¯ããªã次第ã§ãã ããããç§ã¯è©ŠããŸããããè©Šããããšã«æºè¶³ããŠããŸãã ææ¡ãããã¢ãããŒããšã¢ã€ãã¢ãããã°ãããæ¹å€çã«èŠãããšã楜ãã¿ã«ããŠããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯githubã§å©çšã§ããŸãããªã³ã¯ã¯ããSQLæåã®ãã¬ãŒã ã¯ãŒã¯ã®ãªã¹ãã®æåŸã®è¡ã®æŠèŠãã®ç« ã§æ¢ã«ç€ºãããŠããŸãã ãã¹ãŠæé«ã
ãšãã£ããªã¢ã«
N1ã ãªã¹ããè¿ãã¡ãœããã®@TargetQueryã¢ãããŒã·ã§ã³ã«ãªããžã§ã¯ãã¿ã€ãClient.classãè¿œå ããŸããã