åé¡
JDBIã®å
¬åŒããã¥ã¡ã³ãã§ã¯ãéçºè
ã¯@CreateSqlObjectã¢ãããŒã·ã§ã³ãç°çš®ã®DAOã«ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒããè¿œå ããããã®ã¡ã«ããºã ã§ãããšä¿¡ããŠããŸãã
http://jdbi.org/#__createsqlobject
ããã¯ãå®éã®åäœã«å°ã誀解ãæãããã«æãããŸããããã¯ãæšå¥šãããjdbi.onDemand
äœæã¡ã«ããºã ã䜿çšããŠäœ¿çšãããšãç¶æ
ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
ãã©ãŒã©ã ã«ã¯ããã®æ··ä¹±ã説æããã¡ãã»ãŒãžãããã€ããããŸãã
https://groups.google.com/forum/#!searchin/jdbi/CreateSqlObjectïŒ 7 CsortïŒdate / jdbi / FPI1l1OBLU0 / slXj_8hJBwAJ
https://groups.google.com/forum/#!searchin/jdbi/CreateSqlObjectïŒ 7 CsortïŒdate / jdbi / b1rWVQ7JNAg / 2R2c9okAAgAJ
ãªã¯ãšã¹ã
ãã®åé¡ã®æåã®è§£æ±ºçãäœã§ãããããããªãã é ã«æµ®ãã¶ããã€ãïŒ
ãããå ±åããŠããã ãããããšãããããŸãã ããã§æè¡çã«é倧ãªå€æŽãè¡ãããããšã«ãªããšæããŸãããæ¢åã®åäœã¯ååã«è²§åŒ±ã§ããããã3.xãªãªãŒã¹ãµã€ã¯ã«ã®æ©ã段éã§æè¡çã«é倧ãªå€æŽãå ããããšãã§ããŸãã æ¢åã®åäœã«äŸåããŠããå ŽåããŸãã¯ããã§å°ããªé倧ãªå€æŽãåºè·ããå¯èœæ§ã«åæããªãå Žåã¯ããã®åé¡ã«ãã©ã°ãç«ãŠãŠãã ããã
_why_ @CreateSqlObject
ã«é¢ããã³ã³ããã¹ãã®ããã ãã«ããªã³ããã³ãã§ã¯ããŸãæ©èœããŸããã
@CreateSqlObject
ã¯ãå
ã®SQLãªããžã§ã¯ãã®ãããã³ã°ãã³ãã«ã䜿çšããŠhandle.attach(sqlObjectType)
ã䜿çšããŠå®è£
ãããŸãããããã£ãŠãäœæãããSQLãªããžã§ã¯ãã®ãããã³ã°ãã³ãã«ã¯ãSQLãªããžã§ã¯ããè¿ãããåã«éããããŸãã
äžèšã®ã©ãã決ãŸã£ãŠããªã-ããã¯ãŸãã«ä»ãããå®è£ ãããŠããæ¹æ³ã§ãã
ãããä¿®æ£ããããã«äºææ§ãç Žãå¿ èŠããããšã¯æããŸããã
ç³ãèš³ãããŸããããå®éã«ã¯ããããŸãã... onDemandãšCreateSqlObjectã®æ£ç¢ºãªåé¡ã¯äœã§ããïŒ ç§ã¯ããã§åé¡ãæ±ããããšã¯äžåºŠããããŸããããããŠ@qualidafialã®èª¬æã«ã€ããŠã®äœããç§ã®å¿ãåŸããããŠããã ãã§ã...
fooProxy.usecaseã®åŒã³åºãã®ããã«æ¥ç¶ãååŸãããŸãã Foo.usecaseã¯ãcreateSqlObjectã¡ãœããããŒãåŒã³åºããŸãããã®ããŒã¯ãçŸåšã®ïŒãŠãŒã¹ã±ãŒã¹ã®ïŒãã³ãã«ã«ã¢ã¿ããããåŸã«æ°ããããŒãè¿ããŸãã ãŠãŒã¹ã±ãŒã¹ãæ»ããšããŠãŒã¹ã±ãŒã¹ã®ãã³ãã«ã¯éããããŸãã è¿ãããBarãšéåæã§äœãããŠããªãéãã barã®ãã³ãã«ãæ©ãæéåãã«ãªãã®ã¯ã©ãããŠã§ããïŒ ããŒã®ã©ã€ããµã€ã¯ã«ãšäœ¿çšã¯ããã³ãã«ãšåæ§ã«Foo.usecaseã®æ¬äœã«éå®ãããŠããŸãã
JDBIã®å éšã«ã€ããŠè©±ãããšã¯ã§ããŸããããæ¬çªç°å¢ã§èŠãåäœã«ã€ããŠã³ã¡ã³ãããããšã¯ã§ããŸãã
åºæ¬çã«ãç§ãã¡ã®ããäœãç°å¢ã§ã¯ç©äºã¯å€§äžå€«ã§ããã ããããæ¬çªç°å¢ã§ã®è² è·ãå¢ãããšãSQLã¹ããŒãã¡ã³ããé©åãªããŒã¿ããŒã¹ããŒãã«å¯ŸããŠå®è¡ãããªãããšãç¶ç¶çã«çºçããŸãã ããšãã°ãèªã¿åãå°çšã®éžæã¯ãã¹ã¿ãŒããŒãã«ãããããæ¿å ¥ã¯èªã¿åãã¬ããªã«ã«ãããããŸãã ããã«ãæäœã®éäžã§æ¥ç¶ãéãããããšãããšã©ãŒãçºçããŸããã
åºæ¬çã«ã @ CreateSqlObjectã«ãã£ãŠã¹ã¬ããã»ãŒãã®åé¡ãçºçããããã§ããã€ãŸãã競åãããªã¯ãšã¹ãã«ãã£ãŠèªã¿åãå°çšãã©ã°ãå€æŽãããŠããŸããã
åé¡ãã解決ãããããã«ã @CreateSqlObject
ã®äœ¿çšããã¹ãŠåé€ãã次ã®ããã«ãªããŸããã
class FooDao
class BarDao
class CombinedDao extends FooDao, BarDao
ãããŠã jdbi.onDemand(CombinedDao)
ãããããä»ããã¢ã¯ã»ã¹ã®ã¿ã䜿çšããŸãã
ãã®ãã¿ãŒã³ã«åãæ¿ããããšã§ãããã»ã©ãããã§ã¯ãããŸããããæ¬çªç°å¢ã§ã®åè¿°ã®ãšã©ãŒããã¹ãŠåãé€ãããšãã§ããŸããã
ã¡ãªã¿ã«ãçŸæç¹ã§ã¯ãã¹ãŠã®ã³ãŒããæœè±¡ã¯ã©ã¹ã§onDemandã䜿çšããŠãããããJDBI 2ã«æ»ãããšãèããŠããŸãããŸããæºè¶³ã®ããæ¹æ³ã§åæ§ç¯ããæ¹æ³ãç解ã§ããŸããã
ç§ã¯ãããžãã¯ãå«ããSQLãå«ãŸãªãæœè±¡å®è£ ã¯ã©ã¹ãæã¡ããã©ã³ã¶ã¯ã·ã§ã³ãšããŠæ³šéãä»ããããã¡ãœãããæã¡ãCreateSqlObjectã䜿çšããŠçŽç²ã«SQLã§ããDAOã¯ã©ã¹ãžã®ã¢ã¯ã»ã¹ãæäŸãããµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹ãæã€åŸåããããŸãã ç°¡åãªäŸïŒ
ã€ã³ã¿ãŒãã§ãŒã¹
public interface AccountService {
void addAccount(Account account, User user);
}
å®è£
public abstract class AccountServiceJdbi implements AccountService {
<strong i="11">@Override</strong>
<strong i="12">@Transaction</strong>
public final void addAccount(@BindBean() Account account, User user) {
long accountId = accountDao().insertAccount(account);
accountDao().linkAccountToOwner(accountId, user.getId());
}
<strong i="13">@CreateSqlObject</strong>
abstract AccountDao accountDao();
}
ïŒããªãã¯ããªãæ³åããããšãã§ããŸãïŒ
ããã«ãããè€æ°ã®DAOã¡ãœãããä»ãããã©ã³ã¶ã¯ã·ã§ã³ãå¯èœã«ããªãããããžãã¯ãšããŒã¿ã¢ã¯ã»ã¹ãéåžžã«ããŸãåé¢ã§ããŸãã ãµãŒãã¹ã®åäœãã¹ãã¯ãDAOã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããããšã«ãããç°¡åã«èšè¿°ããã³ç解ã§ããŸãã
JDBI 3ã§ãåæ§ã®ããšãè©Šã¿ãŸãããããµãŒãã¹ã¯ã©ã¹ã®å®è£ ã¯ãããžãã¯ãå«ãã¡ãœããã®ããã©ã«ãã¡ãœãããšã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ããå¿ èŠãããããšãæå³ãããšæããŸãã ããã©ã«ãã®ã¡ãœãããfinalã«ããããšã¯ã§ããªããããã³ãŒãã¯ç°¡æœã§ã¯ãªããã¯ã©ã¹ã®äœ¿çšæ¹æ³ãããŸãå¶åŸ¡ã§ããŸããã
JDBI 3ã§ã³ãŒããæ§é åããŠãæçµçãªãã©ã³ã¶ã¯ã·ã§ã³ã¡ãœãããäœæããæ¹æ³ã¯ãããŸããïŒ
ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããfinalãšããŠå®çŸ©ããæ¹æ³ããªãããšã¯æ£ããã§ãã
ãã ãã @SqlQuery
ã @SqlUpdate
ãªã©ãšåçã®ç¬èªã®SQLã¡ãœããã¢ãããŒã·ã§ã³ãå®çŸ©ãããã®ã¢ãããŒã·ã§ã³ãæã€ã¡ãœããã®éçå®è£
ãæäŸããããšã¯ã§ããŸãã
ãã ãã
@SqlQuery
ã@SqlUpdate
ãªã©ãšåçã®ç¬èªã®SQLã¡ãœããã¢ãããŒã·ã§ã³ãå®çŸ©ãããã®ã¢ãããŒã·ã§ã³ãæã€ã¡ãœããã®éçå®è£ ãæäŸããããšã¯ã§ããŸãã
è¿ä¿¡ããããšãããããŸã-ç§ã¯ãããç§ãã©ã®ããã«å©ãããã«ã€ããŠã¯å®å šã«ã¯ãã©ããŒããŠããŸããã è€æ°ã®DAOã§ã¯ãšãªãå®è¡ããªãããåããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ãšãªãå®è¡ããããã®æšå¥šãããæ¹æ³ã¯äœã§ããïŒ
è€æ°ã®DAOã§ã¯ãšãªãå®è¡ããããåããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ãšãªãå®è¡ããæ¹æ³ã¯ãããŸããïŒ
å人çã«ã¯
interface Dao1 {
@SqlQuery("...")
void query1();
}
interface Dao2 {
@SqlQuery("...")
void query2();
}
interface JdbiServiceImpl extends Service {
<strong i="8">@CreateSqlObject</strong>
Dao1 dao1();
<strong i="9">@CreateSqlObject</strong>
Dao2 dao2();
<strong i="10">@Transaction</strong>
<strong i="11">@Override</strong>
void businessCase() {
dao1().query1();
dao2().query2();
}
}
Service service = handle.attach(JdbiServiceImpl.class);
service.businessCase();
ãã®ããã«ç§ã«ãšã£ãŠã¯çŽ æŽãããåããããŸãã @CreateSqlObjectã¯åºæ¬çã«ãgetter / setterã«ããSpringã®äŸåæ§æ³šå ¥ã«äŒŒãŠããŸãã ç§ã¯onDemandã€ã³ã¹ã¿ã³ã¹ãBeanãšããŠSpringã³ã³ããã¹ãã«é 眮ããŠãããããéåžžã®ãµãŒãã¹ãšãŸã£ããåãããã«æ©èœããŸããåŒã³åºãå ã¯jdbiãå®è£ ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠç¥ãå¿ èŠã¯ãããŸããã
衚瀺ãããã¢ã³ããã¿ãŒã³ã®ãããªStockReductionCaseã¯ãCreateSqlObjectã䜿çšãããã¹ããããjdbiã®ãäŸåæ§æ³šå ¥ãã®äŸã§ãã ãµãŒãã¹ã®å®è£ ãšåãããã«ãå éšã«ç¬èªã®äŸåé¢ä¿ããããŸãã ããã¯åºæ¬çã«ããèªäœããµãŒãã¹ã§ãããµãŒãã¹ïŒãããã¬ãã«ã®åå©çšäžå¯èœãªããžãã¯ïŒãšã¯ãšãªã®ããããã«CasesïŒè€æ°ã®å Žæã§å¿ èŠïŒãé 眮ããã ãã§åŸªç°äŸåãåé¿ããããã«ãServiceã§ã¯ãªãCaseãšåŒã³ãŸãã
ç¹ã«onDemand()
ãšçµã¿åããããšããã©ã³ã¶ã¯ã·ã§ã³ã@CreateSqlObject
ã§æ£ããã¹ã³ãŒãããããšã«æåãããšããããŸããŸãªå ±åãèããããšããããŸãã
åããã©ã³ã¶ã¯ã·ã§ã³ã§è€æ°ã®SQLãªããžã§ã¯ããå®è¡ããæã確å®ãªæ¹æ³ã¯ã Handle.inTransaction()
ãŸãã¯Jdbi.inTransaction()
ãä»ããŠãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããããšã§ãã ã³ãŒã«ããã¯å
ã§ã¯ã Handle.attach()
ãä»ããŠäœæãããDAOã¯ããã³ãã«ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®äžéšã«ãªããŸãã
jdbi.useTransaction(handle -> {
Dao1 dao1 = handle.attach(Dao1.class);
Dao2 dao2 = handle.attach(Dao2.class);
dao1.doStuff();
dao2.doMoreStuff();
});
è¿ä¿¡ããããšãããããŸã
@qualidafialããã¯ç§ãè¡ããªããã°ãªããªãæ¹æ³ã®ããã«èŠããŸããããµãŒãã¹ã¯ã©ã¹ã®åäœãã¹ããäœæããã®ã¯é£ãããªããŸãã Daosèªäœãã€ã³ã¹ã¿ã³ã¹åãããããåäœãã¹ãã®ä»£ããã«ã¢ãã¯Daosã䜿çšããããšã¯ã§ããŸããã
@TheRealMarnesã«ãæè¬ããŸã-ããã¯ç§ãè©Šãããã®ãšäŒŒãŠããŸãããããã©ã«ãã®ã¡ãœããã䜿çšããã®ã¯å¥œãã§ã¯ãããŸããããªãŒããŒã©ã€ãã§ããããã§ãã
@qualidafialè€æ°ã®daoã¡ãœãããåŒã³åºããµãŒãã¹ã¡ãœããã§jdbiã®@Transaction
ã¢ãããŒã·ã§ã³ã䜿çšã§ããªãããšã確èªããããšæããŸããïŒ
ãã®ä»®å®ãæ£ãããã°ãå
¬åŒææžã®äžéšãšããŠé©åã«ææžåãããŠããªããšããã®åäœã¯éåžžã«å±éºã§ãã å€æ°ã®éçºè
ãSpringã¹ã¿ãã¯ã®çµéšãããã @Transactional
ã¢ãããŒã·ã§ã³ã䜿çšããããšã¯ãè€æ°ã®DAOéã®ãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããããã®éåžžã«æšæºçãªæ¹æ³ã§ãã
@svlada @Transaction
ã¢ãããŒã·ã§ã³ã¯SQLãªããžã§ã¯ãã®ã¡ãœããã§ã®ã¿æ©èœããŸãã ããµãŒãã¹ã¡ãœããããšèšããšãJdbiã®åœ±é¿ãåããªããªããžã§ã¯ããããšãã°æ³šå
¥ãããã¯ã©ã¹ã«ã¢ãããŒã·ã§ã³ã䜿çšããŠãããšããå°è±¡ãåããŸãã
ãã¹ãã¹ã€ãŒãã®äŸïŒ
<strong i="9">@Test</strong>
public void testInsertAndFind() {
Foo foo = handle.attach(Foo.class);
Something s = foo.insertAndFind(1, "Stephane");
assertThat(s).isEqualTo(new Something(1, "Stephane"));
}
<strong i="10">@Test</strong>
public void testTransactionPropagates() {
Foo foo = dbRule.getJdbi().open().attach(Foo.class);
assertThatExceptionOfType(Exception.class)
.isThrownBy(() -> foo.insertAndFail(1, "Jeff"));
Something n = foo.createBar().findById(1);
assertThat(n).isNull();
}
public interface Foo {
<strong i="11">@CreateSqlObject</strong>
Bar createBar();
@SqlUpdate("insert into something (id, name) values (:id, :name)")
int insert(@Bind("id") int id, @Bind("name") String name);
<strong i="12">@Transaction</strong>
default Something insertAndFind(int id, String name) {
insert(id, name);
return createBar().findById(id);
}
<strong i="13">@Transaction</strong>
default Something insertAndFail(int id, String name) {
insert(id, name);
return createBar().explode();
}
}
public interface Bar {
@SqlQuery("select id, name from something where id = :id")
Something findById(@Bind("id") int id);
default Something explode() {
throw new RuntimeException();
}
}
onDemand()
+ @CreateSqlObject
ã«ã€ããŠãæ確ã«ããŠããããïŒ
@CreateSqlObject
DAOã¯ãäžèšã®äŸã®ããã«ãããããäœæããDAOã®å
éšã¡ãœããããã®ã¿äœ¿çšã§ããŸããfooDao.createBar().findById()
ãåŒã³åºããšãæ¥ç¶ãéããããããšã瀺ãäŸå€ãã¹ããŒãããŸããããäžåºŠã³ã¡ã³ãããŠãã¿ãŸããã ããã«åœ¹ç«ã€ããŒããããã«äœããããŸããïŒ
æœè±¡ã¯ã©ã¹ã§CreateSqlObjectã䜿çšã§ããã®ã¯ãŸã æ¬åœã«å¯ããã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã¹ãŠãå®è¡ããå¿ èŠãããããšã¯ãäŸç¶ãšããŠå¶éãæããŸãã å€ãã®å ŽåãããµãŒãã¹ãã¿ã€ãã®ã¡ãœããããã©ã³ã¶ã¯ã·ã§ã³ã«ãããã®ã§ãããããã¯ããµãŒãã¹ã¯ã©ã¹ãããã©ã«ãã®ã¡ãœããã䜿çšããã€ã³ã¿ãŒãã§ã€ã¹ã§ããå¿ èŠããããé¢å¿ã®åé¢ãå ·äœçãªæçµã¡ãœãããªã©ã®æ確ãã倱ããå§ããããšãæå³ããŸãã
@tamslinnæœè±¡ã¯ã©ã¹ã§ã¯ãªãã€ã³ã¿ãŒãã§ãŒã¹ã®åé¡ã«é¢ããéããè¿ãå°æ¥ããã®æ±ºå®ããæ»ã£ãŠããããšã¯ãªããšç§ã¯å®å šã«èšãããšæããŸãã Jdbi3ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ããµããŒãããjdkãããã·ã䜿çšããŸãã
cglibã«åºã¥ããŠæ§ç¯ãããããã®æ©èœãæäŸããå¥ã®ã¢ãžã¥ãŒã«ãæäŸãããŠããããšã¯å®å šã«åé¡å€ã§ã¯ãªããšæããŸãããçŸæç¹ã§ã¯åé¡ã§ã¯ãããŸããã
sqlobjectã®å
¬çãããã«åããªãå Žåã¯ããã€ã§ããµãŒãã¹ããªãã¡ã¯ã¿ãªã³ã°ããŠãjdbiã«ãã£ãŠæ¡åŒµãããŠããªãéåžžã®ã¯ã©ã¹ã«ããããšãã§ããŸããã代ããã«æµæ¢ãªAPIã䜿çšããããã«Jdbi
ã€ã³ã¹ã¿ã³ã¹ã泚å
¥ããããšãã§ããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒãããªã³ããã³ããªã©ã®æ¬æ¥ã®æ¯ãèãã«ã€ããŠã¯ããŸã å ·äœçãªèšç»ã¯ãªããšæããŸããããŸããŸã泚ç®ãéãŸã£ãŠããŸãã ããããç§ãã¡ã¯ããã«å°éããŠããŸãã
ã¢ããããŒãããŠããã ãããããšãããããŸãã ãããã·ã«é¢ããŠã¯å®å
šã«çã«ããªã£ãŠããŸãã
ç§ã«ãšã£ãŠã®ç¹å®ã®å¶éã¯ãJDBIã¯ã©ã¹ã®å€éšã§ãã©ã³ã¶ã¯ã·ã§ã³ãéå§/çµäºã§ããªãããšã§ãã
ïŒ @svladaãè¿°ã¹ãããã«ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããé«ãã¬ãã«ã§@Transactional
ã䜿çšããã®ãéåžžã«äžè¬çã§ãïŒ
ç§ã¯JDBIã®ä»ã®ãã¹ãŠãæ¬åœã«å¥œããªã®ã§ããããç¶æããŸããããããããµãŒãã¹ã¯ã©ã¹ã«æºè¶³ããŠãããã¶ã€ã³ãã¿ãŒã³ãæãä»ãã§ããã:)
ããäžåºŠã³ã¡ã³ãããŠãã¿ãŸããã ããã«åœ¹ç«ã€ããŒããããã«äœããããŸããïŒ
å šãåé¡ç¡ãã ããã¯æããã«æ··ä¹±ã®åå ã§ãããä¿®æ£ãããããšããããŸããååã¯ããªãã£ãã®ã§ãä»åã¯ç¢ºå®ã«æ£ããä¿®æ£ããããšæããŸã:)
ïŒ @svladaãè¿°ã¹ãããã«ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããé«ãã¬ãã«ã§@Transactionalã䜿çšããã®ãéåžžã«äžè¬çã§ãïŒ
ãããã§ãç§ãç解ããŠããéããããã¯ãã¹ãŠDIãã¬ãŒã ã¯ãŒã¯ïŒSpringãªã©ïŒã®AOPããã¯ãä»ããŠè¡ãããŸãã JDBIã¯ãã¹ãŠã®ãµãŒãã¹ãªããžã§ã¯ãããã©ãããããããã§ã¯ãªããããèªåã§äœæããŠããªããªããžã§ã¯ãã«AOPã®ãããªãœãªã¥ãŒã·ã§ã³ãæäŸããæ©äŒã¯ãããŸããã å€ãcglib
å®è£
ã§ãããdaosèªäœã®@Transactional
ã«ããæ°ä»ãããå¥ã®ãµãŒãã¹ã¯ã©ã¹ã§æ©èœããããšã¯ãããŸããã§ããã
圹ç«ã€å Žåã¯ãSpringãGuiceã®AOPãã€ã³ãã£ã³ã°ãè¿œå ããŠãããé«ãã¬ãã«ã®ãã©ã³ã¶ã¯ã·ã§ã³ãèš±å¯ããããšãæ€èšã§ããŸãã ããã¯core
ã®äžéšã§ã¯ãªããããšãã°spring
æ¡åŒµæ©èœã®äžéšã«ãªããŸãã ããã¯ã³ã¢éçºè
ãé£ã³ã€ããããªãã®ã§ã¯ãªãã§ãããããè²¢ç®ã¯çå£ã«å«ãŸãããšèããããŸãã å€åããã¯ããªãã®åé¡ããããã¯ãªãŒã³ãªãæ¹æ³ã§è§£æ±ºããŸããïŒ
äž»ã«äºææ§ã®çç±ããã cglib
ããProxy
ã«åãæ¿ããããšã«ããŸãã- Proxy
ã¯ãµããŒããããŠããjdk apiã§ããã cglib
ïŒãŸãã¯ããå
·äœçasm
ïŒã¯ãã¡ãžã£ãŒãªãªãŒã¹ïŒ8ã9ã11ã...ã§å£ããïŒããšã«å£ããåŸåããããããã¯å€§ããªã¡ã³ããã³ã¹ã®é çã®çš®ã«ãªããŸãã
ãã¶ãhttps://github.com/jdbi/jdbi/pull/1252ã¯é¢ä¿ããããŸããïŒ
ããã«ã¡ã¯ã
æ
å ±@stevenschlanskerãããããšãã ç§ã¯çŸåšã®ãããžã§ã¯ãã§å®éã«SpringãšJDBIã䜿çšããŠããŸããããæ¯èŒã®ããã«èšåãããŸããã ç§ã¯AOPã®ããšãå®å
šã«ç解ããŠããŸãããããåé¿ããæ¹æ³ãèŠã€ããããšããŠããã ãã§ããã€ãŸããã³ãŒãã奜ããªããã«åå²ã§ããŸããããã¯ã以åã¯æœè±¡ã¯ã©ã¹ã§ãããã cglib
ããé¢ããããšã¯å®å
šã«çã«ããªã£ãŠããŸãã
ä»ã¯ãå¿ èŠãªãšãã«ãµãŒãã¹ã¯ã©ã¹ãäœæããã ãã§ããã©ã³ã¶ã¯ã·ã§ã³å ã§ãµãŒãã¹ã¯ã©ã¹ãäœæã§ããããã«ãªããšèããŠããŸãã
try (Handle handle = jdbi.open()) {
handle.useTransaction(h -> {
AccountService accountService = new AccountServiceImpl(h.attach(AccountDao.class));
accountService.addAccount(a, u);
});
}
ããã¯ãMock Daoã䜿çšããŠãµãŒãã¹ãåäœãã¹ããããµãŒãã¹ã¡ãœãããæçµçã«ç¶æãããã©ã³ã¶ã¯ã·ã§ã³ç®¡çã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ããã©ã«ãã¡ãœããã«äŸåããªãããšãæå³ãããšæããŸãããŸãããµãŒãã¹ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹åã®è¿œå ãªãŒããŒãããã倧ããªåœ±é¿ãäžããããšã¯ãããŸããã
æåŸã®ã³ã¡ã³ãã®ã³ãŒãäŸã«ç°¡åã«è¿ä¿¡ããŠãã ããtry
ãããã¯ãã¹ãããããŠã$ jdbi.useTransaction()
ãçŽæ¥åŒã³åºãããšãã§ããŸãã ãã®ã¡ãœããã¯ãã³ãŒã«ããã¯ãæ»ã£ããšãã«èªåçã«éããããäžæçãªãã³ãã«ãå²ãåœãŠãŸãã
ã¿ãªãããããã«ã¡ã¯ãPRïŒ1579ããããŸããjdbi3.10.0ã®æç¹ã§ãCreateSqlObjectãšonDemandã¯ïŒæçµçã«ïŒããŸãé£æºããã¯ãã§ãã
æãåèã«ãªãã³ã¡ã³ã
å šãåé¡ç¡ãã ããã¯æããã«æ··ä¹±ã®åå ã§ãããä¿®æ£ãããããšããããŸããååã¯ããªãã£ãã®ã§ãä»åã¯ç¢ºå®ã«æ£ããä¿®æ£ããããšæããŸã:)
ãããã§ãç§ãç解ããŠããéããããã¯ãã¹ãŠDIãã¬ãŒã ã¯ãŒã¯ïŒSpringãªã©ïŒã®AOPããã¯ãä»ããŠè¡ãããŸãã JDBIã¯ãã¹ãŠã®ãµãŒãã¹ãªããžã§ã¯ãããã©ãããããããã§ã¯ãªããããèªåã§äœæããŠããªããªããžã§ã¯ãã«AOPã®ãããªãœãªã¥ãŒã·ã§ã³ãæäŸããæ©äŒã¯ãããŸããã å€ã
cglib
å®è£ ã§ãããdaosèªäœã®@Transactional
ã«ããæ°ä»ãããå¥ã®ãµãŒãã¹ã¯ã©ã¹ã§æ©èœããããšã¯ãããŸããã§ããã圹ç«ã€å Žåã¯ãSpringãGuiceã®AOPãã€ã³ãã£ã³ã°ãè¿œå ããŠãããé«ãã¬ãã«ã®ãã©ã³ã¶ã¯ã·ã§ã³ãèš±å¯ããããšãæ€èšã§ããŸãã ããã¯
core
ã®äžéšã§ã¯ãªããããšãã°spring
æ¡åŒµæ©èœã®äžéšã«ãªããŸãã ããã¯ã³ã¢éçºè ãé£ã³ã€ããããªãã®ã§ã¯ãªãã§ãããããè²¢ç®ã¯çå£ã«å«ãŸãããšèããããŸãã å€åããã¯ããªãã®åé¡ããããã¯ãªãŒã³ãªãæ¹æ³ã§è§£æ±ºããŸããïŒäž»ã«äºææ§ã®çç±ããã
cglib
ããProxy
ã«åãæ¿ããããšã«ããŸãã-Proxy
ã¯ãµããŒããããŠããjdk apiã§ãããcglib
ïŒãŸãã¯ããå ·äœçasm
ïŒã¯ãã¡ãžã£ãŒãªãªãŒã¹ïŒ8ã9ã11ã...ã§å£ããïŒããšã«å£ããåŸåããããããã¯å€§ããªã¡ã³ããã³ã¹ã®é çã®çš®ã«ãªããŸãã