Welcome to Doma¶
Doma 㯠Java ã®DBã¢ã¯ã»ã¹ãã¬ãŒã ã¯ãŒã¯ã§ãã
Doma ã®ããŒãžã§ã³ã«ã¯ 1 ãš 2 ããããŸããã ãã®ããã¥ã¡ã³ã㯠ããŒãžã§ã³ 2 ã察象ãšããŠããŸãã
Doma 2 ã«ã¯ä»¥äžã®ç¹åŸŽããããŸãã
- 泚éåŠçã䜿çšã㊠ã³ã³ãã€ã«æ ã«ã³ãŒãã®çæãã³ãŒãã®æ€èšŒãè¡ã
- ããŒã¿ããŒã¹äžã®ã«ã©ã ã®å€ãæ¯ãèããæã£ã Java ãªããžã§ã¯ãã«ãããã³ã°ã§ãã
- 2-way SQL ãšåŒã°ãã SQL ãã³ãã¬ãŒããå©çšã§ãã
- Java 8 ã® java.time.LocalDate ã java.util.Optional ã java.util.stream.Stream ãå©çšã§ãã
- JRE 以å€ã®ã©ã€ãã©ãªãžã®äŸåãäžåãªã
ãã®ããã¥ã¡ã³ãã¯è€æ°ã®ã»ã¯ã·ã§ã³ããæããŸãã
User Documentation¶
Getting Started¶
ç®æ¬¡
æŠèŠÂ¶
éçºç°å¢ã®ã»ããã¢ããæ¹æ³ãšåºæ¬çãªããŒã¿ããŒã¹ã¢ã¯ã»ã¹ã®å®è¡æ¹æ³ã玹ä»ããŸãã
ããŒã
ãã®ããã¥ã¡ã³ãã§ã¯ãIDE ãšã㊠Eclipse ãçšããŸããã Eclipse ã®ä»£ããã« IntelliJ IDEA ãå©çšããŠéçºããããšãå¯èœã§ãã IntelliJ IDEA ãå©çšããå Žåã¯ã IntelliJ Doma support plugin ã®äœµçšãã奚ãããŸãã
JDK ã®ã€ã³ã¹ããŒã«Â¶
JDK 8 ãã€ã³ã¹ããŒã«ããŠãã ããã
Eclipse ã®ã€ã³ã¹ããŒã«Â¶
Eclipse Standard 4.4 ãã€ã³ã¹ããŒã«ããŠãã ããã
ããŒã
Eclipse IDE for Java EE Developers ãªã©ä»ã®ããã±ãŒãžã§ãåäœããŸãã ãã®ããã¥ã¡ã³ãã§ã¯ Eclipse Standard ã察象ãšããŸãã
Eclipse ãã©ã°ã€ã³ Doma Tools ã®ã€ã³ã¹ããŒã«Â¶
Doma Tools 㯠Java ãã¡ã€ã«ãš SQL ãã¡ã€ã«ã®çžäºé·ç§»ãå¯èœã«ãããã©ã°ã€ã³ã§ãã Doma ã®å©çšã«å¿ é ã§ã¯ãããŸãããããã®ãã©ã°ã€ã³ã䜿çšãããšçç£æ§ãé«ãŸããŸãã
Eclipse ã¡ãã¥ãŒããŒãã Help > Install New Software... ãšé²ã¿ã ‘Work With’ ã®ããã¹ãããã¯ã¹ã«æ¬¡ã®URLãå ¥åããŠãã ããã
http://dl.bintray.com/domaframework/eclipse/
以äžã®å³ã®ããã«ã€ã³ã¹ããŒã«å¯èœãªãã©ã°ã€ã³ã®åè£ã衚瀺ãããã®ã§ Doma Tools ã®ææ°ããŒãžã§ã³ã«ãã§ãã¯ãã€ããŠãã€ã¢ãã°ãé²ã ã€ã³ã¹ãŒãã«ãå®äºããŠãã ããã
ãã¡ã€ã«ã®é¢é£ã¥ã¶
Doma Tools ã¯ã SQL ãã¡ã€ã«ã®æŽæ°ãããã¯ããŠæ³šéåŠçãå®è¡ããŸãã ãã®ããã«ã¯ã SQL ãã¡ã€ã«ã Eclipse å ã§éãå¿ èŠããããŸãã
ã¡ãã¥ãŒããŒãã Eclipse > ç°å¢èšå®... ããã㯠Window > Preference ãšéžæããèšå®ç»é¢ãéããŠãã ããã
以äžã®å³ã瀺ãããã« .sql ã®æ¡åŒµåããã€ãã¡ã€ã«ã Text Editor ã«é¢é£ã¥ããŠãã ããã
åæ§ã« .script ã®æ¡åŒµåããã€ãã¡ã€ã«ã Text Editor ã«é¢é£ã¥ããŠãã ããã
ããŒã
Eclipse IDE for Java EE Developers ãå©çšããå Žåã¯ã ããã©ã«ãã§SQLãã¡ã€ã«ãå°çšã®ãšãã£ã¿ã«é¢é£ã¥ããããŠãããã ãã®æé ãã¹ãããã§ããŸãã
ããŒã
SQL 㯠RDBMS åºæã®ããŒã«ïŒOracle SQL Developer ã pgAdminïŒã§äœæãã å®æãããã®ã Eclipse ã®ãšãã£ã¿ãŒã«ã³ããŒãããšãã£ã éçºã¹ã¿ã€ã«ãã奚ãããŸãã
é圢ãããžã§ã¯ãã®ã€ã³ããŒã¶
GitHub ãã simple-boilerplate ã clone ããŠãã ããã
$ git clone git@github.com:domaframework/simple-boilerplate.git
clone ããããã£ã¬ã¯ããªã«ç§»åããŸãã
$ cd simple-boilerplate
次ã®ã³ãã³ã㧠Eclipse çšã®èšå®ãã¡ã€ã«ãçæããŸãã
$ ./gradlew eclipse
ããŒã
Windows ç°å¢ã§ã¯ ./gradlew eclipse ãšãã代ããã« gradlew eclipse ãšããŠãã ããã
ããŒã
ç°å¢å€æ° JAVA_HOME ã« JDK 8 ãã€ã³ã¹ããŒã«ãããã£ã¬ã¯ããªãèšå®ããŠãããŠãã ããã gradlew ã®å®è¡ã«å¿ èŠã§ãã
Eclipse ã®ã¡ãã¥ãŒããFile > Import... ãå®è¡ã ‘Existing Projects into Workspace’ ãéžã㧠simple-boilerplate ãã€ã³ããŒãããŸãã
ã€ã³ããŒããæåããããšã確èªããããã«ãããžã§ã¯ããéžæã㊠JUnit ãå®è¡ããŠãã ããã ãã¹ãã1件æåããã°æ£åžžã«ã€ã³ããŒãã§ããŠããŸãã
é圢ãããžã§ã¯ãã®æ§æ¶
ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã®æ§æã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã
â src
âââ main
â  âââ java
â  â  âââ boilerplate
â  â  âââ AppConfig.java
â  â  âââ dao
â  â  â  âââ AppDao.java
â  â  â  âââ EmployeeDao.java
â  â  âââ entity
â  â  âââ Employee.java
â  âââ resources
â  âââ META-INF
â  âââ boilerplate
â  âââ dao
â  âââ AppDao
â  â  âââ create.script
â  â  âââ drop.script
â  âââ EmployeeDao
â  âââ selectAll.sql
â  âââ selectById.sql
âââ test
âââ java
â  âââ boilerplate
â  âââ DbResource.java
â  âââ dao
â  âââ EmployeeDaoTest.java
âââ resources
äž»èŠãªãã®ã«ã€ããŠèª¬æããŸãã
- AppConfig.java
- Doma ãå®è¡ããããã«å¿ èŠãª èšå® ã§ãã
- AppDao.java
- ãã®ã¢ããªã±ãŒã·ã§ã³ã§å©çšããããŒã¿ããŒã¹ã®ã¹ããŒããå®è¡æã«äœæ/ç Žæ£ãããŠãŒãã£ãªãã£ã§ãã å®ç°å¢ã§ã¯äžèŠã«ãªããŸãã ã¹ããŒãã®äœæãšç Žæ£ã«ã¯ META-INF/boilerplate/dao/AppDao/ 以äžã®ã¹ã¯ãªãããã¡ã€ã«ã䜿çšããŸãã
- Employee.java
- ããŒã¿ããŒã¹ã® EMPLOYEE ããŒãã«ã«å¯Ÿå¿ãã ãšã³ãã£ãã£ã¯ã©ã¹ ã§ãã
- EmployeeDao.java
- Employee ã¯ã©ã¹ã®ååŸãæŽæ°ãªã©ãè¡ã Daoã€ã³ã¿ãã§ãŒã¹ ã§ãã META-INF/boilerplate/dao/EmployeeDao/ 以äžã® SQLãã¡ã€ã« ã䜿çšããŸãã
- EmployeeDaoTest.java
- EmployeeDao ã䜿ã£ããã¹ãã§ãã ãã®ãã¡ã€ã«ã«ãã¹ãã±ãŒã¹ãè¿œå ããªãã Doma ã®åŠç¿ãã§ããŸãã ãã¹ãã¡ãœããããšã«ããŒã¿ããŒã¹ã¹ããŒãã®äœæãšç Žæ£ãè¡ã£ãŠãããã ããŒã¿ã®æŽæ°ã«ãã£ãŠä»ã®ãã¹ãã圱é¿ãåããããšã¯ãããŸããã
Java ãš SQL ã®çžäºé·ç§»Â¶
EmployeeDao.java ã§ã¯æ¬¡ã®ããã«å®çŸ©ãããŠããŸãã
@Dao(config = AppConfig.class)
public interface EmployeeDao {
@Select
List<Employee> selectAll();
@Select
Employee selectById(Integer id);
@Insert
int insert(Employee employee);
@Update
int update(Employee employee);
@Delete
int delete(Employee employee);
}
Eclipse ã®ãšãã£ã¿äžã§ selectById ã¡ãœããã«ã«ãŒãœã«ãåããå³ã¯ãªãã¯ãªã©ã§ ã³ã³ããã¹ãã¡ãã¥ãŒã衚瀺ãããŠãã ããã ã¡ãã¥ãŒã®äžãã Doma > Jump to SQL ãéžæãããš META-INF/boilerplate/dao/EmployeeDao/selectById.sql ãã¡ã€ã«ãžé·ç§»ã§ããŸãã
次ã«ãMETA-INF/boilerplate/dao/EmployeeDao/selectById.sql ãã¡ã€ã«ã®ä»»æã®å Žæã« ã«ãŒãœã«ã眮ããã³ã³ããã¹ãã¡ãã¥ãŒã衚瀺ãããŠãã ããã ã¡ãã¥ãŒã®äžãã Doma > Jump to Java ãéžæãããš EmployeeDao.java ãã¡ã€ã«ãžæ»ã£ãŠããããŸãã
SQL ãã¡ã€ã«Â¶
META-INF/boilerplate/dao/EmployeeDao/selectById.sql ãã¡ã€ã«ãéããŠãã ããã ãã®ãã¡ã€ã«ã«ã¯æ¬¡ã®ããã«èšè¿°ãããŠããŸãã
select
/*%expand*/*
from
employee
where
id = /* id */0
/*%expand*/ 㯠Java ã¡ãœããã§ããããã³ã°ããã ãšã³ãã£ãã£ã¯ã©ã¹ã®å®çŸ©ãåç §ããŠã«ã©ã ãªã¹ããå±éããããšã瀺ããŠããŸãã
/* id */ 㯠Java ã¡ãœããã®ãã©ã¡ãŒã¿ã®å€ããã® SQL ãžãã€ã³ããããããšã 瀺ããŠããŸãã
åŸãã«ãã 0 ã¯ãã¹ãçšã®ããŒã¿ã§ãã ãã®ãã¹ãããŒã¿ãå«ããããšã§ã SQL ãããŒã«ã§å®è¡ããŠæ§æäžã® 誀ãããªãããšã容æã«ç¢ºèªã§ããŸãã ãã¹ãçšã®ããŒã¿ã¯ Java ããã°ã©ã å®è¡æã«ã¯äœ¿ãããŸããã
詳现ã«ã€ããŠã¯ã SQL ãåç §ããŠãã ããã
æ€çŽ¢Â¶
æ€çŽ¢ åŠçãå®è¡ããã«ã¯ã @Select ã泚éããã Dao ã¡ãœãããåŒã³åºããŸãã
æ€çŽ¢åŠçã®è¿œå ¶
ãã幎霢ããå°ããåŸæ¥å¡ãæ€çŽ¢ããåŠçãè¿œå ããæé ã瀺ããŸãã
EmployeeDao ã«æ¬¡ã®ã³ãŒããè¿œå ããŠãã ããã
@Select
List<Employee> selectByAge(Integer age);
ãã®ãšãã泚éåŠçã«ãã次ã®ãšã©ãŒã¡ãã»ãŒãžã Eclilpse äžã«è¡šç€ºãããŸãã
[DOMA4019] ãã¡ã€ã«[META-INF/boilerplate/dao/EmployeeDao/selectByAge.sql]ã
ã¯ã©ã¹ãã¹ããèŠã€ãããŸããã§ããã
Eclipse ã®ãšãã£ã¿äžã§ selectByAge ã¡ãœããã«ã«ãŒãœã«ãåããå³ã¯ãªãã¯ãªã©ã§ ã³ã³ããã¹ãã¡ãã¥ãŒã衚瀺ãããã¡ãã¥ãŒã®äžãã Doma > Jump to SQL ãéžæããŠãã ããã
SQL ãã¡ã€ã«ã®æ°èŠäœæãè¡ãããã®ãã€ã¢ãã°ã次ã®ããã«è¡šç€ºãããŸãã
‘Finish’ ãæŒããŠãã¡ã€ã«ãäœæããŠãã ããã
ãã¡ã€ã«äœæåŸããã¡ã€ã«ã空ã®ãŸãŸä¿ç®¡ã㊠EmployeeDao ã«æ»ããš ãšã©ãŒã¡ãã»ãŒãžã®å 容ãå€ãããŸãã
[DOMA4020] SQLãã¡ã€ã«[META-INF/boilerplate/dao/EmployeeDao/selectByAge.sql]ã空ã§ãã
selectByAge.sql ãã¡ã€ã«ã«æ»ã£ãŠæ¬¡ã® SQL ãèšè¿°ããŠãã ããã
select
/*%expand*/*
from
employee
where
age < /* age */0
ããã§ãšã©ãŒã解æ¶ãããŸãã
æ€çŽ¢åŠçã®å®è¡Â¶
äžèšã§äœæããæ€çŽ¢åŠçãå®éã«å®è¡ããŸãã
EmployeeDaoTest ã«æ¬¡ã®ã³ãŒããè¿œå ããŠãã ããã
@Test
public void testSelectByAge() {
TransactionManager tm = AppConfig.singleton().getTransactionManager();
tm.required(() -> {
List<Employee> employees = dao.selectByAge(35);
assertEquals(2, employees.size());
});
}
JUnit ãå®è¡ãããã®ã³ãŒããåäœããããšã確èªããŠãã ããã
ãã®ãšãçºè¡ãããæ€çŽ¢ã®ããã® SQL ã¯æ¬¡ã®ãã®ã§ãã
select
age, id, name, version
from
employee
where
age < 35
æ¿å ¥Â¶
æ¿å ¥ åŠçãå®è¡ããã«ã¯ã @Insert ã泚éããã Dao ã¡ãœãããåŒã³åºããŸãã
æ¿å ¥åŠçã®å®è¡Â¶
EmployeeDao ã«æ¬¡ã®ã³ãŒããååšããããšã確èªããŠãã ããã
@Insert
int insert(Employee employee);
ãã®ã³ãŒããå©çšããŠæ¿å ¥åŠçãå®è¡ããŸãã
EmployeeDaoTest ã«æ¬¡ã®ã³ãŒããè¿œå ããŠãã ããã
@Test
public void testInsert() {
TransactionManager tm = AppConfig.singleton().getTransactionManager();
Employee employee = new Employee();
// æåã®ãã©ã³ã¶ã¯ã·ã§ã³
// æ¿å
¥ãå®è¡ããŠãã
tm.required(() -> {
employee.name = "HOGE";
employee.age = 20;
dao.insert(employee);
assertNotNull(employee.id);
});
// 2çªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³
// æ¿å
¥ãæåããŠããããšã確èªããŠãã
tm.required(() -> {
Employee employee2 = dao.selectById(employee.id);
assertEquals("HOGE", employee2.name);
assertEquals(Integer.valueOf(20), employee2.age);
assertEquals(Integer.valueOf(1), employee2.version);
});
}
JUnit ãå®è¡ãããã®ã³ãŒããåäœããããšã確èªããŠãã ããã
ãã®ãšãçºè¡ãããæ¿å ¥ã®ããã® SQL ã¯æ¬¡ã®ãã®ã§ãã
insert into Employee (age, id, name, version) values (20, 100, 'HOGE', 1)
èå¥åãšããŒãžã§ã³çªå·ãèªåã§èšå®ãããŠããŸãã
æŽæ°Â¶
æŽæ° åŠçãå®è¡ããã«ã¯ã @Update ã泚éããã Dao ã¡ãœãããåŒã³åºããŸãã
æŽæ°åŠçã®å®è¡Â¶
EmployeeDao ã«æ¬¡ã®ã³ãŒããååšããããšã確èªããŠãã ããã
@Update
int update(Employee employee);
ãã®ã³ãŒããå©çšããŠæŽæ°åŠçãå®è¡ããŸãã
EmployeeDaoTest ã«æ¬¡ã®ã³ãŒããè¿œå ããŠãã ããã
@Test
public void testUpdate() {
TransactionManager tm = AppConfig.singleton().getTransactionManager();
// æåã®ãã©ã³ã¶ã¯ã·ã§ã³
// æ€çŽ¢ã㊠age ãã£ãŒã«ããæŽæ°ããŠãã
tm.required(() -> {
Employee employee = dao.selectById(1);
assertEquals("ALLEN", employee.name);
assertEquals(Integer.valueOf(30), employee.age);
assertEquals(Integer.valueOf(0), employee.version);
employee.age = 50;
dao.update(employee);
assertEquals(Integer.valueOf(1), employee.version);
});
// 2çªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³
// æŽæ°ãæåããŠããããšã確èªããŠãã
tm.required(() -> {
Employee employee = dao.selectById(1);
assertEquals("ALLEN", employee.name);
assertEquals(Integer.valueOf(50), employee.age);
assertEquals(Integer.valueOf(1), employee.version);
});
}
JUnit ãå®è¡ãããã®ã³ãŒããåäœããããšã確èªããŠãã ããã
ãã®ãšãçºè¡ãããæŽæ°ã®ããã® SQL ã¯æ¬¡ã®ãã®ã§ãã
update Employee set age = 50, name = 'ALLEN', version = 0 + 1 where id = 1 and version = 0
楜芳çæä»å¶åŸ¡ã®ããã®ããŒãžã§ã³çªå·ãèªåã§ã€ã³ã¯ãªã¡ã³ããããŠããŸãã
åé€Â¶
åé€ åŠçãå®è¡ããã«ã¯ã @Delete ã泚éããã Dao ã¡ãœãããåŒã³åºããŸãã
åé€åŠçã®å®è¡Â¶
EmployeeDao ã«æ¬¡ã®ã³ãŒããååšããããšã確èªããŠãã ããã
@Delete
int delete(Employee employee);
ãã®ã³ãŒããå©çšããŠåé€åŠçãå®è¡ããŸãã
EmployeeDaoTest ã«æ¬¡ã®ã³ãŒããè¿œå ããŠãã ããã
@Test
public void testDelete() {
TransactionManager tm = AppConfig.singleton().getTransactionManager();
// æåã®ãã©ã³ã¶ã¯ã·ã§ã³
// åé€ãå®è¡ããŠãã
tm.required(() -> {
Employee employee = dao.selectById(1);
dao.delete(employee);
});
// 2çªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³
// åé€ãæåããŠããããšã確èªããŠãã
tm.required(() -> {
Employee employee = dao.selectById(1);
assertNull(employee);
});
}
JUnit ãå®è¡ãããã®ã³ãŒããåäœããããšã確èªããŠãã ããã
ãã®ãšãçºè¡ãããåé€ã®ããã® SQL ã¯æ¬¡ã®ãã®ã§ãã
delete from Employee where id = 1 and version = 0
èå¥åã«å ãããŒãžã§ã³çªå·ãæ€çŽ¢æ¡ä»¶ã«æå®ãããŸãã
èšå®Â¶
ç®æ¬¡
- èšå®
- èšå®é
ç®
- ããŒã¿ãœãŒã¹
- ããŒã¿ãœãŒã¹ã®åå
- ããŒã¿ããŒã¹ã®æ¹èš
- ãã°åºåã©ã€ãã©ãªãžã®ã¢ããã¿
- SQLãã¡ã€ã«ã®ãªããžããª
- REQUIRES_NEW å±æ§ã®ãã©ã³ã¶ã¯ã·ã§ã³ãšã®é£å
- ã¯ã©ã¹ã®ããŒãæ¹æ³
- äŸå€ã¡ãã»ãŒãžã«å«ããSQLã®çš®å¥
- æªç¥ã®ã«ã©ã ã®ãã³ãã©
- ãããã®ããŒã®ããŒãã³ã°èŠçŽã®å¶åŸ¡
- ããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ãããŒãžã£ãŒ
- SQLã®èå¥åã®è¿œèš
- Command ã®å®è£
- Query ã®å®è£
- ã¿ã€ã ã¢ãŠã
- æ倧件æ°
- ãã§ãããµã€ãº
- ããããµã€ãº
- JDBC ãã©ã€ãã®ããŒã
- å®çŸ©ãšå©çšäŸ
- èšå®é
ç®
Domaã«å¯Ÿããèšå®ã¯ã Confing ã€ã³ã¿ãã§ãŒã¹ã®å®è£ ã¯ã©ã¹ã§è¡šçŸããŸãã
èšå®é ç®Â¶
èšå®å¿ é ãšæ瀺ããŠããªãé ç®ã«ã€ããŠã¯ããã©ã«ãã®å€ã䜿çšãããŸãã
ããŒã¿ãœãŒã¹Â¶
DataSource ã getDataSource ã¡ãœããã§è¿ããŠãã ããã ããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ãå©çšããå Žåã¯ã LocalTransactionDataSource ãè¿ããŠãã ããã
ããŒã
ãã®é ç®ã¯èšå®å¿ é ã§ãã
ããŒã¿ãœãŒã¹ã®åå¶
ããŒã¿ãœãŒã¹åããããã String ã getDataSourceName ã¡ãœããã§è¿ããŠãã ããã ããŒã¿ãœãŒã¹åã¯ãè€æ°ã®ããŒã¿ãœãŒã¹ãå©çšããç°å¢ã§éèŠã§ãã ããŒã¿ãœãŒã¹åã¯ããŒã¿ãœãŒã¹ããšã«èªåçæãããèå¥åãåºå¥ããããã«äœ¿çšãããŸãã è€æ°ããŒã¿ãœãŒã¹ãå©çšããå Žåã¯ãããããç°ãªãååãè¿ãããã«ããŠãã ããã
ããã©ã«ãã®å®è£ ã§ã¯ã Config ã®å®è£ ã¯ã©ã¹ã®å®å šä¿®é£Ÿåã䜿çšãããŸãã
ããŒã¿ããŒã¹ã®æ¹èšÂ¶
Dialect ã getDialect ã¡ãœããã§è¿ããŠãã ããã Dialect ã¯RDBMSã®æ¹èšãè¡šãã€ã³ã¿ãã§ãŒã¹ã§ãã Dialect ã«ã¯æ¬¡ã®ãã®ããããŸãã
ããŒã¿ããŒã¹ | Dialect | 説æ |
---|---|---|
DB2 | Db2Dialect | |
H2 Database Engine 1.2.126 | H212126Dialect | H2 Database Engine 1.2.126ã§çšŒå |
H2 Database | H2Dialect | H2 Database Engine 1.3.171以éã«å¯Ÿå¿ |
HSQLDB | HsqldbDialect | |
Microsoft SQL Server 2008 | Mssql2008Dialect | Microsoft SQL Server 2008ã«å¯Ÿå¿ |
Microsoft SQL Server | MssqlDialect | Microsoft SQL Server 2012以éã«å¯Ÿå¿ |
MySQL | MySqlDialect | |
Oracle Database | OracleDialect | |
PostgreSQL | PostgresDialect | |
SQLite | SqliteDialect |
ããŒã
ãã®é ç®ã¯èšå®å¿ é ã§ãã
ãã°åºåã©ã€ãã©ãªãžã®ã¢ããã¿Â¶
JdbcLogger ã getJdbcLogger ã¡ãœããã§è¿ããŠãã ããã JdbcLogger ã¯ããŒã¿ããŒã¹ã¢ã¯ã»ã¹ã«é¢ãããã°ãæ±ãã€ã³ã¿ãã§ãŒã¹ã§ãã å®è£ ã¯ã©ã¹ã«ã¯æ¬¡ã®ãã®ããããŸãã
- org.seasar.doma.jdbc.UtilLoggingJdbcLogger
UtilLoggingJdbcLogger 㯠java.util.logging ã®ãã¬ãŒã䜿çšããå®è£ ã§ã ããã©ã«ãã§äœ¿çšãããŸãã
SQLãã¡ã€ã«ã®ãªããžããªÂ¶
SqlFileRepository ã getSqlFileRepository ã¡ãœããã§è¿ããŠãã ããã SqlFileRepository 㯠SQL ãã¡ã€ã«ã®ãªããžããªãæ±ãã€ã³ã¿ãã§ãŒã¹ã§ãã å®è£ ã¯ã©ã¹ã«ã¯æ¬¡ã®ãã®ããããŸãã
- org.seasar.doma.jdbc.GreedyCacheSqlFileRepository
- org.seasar.doma.jdbc.NoCacheSqlFileRepository
GreedyCacheSqlFileRepository ã¯ãèªã¿èŸŒãã SQLãã¡ã€ã«ã®å 容ãããŒã¹ãã ãã®çµæãã¡ã¢ãªãèš±ãéãæ倧éã«ãã£ãã·ã¥ããŸãã
NoCacheSqlFileRepository ã¯ãäžåãã£ãã·ã¥ãè¡ããŸããã æ¯åãSQLãã¡ã€ã«ããSQLãèªã¿åãããŒã¹ããŸãã
ã¡ã¢ãªã®å©çšã«å³ããå¶éãããç°å¢ããæ±ãSQLãã¡ã€ã«ãèšå€§ã«ããç°å¢ã§ã¯ã é©åãªãã£ãã·ã¥ã¢ã«ãŽãªãºã ããã£ãå®è£ ã¯ã©ã¹ãäœæã䜿çšããŠãã ããã
ããã©ã«ãã§ã¯ GreedyCacheSqlFileRepository ã䜿çšãããŸãã
REQUIRES_NEW å±æ§ã®ãã©ã³ã¶ã¯ã·ã§ã³ãšã®é£å¶
RequiresNewController ã getRequiresNewController ã¡ãœããã§è¿ããŠãã ããã RequiresNewController 㯠REQUIRES_NEW ã®å±æ§ããã€ãã©ã³ã¶ã¯ã·ã§ã³ã å¶åŸ¡ããã€ã³ã¿ãã§ãŒã¹ã§ãã
ãã®ã€ã³ã¿ãã§ãŒã¹ã¯ã @TableGenerator ã§ãèå¥åãèªåçæããéã«ãã䜿ãããŸããã @TableGenerator ãå©çšããªãå Žåã¯ããã®èšå®é ç®ãèæ ®ããå¿ èŠã¯ãããŸããã ãŸãã @TableGenerator ãå©çšããå Žåã§ãã£ãŠãã èå¥åãæ¡çªããããã®æŽæ°ããã¯ãåé¡ã«ãªããªãçšåºŠã®ãã©ã³ã¶ã¯ã·ã§ã³æ°ã§ããã°ã èšå®ããå¿ èŠãããŸããã
ããã©ã«ãã®å®è£ ã¯äœã®åŠçãããŸããã
ã¯ã©ã¹ã®ããŒãæ¹æ³Â¶
ClassHelper ã getClassHelper ã¡ãœããã§è¿ããŠãã ããã ClassHelper ã¯ã¯ã©ã¹ã®ããŒãã«é¢ããŠã¢ããªã±ãŒã·ã§ã³ãµãŒãã ãã¬ãŒã ã¯ãŒã¯ã®å·®ç°ãæœè±¡åããã€ã³ã¿ãã§ãŒã¹ã§ãã
ããã©ã«ãã®å®è£ 㯠java.lang.Class.forName(name) ãçšããŠã¯ã©ã¹ãããŒãããŸãã
äŸå€ã¡ãã»ãŒãžã«å«ããSQLã®çš®å¥Â¶
äŸå€ã¡ãã»ãŒãžã«å«ããSQLã®ã¿ã€ãããããã SqlLogType ã getExceptionSqlLogType ã¡ãœããã§è¿ããŠãã ããã ãã®å€ã¯ãDoma ãã¹ããŒããäŸå€ã«ã©ã®ãããªåœ¢åŒã®SQLãå«ãããã決å®ããŸãã
ããã©ã«ãã®å®è£ ã§ã¯ããã©ãŒãããããã SQL ãå«ããŸãã
æªç¥ã®ã«ã©ã ã®ãã³ãã©Â¶
UnknownColumnHandler ã getUnknownColumnHandler ã¡ãœããã§è¿ããŠãã ããã UnknownColumnHandler 㯠æ€çŽ¢ ã®çµæã ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãããã³ã°ããéã ãšã³ãã£ãã£ã¯ã©ã¹ã«ãšã£ãŠæªç¥ã®ã«ã©ã ãååšããå Žåã«å®è¡ãããŸãã
ããã©ã«ãã§ã¯ã UnknownColumnException ãã¹ããŒãããŸãã
ãããã®ããŒã®ããŒãã³ã°èŠçŽã®å¶åŸ¡Â¶
MapKeyNaming ã getMapKeyNaming ã¡ãœããã§è¿ããŠãã ããã MapKeyNaming ã¯æ€çŽ¢çµæã java.util.Map<String, Object> ã«ãããã³ã°ããå Žåã«å®è¡ãããŸãã
ããã©ã«ãã§ã¯ã @Select ãªã©ã® mapKeyNaming èŠçŽ ã«æå®ãããèŠçŽãé©çšããŸãã
ããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ãããŒãžã£ãŒÂ¶
LocalTransactionManager ã getTransactionManager ã¡ãœããã§è¿ããŠãã ããã getTransactionManager ã¡ãœããã¯ãããã©ã«ã㧠UnsupportedOperationException ãã¹ããŒããŸãã
ããŒã
ãã®é ç®ã¯èšå®å¿ é ã§ã¯ãããŸãããã org.seasar.doma.jdbc.tx.TransactionManager ã®ã€ã³ã¿ãã§ãŒã¹ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå©çšãããå Žåã¯èšå®ããŠãã ããã èšå®æ¹æ³ã«ã€ããŠã¯ ãã©ã³ã¶ã¯ã·ã§ã³ ãåç §ããŠãã ããã
SQLã®èå¥åã®è¿œèšÂ¶
Commenter ã getCommenter ã¡ãœããã§è¿ããŠãã ããã Commenter ã¯SQLã®èå¥åïŒQLã®çºè¡ç®æçãç¹å®ããããã®æååïŒãSQLã³ã¡ã³ããšããŠè¿œèšããããã®ã€ã³ã¿ãã§ãŒã¹ã§ãã
å®è£ ã¯ã©ã¹ã«ã¯æ¬¡ã®ãã®ããããŸãã
- org.seasar.doma.jdbc.CallerCommenter
CallerCommenter ã¯ãSQLã®åŒã³åºãå ã®ã¯ã©ã¹åãšã¡ãœããåãèå¥åãšããŠäœ¿çšããŸãã
ããã©ã«ãã®å®è£ ã§ã¯ã èå¥åãè¿œèšããŸããã
Command ã®å®è£ ¶
CommandImplementors ã getCommandImplementors ã¡ãœããã§è¿ããŠãã ããã CommandImplementors ãå®è£ ãããš ã¯ãšãª ã®å®è¡ãã«ã¹ã¿ãã€ãºã§ããŸãã
ããšãã°ã JDBC ã® API ãçŽæ¥åŒã³åºãããšãã§ããŸãã
Query ã®å®è£ ¶
QueryImplementors ã getQueryImplementors ã¡ãœããã§è¿ããŠãã ããã QueryImplementors ãå®è£ ãããš ã¯ãšãª ã®å 容ãã«ã¹ã¿ãã€ãºã§ããŸãã
ããšãã°ãèªåçæããã SQL ã®äžéšãæžãæãå¯èœã§ãã
ã¿ã€ã ã¢ãŠã¶
ã¯ãšãªã¿ã€ã ã¢ãŠãïŒç§ïŒããããã int ã getQueryTimeout ã¡ãœããã§è¿ããŠãã ããã ãã®å€ã¯ãã¹ãŠã® ã¯ãšãª ã«ãããŠããã©ã«ãå€ãšããŠäœ¿ãããŸãã
æ倧件æ°Â¶
SELECTæã®æ倧è¡æ°ããããã int ã getMaxRows ã¡ãœããã§è¿ããŸãã ãã®å€ã¯ãã¹ãŠã® æ€çŽ¢ ã«ãããŠããã©ã«ãå€ãšããŠäœ¿ãããŸãã
ãã§ãããµã€ãºÂ¶
SELECTæã®ãã§ãããµã€ãºããããã int ã getFetchSize ã¡ãœããã§è¿ããŸãã ãã®å€ã¯ãã¹ãŠã® æ€çŽ¢ ã«ãããŠããã©ã«ãå€ãšããŠäœ¿ãããŸãã
ããããµã€ãºÂ¶
ããããµã€ãºããããã int ã getBatchSize ã¡ãœããã§è¿ããŸãã ãã®å€ã¯ ãããæ¿å ¥ ããããæŽæ° ããããåé€ ã«ãããŠããã©ã«ãå€ãšããŠäœ¿ãããŸãã
JDBC ãã©ã€ãã®ããŒã¶
ã¯ã©ã¹ãã¹ãéã£ãŠããã° JDBC ãã©ã€ã㯠ãµãŒãã¹ãããã€ãã¡ã«ããºã ã«ããèªåã§ããŒããããŸãã
èŠå
å®è¡ç°å¢ã«ãã£ãŠã¯ã JDBC ãã©ã€ããèªåã§ããŒããããªãããšããããŸãã ããšãã° Tomcat äžã§ã¯ WEB-INF/lib ã«é 眮ããã JDBC ãã©ã€ãã¯èªåã§ããŒããããŸãã ã ãã®ãããªç°å¢ã«ãããŠã¯ããã®ç°å¢ã«å¿ããé©åã¯æ¹æ³ãæ¡ã£ãŠãã ããã ããšãã° Tomcat äžã§åäœãããããã®ã«ã¯ãäžèšã®ãªã³ã¯å ã®æ瀺ã«åŸã£ãŠ ServletContextListener ãå©çšããããŒããšã¢ã³ããŒããè¡ã£ãŠãã ããã
å®çŸ©ãšå©çšäŸÂ¶
ã·ã³ãã«Â¶
ã·ã³ãã«ãªå®çŸ©ã¯æ¬¡ã®å Žåã«é©ããŠããŸãã
- DIã³ã³ããã§ç®¡çããªã
- ããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãã
å®è£ äŸã§ãã
@SingletonConfig
public class AppConfig implements Config {
private static final AppConfig CONFIG = new AppConfig();
private final Dialect dialect;
private final LocalTransactionDataSource dataSource;
private final TransactionManager transactionManager;
private AppConfig() {
dialect = new H2Dialect();
dataSource = new LocalTransactionDataSource(
"jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null);
transactionManager = new LocalTransactionManager(
dataSource.getLocalTransaction(getJdbcLogger()));
}
@Override
public Dialect getDialect() {
return dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public TransactionManager getTransactionManager() {
return transactionManager;
}
public static AppConfig singleton() {
return CONFIG;
}
}
ããŒã
ã¯ã©ã¹ã« @SingletonConfig ã泚éããã®ãå¿ããªãããã«ããŠãã ããã
å©çšäŸã§ãã å®çŸ©ããèšå®ã¯ã©ã¹ã¯ã@Daoã«æå®ããŸãã
@Dao(config = AppConfig.class)
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
ã¢ããã³ã¹ã¶
ã¢ããã³ã¹ããªå®çŸ©ã¯æ¬¡ã®å Žåã«é©ããŠããŸãã
- DIã³ã³ããã§ã·ã³ã°ã«ãã³ãšããŠç®¡çãã
- DIã³ã³ãããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãæäŸãããã©ã³ã¶ã¯ã·ã§ã³ç®¡çæ©èœã䜿ã
å®è£ äŸã§ãã dialect ãš dataSource ã¯DIã³ã³ããã«ãã£ãŠã€ã³ãžã§ã¯ã·ã§ã³ãããããšãæ³å®ããŠããŸãã
public class AppConfig implements Config {
private Dialect dialect;
private DataSource dataSource;
@Override
public Dialect getDialect() {
return dialect;
}
public void setDialect(Dialect dialect) {
this.dialect = dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
å©çšäŸã§ãã å®çŸ©ããèšå®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãDIã³ã³ããã«ãã£ãŠã€ã³ãžã§ã¯ããããããã«ããŸãã
@Dao
@AnnotateWith(annotations = {
@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class),
@Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = javax.inject.Named.class, elements = "\"config\"") })
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
äžèšã®äŸã§ã¯ @AnnotateWith ã®èšè¿°ãDaoããšã«ç¹°ãè¿ãèšè¿°ããå¿ èŠããããŸãã ç¹°ãè¿ããé¿ãããå Žåã¯ãä»»æã®ã¢ãããŒã·ã§ã³ã«äžåºŠã ã @AnnotateWith ãèšè¿°ãã Daoã«ã¯ãã®ã¢ãããŒã·ã§ã³ã泚éããŠãã ããã
@AnnotateWith(annotations = {
@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = javax.inject.Inject.class),
@Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = javax.inject.Named.class, elements = "\"config\"") })
public @interface InjectConfig {
}
@Dao
@InjectConfig
public interface EmployeeDao {
@Select
Employee selectById(Integer id);
}
åºæ¬å¶
ç®æ¬¡
Domaã§ã¯ãããŒã¿ããŒã¹ã®ã«ã©ã ã«ãããã³ã°å¯èœãªJavaã®åãåºæ¬åãšåŒã³ãŸãã
çš®é¡Â¶
åºæ¬åã«ã¯ä»¥äžã®çš®é¡ããããŸãã
- ããªããã£ãåãšãã®ã©ãããŒåïŒãã ã char ãš java.lang.Character ã¯é€ãïŒ
- åæå
- byte[]
- java.lang.String
- java.lang.Object
- java.math.BigDecimal
- java.math.BigInteger
- java.time.LocalDate
- java.time.LocalTime
- java.time.LocalDateTime
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
- java.sql.Array
- java.sql.Blob
- java.sql.Clob
- java.sql.SQLXML
- java.util.Date
æ¥ä»/æå»å¶
æ¥ä»ãšæå»ã®åã®éãã«ã€ããŠèª¬æããŸãã
- java.time.LocalDate
- SQLæšæºã®DATEå (æ¥ä»ã®ã¿)ãè¡šããŸãã
- java.time.LocalTime
- SQLæšæºã®TIMEå (æå»ã®ã¿)ãè¡šããŸãã
- java.time.LocalDateTime
- SQLæšæºã®TIMESTAMPå (æ¥ä»ãšæå»)ãè¡šããŸããRDBMSããµããŒãããŠããå Žåããç§ãä¿æããŸãã
- java.sql.Date
- SQLæšæºã®DATEå (æ¥ä»ã®ã¿)ãè¡šããŸãã
- java.sql.Time
- SQLæšæºã®TIMEå (æå»ã®ã¿)ãè¡šããŸãã
- java.sql.Timestamp
- SQLæšæºã®TIMESTAMPå (æ¥ä»ãšæå»)ãè¡šããŸããRDBMSããµããŒãããŠããå Žåããç§ãä¿æããŸãã
- java.util.Date
- SQLæšæºã®TIMESTAMPå (æ¥ä»ãšæå»)ãè¡šããŸããããç§ãä¿æããŸããã
å©çšäŸÂ¶
ãšã³ãã£ãã£ã¯ã©ã¹Â¶
@Entity
public class Employee {
@Id
Integer employeeId;
Optional<String> employeeName;
@Version
Long versionNo;
...
}
ãã¡ã€ã³ã¯ã©ã¹Â¶
@Domain(valueType = String.class)
public class PhoneNumber {
private final String value;
public PhoneNumber(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Daoã¯ã©ã¹Â¶
@Dao(config = AppConfig.class)
public interface EmployeeDao {
@Select
Employee selectById(Integer employeeId);
@Select
List<String> selectAllName();
}
ãã¡ã€ã³ã¯ã©ã¹Â¶
ç®æ¬¡
Domain ïŒãã¡ã€ã³ïŒã¯ã©ã¹ã®å®çŸ©æ¹æ³ã瀺ããŸãã
Doma ã§ã¯ãããŒãã«ã®ã«ã©ã ã®å€ã ãã¡ã€ã³ ãšåŒã°ãã Java ãªããžã§ã¯ãã§æ±ããŸãã ãã¡ã€ã³ãšã¯å€ã®ãšãåŸãç¯å²ãã€ãŸãå®çŸ©åã®ããšã§ãã
ãã¡ã€ã³ã¯ã©ã¹ãå©çšããããšã§ãããŒã¿ããŒã¹äžã®ã«ã©ã ã®åãåããã£ãŠã ã¢ããªã±ãŒã·ã§ã³äžæå³ãç°ãªããã®ãå¥ã®Javaã®åã§è¡šçŸã§ããŸãã ããã«ããæå³ãæ確ã«ãããã°ã©ãã³ã°ãã¹ãäºåã«é²ãããããªããŸãã ãŸãããã¡ã€ã³ã¯ã©ã¹ã«æ¯ãèããæãããããšã§ããããããããããã°ã©ãã³ã°ãå¯èœã§ãã
ãã¡ã€ã³ã¯ã©ã¹ã®äœæãšå©çšã¯ä»»æã§ãã ãã¡ã€ã³ã¯ã©ã¹ãå©çšããªããŠã Integer ã String ãªã©åºæ¬åã®ã¿ã§ããŒã¿ã¢ã¯ã»ã¹ã¯å¯èœã§ãã
ãã¡ã€ã³ã¯ãå®çŸ©ã®ä»æ¹ã«ããå éšãã¡ã€ã³ãšå€éšãã¡ã€ã³ã«åããããŸãã
å éšãã¡ã€ã³Â¶
ãã¡ã€ã³ãšããŠæ±ããã察象ã®ã¯ã©ã¹ã®ãœãŒã¹ã³ãŒãã«çŽæ¥å®çŸ©ãèšè¿°ããŸãã
å éšãã¡ã€ã³ãå®çŸ©ããã«ã¯ãã¯ã©ã¹ã« @Domain ã泚éããŸãã
@Domain ã® valueType èŠçŽ ã«ã¯ åºæ¬å ãæå®ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ã§çæããæ¹æ³Â¶
@Domain ã® factoryMethod èŠçŽ ã®ããã©ã«ãã®å€ã¯ new ã§ããã éprivateãªã³ã³ã¹ãã©ã¯ã¿ã§ã€ã³ã¹ã¿ã³ã¹ãçæããããšã瀺ããŸãã ãã®ãããã³ã³ã¹ãã©ã¯ã¿ã§çæããå Žå㯠factoryMethod èŠçŽ ãçç¥ã§ããŸãã 次ã®äŸã§ã¯ã public ãªã³ã³ã¹ãã©ã¯ã¿ãæã€ãã¡ã€ã³ã¯ã©ã¹ãäœæããŠããŸãã ãã®ã¯ã©ã¹ã¯é»è©±çªå·ãè¡šããŠããŸãã
@Domain(valueType = String.class)
public class PhoneNumber {
private final String value;
public PhoneNumber(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public String getAreaCode() {
// ãã¡ã€ã³ã«åºæã®æ¯ãèããèšè¿°ã§ããã
...
}
}
ãã¡ã¯ããªã¡ãœããã§çæããæ¹æ³Â¶
ã³ã³ã¹ãã©ã¯ã¿ãprivateã«ããã¡ã¯ããªã¡ãœããã䜿ã£ãŠã€ã³ã¹ã¿ã³ã¹ãçæãããå Žåã¯ã staticãªéprivateãªã¡ãœãããå®çŸ©ã @Domain ã® factoryMethod èŠçŽ ã«ãã®ã¡ãœããã®ååãæå®ããŸãã 次ã®äŸã§ã¯ãpublicãªãã¡ã¯ããªã¡ãœããããã€ãã¡ã€ã³ã¯ã©ã¹ãäœæããŠããŸãã ãã®ã¯ã©ã¹ã¯é»è©±çªå·ãè¡šããŠããŸãã
@Domain(valueType = String.class, factoryMethod = "of")
public class PhoneNumber {
private final String value;
private PhoneNumber(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public String getAreaCode() {
// ãã¡ã€ã³ã«åºæã®æ¯ãèããèšè¿°ã§ããã
...
}
public static PhoneNumber of(String value) {
return new PhoneNumber(value);
}
}
次ã®äŸã§ã¯ã public ãªãã¡ã¯ããªã¡ãœããããã€åæåããã¡ã€ã³ã¯ã©ã¹ãšããŠäœæããŠããŸãã ãã®åæåã¯ä»äºã®çš®å¥ãè¡šããŠããŸãã
@Domain(valueType = String.class, factoryMethod = "of")
public enum JobType {
SALESMAN("10"),
MANAGER("20"),
ANALYST("30"),
PRESIDENT("40"),
CLERK("50");
private final String value;
private JobType(String value) {
this.value = value;
}
public static JobType of(String value) {
for (JobType jobType : JobType.values()) {
if (jobType.value.equals(value)) {
return jobType;
}
}
throw new IllegalArgumentException(value);
}
public String getValue() {
return value;
}
}
åãã©ã¡ãŒã¿ãå©çšããæ¹æ³Â¶
ãã¡ã€ã³ã¯ã©ã¹ã«ã¯ä»»æã®æ°ã®åãã©ã¡ãŒã¿ã宣èšã§ããŸãã 次ã®äŸã§ã¯ã1ã€ã®åãã©ã¡ãŒã¿ãæã¡ãããã« public ãªã³ã³ã¹ãã©ã¯ã¿ãæ〠ãã¡ã€ã³ã¯ã©ã¹ãäœæããŠããŸãã ãã®ã¯ã©ã¹ã¯èå¥åãè¡šããŠããŸãã
@Domain(valueType = int.class)
public class Identity<T> {
private final int value;
public Identity(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
åãã©ã¡ãŒã¿ãæã£ããã¡ã€ã³ã¯ã©ã¹ã¯ãã¡ã¯ããªã¡ãœããã§çæããããšãå¯èœã§ãã ãã®å Žåããã¡ã¯ããªã¡ãœããã«ã¯ã¯ã©ã¹ã®åå€æ°å®£èšãšåçã®å®£èšãå¿ èŠã§ãã
@Domain(valueType = int.class, factoryMethod = "of")
public class Identity<T> {
private final int value;
private Identity(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static <T> Identity<T> of(int value) {
return new Identity<T>(value);
}
}
å€éšãã¡ã€ã³Â¶
ãã¡ã€ã³ãšããŠæ±ããã察象ã®ã¯ã©ã¹ãšã¯å¥ã®ã¯ã©ã¹ã«å®çŸ©ãèšè¿°ããŸãã
å€éšãã¡ã€ã³ã¯ããœãŒã¹ã³ãŒãã«æãå ããããªãã Doma ãžäŸåãããããªãã ãšãã£ãçç±ãããå Žåã«æå¹ã§ãã å€éšãã¡ã€ã³ãå®çŸ©ããã«ã¯ã DomainConverter ã®å®è£ ã¯ã©ã¹ã« @ExternalDomain ã泚éããŠç€ºããŸãã
äŸãã°ã次ã®ãã㪠PhoneNumber ãšããã¯ã©ã¹ããããœãŒã¹ã³ãŒãã«æãå ããããªããšããŸãã
public class PhoneNumber {
private final String value;
public PhoneNumber(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public String getAreaCode() {
...
}
}
äžèšã® PhoneNumber ããã¡ã€ã³ã¯ã©ã¹ãšããŠæ±ãã«ã¯ã次ã®ãããªã¯ã©ã¹ãäœæããŸãã
@ExternalDomain
public class PhoneNumberConverter implements DomainConverter<PhoneNumber, String> {
public String fromDomainToValue(PhoneNumber domain) {
return domain.getValue();
}
public PhoneNumber fromValueToDomain(String value) {
if (value == null) {
return null;
}
return new PhoneNumber(value);
}
}
ããã§å€éšãã¡ã€ã³å®çŸ©ã¯å®æã§ãããããã ãã§ã¯ãŸã å©çšã§ããŸããã å€éšãã¡ã€ã³å®çŸ©ã @DomainConverters ãžç»é²ããŸãã @DomainConverters ã«ã¯è€æ°ã®å€éšãã¡ã€ã³å®çŸ©ãç»é²å¯èœã§ãã
@DomainConverters({ PhoneNumberConverter.class })
public class DomainConvertersProvider {
}
ãããŠæåŸã«ã @DomainConverters ã泚éãããã¯ã©ã¹ã®å®å šä¿®é£Ÿåã 泚éåŠç ã®ãªãã·ã§ã³ã«æå®ããŸãã ãªãã·ã§ã³ã®keyã¯ã doma.domain.converters ã§ãã
åãã©ã¡ãŒã¿ãå©çšããæ¹æ³Â¶
ä»»æã®æ°ã®åãã©ã¡ãŒã¿ãæã£ãã¯ã©ã¹ãæ±ããŸãã 次ã®äŸã®ãããª1ã€ã®åãã©ã¡ãŒã¿ãæã€ã¯ã©ã¹ããããšããŸãã ãã®ã¯ã©ã¹ã¯èå¥åãè¡šããŠããŸãã
public class Identity<T> {
private final int value;
public Identity(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
äžèšã® Identity ããã¡ã€ã³ã¯ã©ã¹ãšããŠæ±ãã«ã¯ã次ã®ãããªã¯ã©ã¹ãäœæããŸãã Identity ã®åãã©ã¡ãŒã¿ã«ã¯ã¯ã€ã«ãã«ãŒã ? ãæå®ããªããã°ãããŸããã
@ExternalDomain
public class IdentityConverter implements DomainConverter<Identity<?>, String> {
public String fromDomainToValue(Identity<?> domain) {
return domain.getValue();
}
@SuppressWarnings("rawtypes")
public Identity<?> fromValueToDomain(String value) {
if (value == null) {
return null;
}
return new Identity(value);
}
}
ãã®ä»ã®èšå®æ¹æ³ã«ã€ããŠã¯ãåãã©ã¡ãŒã¿ã䜿çšããªãå Žåãšåæ§ã§ãã
å©çšäŸÂ¶
ãã¡ã€ã³ã¯ã©ã¹ãåãã©ã¡ãŒã¿ãæã€å Žåãåãã©ã¡ãŒã¿ã«ã¯å ·äœçãªåãå¿ èŠã§ãã ã¯ã€ã«ãã«ãŒã ? ãåå€æ°ã®æå®ã¯ãµããŒããããŠããŸããã
@Entity
public class Employee {
@Id
Identity<Employee> employeeId;
String employeeName;
PhoneNumber phoneNumber;
JobType jobType;
@Version
Integer versionNo();
...
}
@Dao(config = AppConfig.class)
public interface EmployeeDao {
@Select
Employee selectById(Identity<Employee> employeeId);
@Select
Employee selectByPhoneNumber(PhoneNumber phoneNumber);
@Select
List<PhoneNumber> selectAllPhoneNumber();
@Select
Employee selectByJobType(JobType jobType);
@Select
List<JobType> selectAllJobTypes();
}
ãšã³ãã£ãã£ã¯ã©ã¹Â¶
ç®æ¬¡
EntityïŒãšã³ãã£ãã£ïŒã¯ãããŒã¿ããŒã¹ã®ããŒãã«ãã¯ãšãªã®çµæã»ããã«å¯Ÿå¿ããŸãã
ãšã³ãã£ãã£å®çŸ©Â¶
ãšã³ãã£ãã£ã¯ã©ã¹ã¯ @Entity ã泚éããŠç€ºããŸãã
@Entity
public class Employee {
...
}
ãšã³ãã£ãã£ãªã¹ããŒÂ¶
ãšã³ãã£ãã£ãããŒã¿ããŒã¹ã«å¯Ÿãæ¿å ¥ãæŽæ°ãåé€ãããçŽå/çŽåŸã«åŠçãå®è¡ãããå Žåã @Entity ã® listener èŠçŽ ã« EntityListener ã®å®è£ ã¯ã©ã¹ãæå®ã§ããŸãã
@Entity(listener = EmployeeEntityListener.class)
public class Employee {
...
}
listener èŠçŽ ã«äœãæå®ããªãå Žåããšã³ãã£ãã£ã¯ã©ã¹ãä»ã®ãšã³ãã£ãã£ã¯ã©ã¹ãç¶æ¿ ããŠãããã©ããã§æ¡çšããèšå®ãå€ãããŸãã
- ç¶æ¿ããŠããå Žåã芪ãšã³ãã£ãã£ã¯ã©ã¹ã®èšå®ãåŒãç¶ããŸã
- ç¶æ¿ããŠããªãå Žåãäœãè¡ããŸããïŒ NullEntityListener ã䜿çšãããŸãïŒ
ããŒãã³ã°èŠçŽÂ¶
ãšã³ãã£ãã£ã«å¯Ÿå¿ããããŒãã«åãããããã£ã«å¯Ÿå¿ããã«ã©ã åã解決ããããã®ããŒãã³ã°èŠçŽ ãå€æŽãããå Žåã naming èŠçŽ ã« NamingType ã®åæåãæå®ã§ããŸãã
@Entity(naming = NamingType.SNAKE_UPPER_CASE)
public class EmployeeInfo {
...
}
naming èŠçŽ ã«äœãæå®ããªãå Žåããšã³ãã£ãã£ã¯ã©ã¹ãä»ã®ãšã³ãã£ãã£ã¯ã©ã¹ãç¶æ¿ããŠãã ãã©ããã§æ¡çšããèšå®ãå€ãããŸãã
- ç¶æ¿ããŠããå Žåã芪ãšã³ã£ãã£ã¯ã©ã¹ã®èšå®ãåŒãç¶ããŸã
- ç¶æ¿ããŠããªãå Žåãäœãè¡ããŸããïŒ NamingType.NONE ã䜿çšãããŸãïŒ
NamingType.SNAKE_UPPER_CASE ã¯ããšã³ãã£ãã£åãããããã£åã ã¹ããŒã¯ã±ãŒã¹ïŒã¢ã³ããŒã¹ã³ã¢åºåãïŒã®å€§æåã«å€æããŸãã ãã®äŸã®å ŽåãããŒãã«åã¯EMPLOYEE_INFOã«ãªããŸãã
naming èŠçŽ ã«äœãæå®ããªãå Žåãããã©ã«ãã§ã¯ãããŒãã«åã«ã¯ãšã³ãã£ãã£ã¯ã©ã¹ã®åçŽåã ã«ã©ã åã«ã¯ããããã£åã䜿çšãããŸãã
ããŒãã³ã°èŠçŽã¯ã @Table ã @Colum ã® name èŠçŽ ãæå®ãããªãå Žåã®ã¿äœ¿çšãããŸãã @Table ã @Colum ã® name èŠçŽ ãæå®ãããå Žåã¯ã name èŠçŽ ã«æå®ããå€ã䜿çšãããããŒãã³ã°èŠçŽã¯é©çšãããŸããã
ã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£Â¶
ãšã³ãã£ãã£ãã€ãã¥ãŒã¿ãã«ãªãªããžã§ã¯ããšããŠæ±ãããå Žå㯠@Entity ã® immutable èŠçŽ ã« true ãèšå®ããŸãã
@Entity(immutable = true)
public class Employee {
@Id
final Integer id;
final String name;
@Version
final Integer version;
public Employee(Integer id, String name, Integer version) {
this.id = id;
this.name = name;
this.version = version;
}
}
æ°žç¶çãªãã£ãŒã«ãã«ã¯ final 修食åãå¿ é ã§ãã
ããŒãã«Â¶
ãšã³ãã£ãã£ã«å¯Ÿå¿ããããŒãã«æ å ±ãæå®ããã«ã¯ã @Table ã䜿çšããŸãã
name èŠçŽ ã§ããŒãã«åãæå®ã§ããŸãã
@Entity
@Table(name = "EMP")
public class Employee {
...
}
@Table ã䜿çšããªããããã㯠@Table ã® name èŠçŽ ã䜿çšããªãå Žåã ããŒãã«å㯠ããŒãã³ã°èŠçŽ ã«ãã解決ãããŸãã
ãã£ãŒã«ãå®çŸ©Â¶
ãšã³ãã£ãã£ã¯ã©ã¹ã®ãã£ãŒã«ãã¯ããã©ã«ãã§æ°žç¶çã§ãã ã€ãŸããããŒãã«ãçµæã»ããã®ã«ã©ã ã«å¯Ÿå¿ããŸãã ãã£ãŒã«ãã®åã¯æ¬¡ã®ããããã§ãªããã°ãããŸããã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãšã³ãã£ãã£ã¯ã©ã¹ ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
@Entity
public class Employee {
...
Integer employeeId;
}
ã«ã©ã ¶
ã«ã©ã æ å ±ãæå®ããã«ã¯ã @Column ã䜿çšããŸãã
name èŠçŽ ã§ã«ã©ã åãæå®ã§ããŸãã
@Column(name = "ENAME")
String employeeName;
insertable èŠçŽ ã updatable èŠçŽ ã§æ¿å ¥ãæŽæ°ã®å¯Ÿè±¡ãšãããã©ãããæå®ã§ããŸãã
@Column(insertable = false, updatable = false)
String employeeName;
@Column ã䜿çšããªããããã㯠@Column ã® name èŠçŽ ã䜿çšããªãå Žåã ã«ã©ã å㯠ããŒãã³ã°èŠçŽ ã«ãã解決ãããŸãã
èå¥å¶
èå¥å(äž»ããŒ)ã§ããããšãæå®ããã«ã¯ã @Id ã䜿ããŸãã
@Id
Integer id;
è€åäž»ããŒã®å Žå㯠@Id ãè€æ°æå®ããŸãã
@Id
Integer id;
@Id
Integer id2;
èå¥åã®èªåçæ¶
èå¥åãèªåçæããã«ã¯ @GeneratedValue ã泚éããŠç€ºããŸãã ãã£ãŒã«ãã®åã¯ä»¥äžã®ããããã§ãªããã°ãããŸããã
- java.lang.Number ã®ãµãã¿ã€ã
- java.lang.Number ã®ãµãã¿ã€ããå€ãšãã ãã¡ã€ã³ã¯ã©ã¹
- äžèšã®ãããããèŠçŽ ã®åãšãã java.util.Optional
- OptionalInt
- OptionalLong
- OptionalDouble
- æ°å€ã®ããªããã£ãå
IDENTITYã䜿ã£ãèå¥åã®èªåçæ¶
ããŒã¿ããŒã¹ã®IDENTITYèªåçææ©èœãå©çšããæ¹æ³ã§ãã RDBMSã«ãã£ãŠã¯ãµããŒããããŠããŸããã ãã£ãŒã«ãã«å¯Ÿå¿ããã«ã©ã ã®å®çŸ©ã§IDENTITYèªåçæãæå¹ã«ããŠããå¿ èŠããããŸãã
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
ã·ãŒã±ã³ã¹ã䜿ã£ãèå¥åã®èªåçæ¶
ããŒã¿ããŒã¹ã®ã·ãŒã±ã³ã¹ãå©çšããæ¹æ³ã§ãã RDBMSã«ãã£ãŠã¯ãµããŒããããŠããŸããã
@SequenceGenerator ã§ã¯ãã·ãŒã±ã³ã¹ã®ååãå²ãåœãŠãµã€ãºãåæå€çãèšå®ã§ããŸãã ããŒã¿ããŒã¹ã«ãããããã·ãŒã±ã³ã¹ãå®çŸ©ããŠããå¿ èŠããããŸããã ãã®å®çŸ©ã¯ @SequenceGenerator ã®å®çŸ©ãšããããŠããå¿ èŠããããŸãã
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(sequence = "EMPLOYEE_SEQ")
Integer id;
ããŒãã«ã䜿ã£ãèå¥åã®èªåæ¡çªÂ¶
çæãããèå¥åãããŒãã«ã§ç®¡çããæ¹æ³ã§ãã ãã¹ãŠã®RDBMSã§å©çšã§ããŸãã
@TableGenerator ã§ã¯ãããŒãã«åãå²ãåœãŠãµã€ãºãåæå€çãèšå®ã§ããŸãã ããŒã¿ããŒã¹ã«ãããããããŒãã«ãå®çŸ©ããŠããå¿ èŠããããŸããã ãã®å®çŸ©ã¯ @TableGenerator ã®å®çŸ©ãšããããŠããå¿ èŠããããŸãã ããã©ã«ãã§ã¯ã ID_GENERATOR ãšããååã®ããŒãã«ã«ãæåååã® PK ãšæ°å€åã® VALUE ãšãã2ã€ã®ã«ã©ã ãå®çŸ©ãããŠãããã®ãšããŠåäœããŸãïŒ PK ã«ã©ã ãäž»ããŒã§ãïŒã PK ã«ã©ã ã«ã¯ãšã³ãã£ãã£ã¯ã©ã¹ããšã®äžæãªååã VALUE ã«ã©ã ã«ã¯èå¥åã®å€ãæ ŒçŽãããŸãã ããŒãã«ã«ã¯ããšã³ãã£ãã£ã¯ã©ã¹ããšã®ã¬ã³ãŒãããããããç»é²ããŠããå¿ èŠããããŸãã
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@TableGenerator(pkColumnValue = "EMPLOYEE_ID")
Integer id;
@TableGenerator ã® pkColumnValue èŠçŽ ã«ã¯ã èå¥åã管çããããŒãã« ïŒããã©ã«ãã§ã¯ã ID_GENERATOR ãšããååã®ããŒãã«ïŒã®äž»ããŒã®å€ãæå®ããŸãã
ããŒãžã§ã³Â¶
楜芳çæä»å¶åŸ¡çšã®ããŒãžã§ã³ã¯ @Version ã泚éããŠç€ºããŸãã ãã£ãŒã«ãã®åã¯ä»¥äžã®ããããã§ãªããã°ãããŸããã
- java.lang.Number ã®ãµãã¿ã€ã
- java.lang.Number ã®ãµãã¿ã€ããå€ãšãã ãã¡ã€ã³ã¯ã©ã¹
- äžèšã®ãããããèŠçŽ ã®åãšãã java.util.Optional
- OptionalInt
- OptionalLong
- OptionalDouble
- æ°å€ã®ããªããã£ãå
@Version
Integer version;
éæ°žç¶çãªãã£ãŒã«ã¶
éæ°žç¶çãªãã£ãŒã«ãã¯ãããŒãã«ãçµæã»ããã®ã«ã©ã ã«å¯Ÿå¿ããŸããã
@Transient ã泚éããŠç€ºããŸãã
ãã£ãŒã«ãã®åãå¯èŠæ§ã«å¶éã¯ãããŸããã
@Transient
List<String> nameList;
ååŸæã®ç¶æ ã管çãããã£ãŒã«ã¶
ååŸæã®ç¶æ ãšã¯ããšã³ãã£ãã£ãDaoããååŸãããšãã®å šããããã£ã®å€ã§ãã ååŸæã®ç¶æ ãä¿æããŠããããšã§ãæŽæ°åŠçãå®è¡ããéãUPDATEæã®SETå¥ã«å€æŽãããã£ãŒã«ãã®ã¿ãå«ããããŸãã ååŸæã®ç¶æ ã管çãããã£ãŒã«ãã¯ãããŒãã«ãçµæã»ããã®ã«ã©ã ã«å¯Ÿå¿ããŸããã
@OriginalStates ã泚éããŠç€ºããŸãã
@OriginalStates
Employee originalStates;
ã¡ãœããå®çŸ©Â¶
ã¡ãœããã®å®çŸ©ã«å¶éã¯ãããŸããã
ãã£ãŒã«ãã®å¯èŠæ§ã protected ãããã±ãŒãžãã©ã€ããŒãã«ã㊠public ãªã¡ãœããçµç±ã§ ã¢ã¯ã»ã¹ããããšããã¡ãœãããäžå䜿çšãã public ãã£ãŒã«ãã«çŽæ¥ã¢ã¯ã»ã¹ããããš ãã©ã¡ãããµããŒããããŠããŸãã
Daoã€ã³ã¿ãã§ãŒã¹Â¶
Data Access Object ïŒDaoïŒ ã¯ããŒã¿ããŒã¹ã¢ã¯ã»ã¹ã®ããã®ã€ã³ã¿ãã§ãŒã¹ã§ãã
Daoå®çŸ©Â¶
Dao㯠@Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ãšããŠå®çŸ©ããŸãã
ã€ã³ã¿ãã§ãŒã¹ã®å®è£ ã¯ã©ã¹ã¯aptã«ããã³ã³ãã€ã«æã«èªåçæãããŸãã
ã¯ãšãªå®çŸ©Â¶
ã¢ãããŒã·ã§ã³ã䜿ã£ãŠ ã¯ãšãª ãå®çŸ©ã§ããŸãã
Javaã³ãŒãã§ä»»æã®ã¯ãšãªãçµã¿ç«ãŠãã«ã¯ ããã©ã«ãã¡ãœãã ã®äžã§ ã¯ãšãªãã«ã ã䜿çšããŠãã ããã
ããã©ã«ãã¡ãœãã¶
ããã©ã«ãã¡ãœããã§ã¯ä»»æã®åŠçãèšè¿°ã§ããŸãã
Config.get ã«Daoã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ããšDaoã«é¢é£ã¥ãããã Config ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãã
@Dao(config = AppConfig.class)
public interface EmployeeDao {
default int count() {
Config config = Config.get(this);
SelectBuilder builder = SelectBuilder.newInstance(config);
builder.sql("select count(*) from employee");
return builder.getScalarSingleResult(int.class);
}
}
å©çšäŸÂ¶
ã³ã³ãã€ã«ãããšæ³šéåŠçã«ããå®è£ ã¯ã©ã¹ãçæãããŸãã å®è£ ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããŠäœ¿çšããŠãã ããã ãã ããèšå®ã¯ã©ã¹ãDIã³ã³ããã§ç®¡çããå Žåãã€ã³ã¹ã¿ã³ã¹åã¯DIã³ã³ããã§å¶åŸ¡ããŠãã ããã
EmployeeDao employeeDao = new EmployeeDaoImpl();
Employee employee = employeeDao.selectById(1);
ããã©ã«ãã§ã¯ãå®è£ ã¯ã©ã¹ã®ååã¯ã€ã³ã¿ãã§ãŒã¹ã®ååã« Impl ããµãã£ãã¯ã¹ãããã®ã«ãªããŸãã ããã±ãŒãžããµãã£ãã¯ã¹ãå€æŽããã«ã¯ 泚éåŠç ãåç §ããŠãã ããã
ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ã䜿çšããå Žåã¯ã @Dao ã® config èŠçŽ ã«æå®ããèšå®ã«ãã DataSource ã決å®ãããŸããã ç¹å®ã® DataSource ãæå®ããŠã€ã³ã¹ã¿ã³ã¹åããããšãå¯èœã§ãã
DataSource dataSource = ...;
EmployeeDao employeeDao = new EmployeeDaoImpl(dataSource);
Employee employee = employeeDao.selectById(1);
ãŸãåæ§ã«ã Connection ãæå®ããŠã€ã³ã¹ã¿ã³ã¹åããããšãå¯èœã§ãã
Connection connection = ...;
EmployeeDao employeeDao = new EmployeeDaoImpl(connection);
Employee employee = employeeDao.selectById(1);
Daoã€ã³ã¿ãã§ãŒã¹ã¯ãšã³ãã£ãã£ã¯ã©ã¹ãš1察1ã§çµã³ã€ããŠããããã§ã¯ãããŸããã ã²ãšã€ã®Daoã€ã³ã¿ãã§ãŒã¹ã§è€æ°ã®ãšã³ãã£ãã£ã¯ã©ã¹ãæ±ããŸãã
@Dao(config = AppConfig.class)
public interface MyDao {
@Select
Employee selectEmployeeById(int id);
@Select
Department selectDepartmentByName(String name);
@Update
int updateAddress(Address address);
}
ã¯ãšãªÂ¶
æ€çŽ¢Â¶
ç®æ¬¡
- æ€çŽ¢
- åãåããæ¡ä»¶
- 1件æ€çŽ¢
- è€æ°ä»¶æ€çŽ¢
- ã¹ããªãŒã æ€çŽ¢
- ã³ã¬ã¯ãæ€çŽ¢
- æ€çŽ¢ãªãã·ã§ã³ãå©çšããæ€çŽ¢
- æ€çŽ¢çµæã®ä¿èšŒ
- æ€çŽ¢çµæã®ãããã³ã°ã®ä¿èšŒ
- ã¯ãšãªã¿ã€ã ã¢ãŠã
- ãã§ãããµã€ãº
- æ倧è¡æ°
- ãããã®ããŒã®ããŒãã³ã°èŠçŽ
- SQL ã®ãã°åºå圢åŒ
æ€çŽ¢ãè¡ãã«ã¯ã @Select ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Select
List<Employee> selectByDepartmentName(String departmentName);
...
}
æ€çŽ¢ã§ã¯ã SQLãã¡ã€ã«ãå¿ é ã§ãã æ€çŽ¢ç³»ã®SQLãèªåçæããæ©èœã¯ãããŸããã
ããŒã
ãšã³ãã£ãã£ã¯ã©ã¹ãå©çšããå Žåããšã³ãã£ãã£ã¯ã©ã¹ã¯ æ€çŽ¢çµæã«å¿ã㊠äœæããå¿ èŠããããŸãã ããšãã°ãEMPLOYEEããŒãã«ã«å¯Ÿå¿ããEmployeeãšã³ãã£ãã£ã¯ã©ã¹ãå®çŸ©ãããŠããå Žåã EMPLOYEEããŒãã«ã®ã«ã©ã ãå«ãçµæã»ããã¯Employeeãšã³ãã£ãã£ã¯ã©ã¹ã§åããããŸããã EMPLOYEEããŒãã«ãšDEPARTMENTããŒãã«ãçµåããŠåŸãããçµæã»ããã«å¯ŸããŠã¯ã Employeeãšã³ãã£ãã£ã¯ã©ã¹ãšã¯å¥ã®ã¯ã©ã¹ïŒããšãã°EmployeeDepartmentã¯ã©ã¹ïŒãå¿ èŠã§ãã
åãåããæ¡ä»¶Â¶
åãåããæ¡ä»¶ã«ã¯ã¡ãœããã®ãã©ã¡ãŒã¿ã䜿çšããŸãã å©çšã§ãããã©ã¡ãŒã¿ã®åã¯ä»¥äžã®ãã®ã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ä»»æã®å
- åºæ¬å ã ãã¡ã€ã³ã¯ã©ã¹ ãä»»æã®åãèŠçŽ ãšããjava.util.Optional
- åºæ¬å ã ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Iterable
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
ãã©ã¡ãŒã¿ã®æ°ã«å¶éã¯ãããŸããã ãã©ã¡ãŒã¿ã®åã åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
åºæ¬åããã¡ã€ã³ã¯ã©ã¹ã䜿ã£ãåãåãã¶
ã¡ãœããããã©ã¡ãŒã¿ã« åºæ¬å ã ãã¡ã€ã³ã¯ã©ã¹ ãå®çŸ©ããŸãã
@Select
List<Employee> selectByNameAndSalary(String name, Salary salary);
SQLãã¡ã€ã«ã§ã¯SQLã³ã¡ã³ãã䜿ãã¡ãœããã®ãã©ã¡ãŒã¿ãSQLã«ãããã³ã°ãããŸãã SQLã³ã¡ã³ãã§ã¯ã¡ãœããã®ãã©ã¡ãŒã¿åãåç §ããŸãã
select * from employee where employee_name = /* name */'hoge' and salary > /* salary */100
ä»»æã®åã䜿ã£ãåãåãã¶
ã¡ãœããã®ãã©ã¡ãŒã¿ã«ä»»æã®åã䜿çšããå Žåã¯ãããã . ã§ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ãããã¡ãœãããåŒã³åºããªã©ããŠSQLã«ãããã³ã°ãããŸãã
@Select
List<Employee> selectByExample(Employee employee);
select * from employee where employee_name = /* employee.name */'hoge' and salary > /* employee.getSalary() */100
ãã©ã¡ãŒã¿ã¯è€æ°æå®ã§ããŸãã
@Select
List<Employee> selectByEmployeeAndDepartment(Employee employee, Department department);
Iterableã䜿ã£ãINå¥ãžã®ãããã³ã°Â¶
java.lang.Iterable ã®ãµãã¿ã€ãã¯ã INå¥ãå©çšããæ€çŽ¢ãè¡ãå Žåã«äœ¿çšããŸãã
@Select
List<Employee> selectByNames(List<String> names);
select * from employee where employee_name in /* names */('aaa','bbb','ccc')
1件æ€çŽ¢Â¶
1件ãæ€çŽ¢ããã«ã¯ãã¡ãœããã®æ»ãå€ã®åã次ã®ããããã«ããŸãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ã ãã¡ã€ã³ã¯ã©ã¹ ã ãšã³ãã£ãã£ã¯ã©ã¹ ã java.util.Map<String, Object> ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
@Select
Employee selectByNameAndSalary(String name, BigDecimal salary);
æ»ãå€ã®åã Optional ã§ãªãããã€ãçµæã0件ã®ãšã㯠null ãè¿ãããŸãã æ€çŽ¢çµæã®ä¿èšŒ ãæå¹ã«ããå Žåã¯ãæ»ãå€ã®åã«é¢ä¿ãªãçµæã0件ãªãã°äŸå€ãã¹ããŒãããŸãã
çµæã2件以äžååšãããšãã¯ã NonUniqueResultException ãã¹ããŒãããŸãã
è€æ°ä»¶æ€çŽ¢Â¶
è€æ°ä»¶ãæ€çŽ¢ããã«ã¯ãã¡ãœããã®æ»ãå€ã®åã java.util.List ã«ããŸãã List ã®èŠçŽ ã®åã«ã¯æ¬¡ã®ãã®ã䜿çšã§ããŸãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
@Select
List<Employee> selectByNameAndSalary(String name, Salary salary);
çµæã0件ã®ãšã㯠null ã§ã¯ãªã空ã®Listãè¿ãããŸãã ãã ãã æ€çŽ¢çµæã®ä¿èšŒ ãæå¹ã«ããå Žåãçµæã0件ãªãã°äŸå€ãã¹ããŒãããŸãã
ã¹ããªãŒã æ€çŽ¢Â¶
å šä»¶ãäžåºŠã« java.util.List ã§åãåãã®ã§ã¯ãªã java.util.stream.Stream ã§æ±ãããå Žåã¯ãã¹ããªãŒã æ€çŽ¢ãå©çšã§ããŸãã
ã¹ããªãŒã æ€çŽ¢ãå®æœããã«ã¯ã @Select ã® strategy èŠçŽ ã« SelectType.STREAM ãèšå®ãã ã¡ãœããã®ãã©ã¡ãŒã¿ã« java.util.Function<Stream<TARGET>, RESULT> ããã㯠java.util.Function<Stream<TARGET>, RESULT> ã®ãµãã¿ã€ããå®çŸ©ããŸãã
@Select(strategy = SelectType.STREAM)
BigDecimal selectByNameAndSalary(String name, BigDecimal salary, Function<Stream<Employee>, BigDecimal> mapper);
åŒã³åºãå ã¯ã¹ããªãŒã ãåãåã£ãŠçµæãè¿ãã©ã ãåŒãæž¡ããŸãã
EmployeeDao dao = new EmployeeDao();
BigDecimal result = dao.selectByNameAndSalary(name, salary, stream -> {
return ...;
});
Function<Stream<TARGET>, RESULT> ã®åãã©ã¡ãŒã¿ TARGET ã¯æ¬¡ã®ããããã§ãªããã°ãããŸããã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åãã©ã¡ãŒã¿ RESULT ã¯Daoã®ã¡ãœããã®æ»ãå€ã«åãããªããã°ãããŸããã
æ€çŽ¢çµæã®ä¿èšŒ ãæå¹ã«ããå Žåãçµæã0件ãªãã°äŸå€ãã¹ããŒãããŸãã
ã³ã¬ã¯ãæ€çŽ¢Â¶
æ€çŽ¢çµæã java.util.Collector ã§åŠçãããå Žåã¯ãã³ã¬ã¯ãæ€çŽ¢ãå©çšã§ããŸãã
ã³ã¬ã¯ãæ€çŽ¢ãå®æœããã«ã¯ã @Select ã® strategy èŠçŽ ã« SelectType.COLLECT ãèšå®ãã ã¡ãœããã®ãã©ã¡ãŒã¿ã« java.stream.Collector<TARGET, ACCUMULATION, RESULT> ããã㯠java.stream.Collector<TARGET, ?, RESULT> ã®ãµãã¿ã€ããå®çŸ©ããŸãã
@Select(strategy = SelectType.COLLECT)
<RESULT> RESULT selectBySalary(BigDecimal salary, Collector<Employee, ?, RESULT> collector);
åŒã³åºãå 㯠Collector ã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
Map<Integer, List<Employee>> result =
dao.selectBySalary(salary, Collectors.groupingBy(Employee::getDepartmentId));
Collector<TARGET, ACCUMULATION, RESULT> ã®åãã©ã¡ãŒã¿ TARGET ã¯æ¬¡ã®ããããã§ãªããã°ãããŸããã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åãã©ã¡ãŒã¿ RESULT ã¯Daoã®ã¡ãœããã®æ»ãå€ã«åãããªããã°ãããŸããã
æ€çŽ¢çµæã®ä¿èšŒ ãæå¹ã«ããå Žåãçµæã0件ãªãã°äŸå€ãã¹ããŒãããŸãã
ããŒã
ã³ã¬ã¯ãæ€çŽ¢ã¯ã¹ããªãŒã æ€çŽ¢ã®ã·ã§ãŒãã«ããã§ãã ã¹ããªãŒã æ€çŽ¢ã§åŸããã Stream ãªããžã§ã¯ãã® collect ã¡ãœããã䜿ã£ãŠåçã®ããšãã§ããŸãã
æ€çŽ¢ãªãã·ã§ã³ãå©çšããæ€çŽ¢Â¶
æ€çŽ¢ãªãã·ã§ã³ãè¡šã SelectOptions ã䜿çšããããšã§ãSELECTæãèšè¿°ãããSQLãã¡ã€ã«ãããŒã¹ã«ãã ããŒãžã³ã°åŠçãæ²èŠ³çæä»å¶åŸ¡çšã®SQLãèªåã§çæã§ããŸãã
SelectOptions ã¯ã 1件æ€çŽ¢ ã è€æ°ä»¶æ€çŽ¢ ã ã¹ããªãŒã æ€çŽ¢ ãšçµã¿åãããŠäœ¿çšããŸãã
SelectOptions ã¯ãDaoã®ã¡ãœããã®ãã©ã¡ãŒã¿ãšããŠå®çŸ©ããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Select
List<Employee> selectByDepartmentName(String departmentName, SelectOptions options);
...
}
SelectOptions ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãstatic㪠get ã¡ãœããã«ããååŸã§ããŸãã
SelectOptions options = SelectOptions.get();
ããŒãžã³ã°Â¶
SelectOptions ã® offset ã¡ãœããã§éå§äœçœ®ã limit ã¡ãœããã§ååŸä»¶æ°ãæå®ãã SelectOptions ã®ã€ã³ã¹ã¿ã³ã¹ãDaoã®ã¡ãœããã«æž¡ããŸãã
SelectOptions options = SelectOptions.get().offset(5).limit(10);
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);
ããŒãžã³ã°ã¯ããã¡ã€ã«ã«èšè¿°ãããŠãããªãªãžãã«ã®SQLãæžãæãå®è¡ããããšã§å®çŸãããŠããŸãã ãªãªãžãã«ã®SQLã¯æ¬¡ã®æ¡ä»¶ãæºãããŠããªããã°ãããŸããã
- SELECTæã§ãã
- æäžäœã®ã¬ãã«ã§UNIONãEXCEPTãINTERSECTçã®éåæŒç®ãè¡ã£ãŠããªãïŒãµãã¯ãšãªã§å©çšããŠããå Žåã¯å¯ïŒ
- ããŒãžã³ã°åŠçãå«ãã§ããªã
ããã«ãããŒã¿ããŒã¹ã®æ¹èšã«ãã£ãŠã¯ç¹å®ã®æ¡ä»¶ãæºãããŠããªããã°ãããŸããã
Dialect | æ¡ä»¶ |
---|---|
Db2Dialect | offsetãæå®ããå ŽåãORDER BYå¥ãæã¡ORDER BYå¥ã§æå®ãã ã«ã©ã ãã¹ãŠãSELECTå¥ã«å«ãã§ãã |
Mssql2008Dialect | offsetãæå®ããå ŽåãORDER BYå¥ãæã¡ORDER BYå¥ã§æå®ãã ã«ã©ã ãã¹ãŠãSELECTå¥ã«å«ãã§ãã |
StandardDialect | ORDER BYå¥ãæã¡ORDER BYå¥ã§æå®ãã ã«ã©ã ãã¹ãŠãSELECTå¥ã«å«ãã§ãã |
æ²èŠ³çæä»å¶åŸ¡Â¶
SelectOptions ã® forUpdate ã¡ãœããã§æ²èŠ³çæä»å¶åŸ¡ãè¡ãããšã瀺ãã SelectOptionsã®ã€ã³ã¹ã¿ã³ã¹ãDaoã®ã¡ãœããã«æž¡ããŸãã
SelectOptions options = SelectOptions.get().forUpdate();
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);
SelectOptions ã«ã¯ãããã¯å¯Ÿè±¡ã®ããŒãã«ãã«ã©ã ã®ãšã€ãªã¢ã¹ãæå®ã§ãã forUpdate ã¡ãœãããã ããã¯ã®ååŸãåŸ æ©ããªã forUpdateNowait ãªã©ãååã forUpdate ã§å§ãŸãæ²èŠ³çæä»å¶åŸ¡çšã®ã¡ãœãããçšæãããŠããŸãã
æ²èŠ³çæä»å¶åŸ¡ã¯ããã¡ã€ã«ã«èšè¿°ãããŠãããªãªãžãã«ã®SQLãæžãæããŠå®è¡ããŠããŸãã ãªãªãžãã«ã®SQLã¯æ¬¡ã®æ¡ä»¶ãæºãããŠããªããã°ãããŸããã
- SELECTæã§ãã
- æäžäœã®ã¬ãã«ã§UNIONãEXCEPTãINTERSECTçã®éåæŒç®ãè¡ã£ãŠããªãïŒãµãã¯ãšãªã§å©çšããŠããå Žåã¯å¯ïŒ
- æ²èŠ³çæä»å¶åŸ¡ã®åŠçãå«ãã§ããªã
ããŒã¿ããŒã¹ã®æ¹èšã«ãã£ãŠã¯ãæ²èŠ³çæä»å¶åŸ¡çšã®ã¡ãœããã®ãã¹ãŠãããã¯äžéšã䜿çšã§ããŸããã
Dialect | 説æ |
---|---|
Db2Dialect | forUpdate()ã䜿çšã§ãã |
H2Dialect | forUpdate()ã䜿çšã§ãã |
HsqldbDialect | forUpdate()ã䜿çšã§ãã |
Mssql2008Dialect | forUpdate()ãšforUpdateNoWait()ã䜿çšã§ããã ãã ãããªãªãžãã«ã®SQLã®FROMå¥ã¯1ã€ã®ããŒãã«ã ãããæããã°ãªããªãã |
MysqlDialect | forUpdate()ã䜿çšã§ãã |
OracleDialect | forUpdate()ãforUpdate(String... aliases)ã forUpdateNowait()ãforUpdateNowait(String... aliases)ã forUpdateWait(int waitSeconds)ã forUpdateWait(int waitSeconds, String... aliases)ã䜿çšã§ãã |
PostgresDialect | forUpdate()ãšforUpdate(String... aliases)ã䜿çšã§ãã |
StandardDialect | æ²èŠ³çæä»å¶åŸ¡çšã®ã¡ãœãããã¹ãŠã䜿çšã§ããªã |
éèšÂ¶
SelectOptions ã® count ã¡ãœãããåŒã³åºãããšã§éèšä»¶æ°ãååŸã§ããããã«ãªããŸãã éåžžãããŒãžã³ã°ã®ãªãã·ã§ã³ãšçµã¿åãããŠäœ¿çšããããŒãžã³ã°ã§çµã蟌ãŸãªãå Žåã®å šä»¶æ°ãååŸããå Žåã«äœ¿ããŸãã
SelectOptions options = SelectOptions.get().offset(5).limit(10).count();
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);
long count = options.getCount();
éèšä»¶æ°ã¯ãDaoã®ã¡ãœããåŒåºãåŸã« SelectOptions ã® getCount ã¡ãœããã䜿ã£ãŠååŸããŸãã ã¡ãœããåŒã³åºãã®åã« count ã¡ãœãããå®è¡ããŠããªãå Žåã getCount ã¡ãœãã㯠- 1ãè¿ããŸãã
æ€çŽ¢çµæã®ä¿èšŒÂ¶
æ€çŽ¢çµæã1件以äžååšããããšãä¿èšŒãããå Žåã¯ã @Select ã® ensureResult èŠçŽ ã« true ãæå®ããŸãã
@Select(ensureResult = true)
Employee selectById(Integer id);
æ€çŽ¢çµæã0件ãªãã° NoResultException ãã¹ããŒãããŸãã
æ€çŽ¢çµæã®ãããã³ã°ã®ä¿èšŒÂ¶
ãšã³ãã£ãã£ã®ããããã£ãã¹ãŠã«å¯ŸããŠæŒããªãçµæã»ããã®ã«ã©ã ããããã³ã°ããããšãä¿èšŒãããå Žåã¯ã @Select ã® ensureResultMapping èŠçŽ ã« true ãæå®ããŸãã
@Select(ensureResultMapping = true)
Employee selectById(Integer id);
çµæã»ããã®ã«ã©ã ã«ãããã³ã°ãããªãããããã£ãååšããå Žå ResultMappingException ãã¹ããŒãããŸãã
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@Select ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@Select(queryTimeout = 10)
List<Employee> selectAll();
å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
ãã§ãããµã€ãºÂ¶
@Select ã® fetchSize èŠçŽ ã«ãã§ãããµã€ãºãæå®ã§ããŸãã
@Select(fetchSize = 20) List<Employee> selectAll();
å€ãæå®ããªãå Žåã èšå® ã«æå®ããããã§ãããµã€ãºã䜿çšãããŸãã
æ倧è¡æ°Â¶
@Select ã® maxRows èŠçŽ ã«æ倧è¡æ°ãæå®ã§ããŸãã
@Select(maxRows = 100)
List<Employee> selectAll();
å€ãæå®ããªãå Žåã èšå® ã«æå®ãããæ倧è¡æ°ã䜿çšãããŸãã
ãããã®ããŒã®ããŒãã³ã°èŠçŽÂ¶
æ€çŽ¢çµæã java.util.Map<String, Object> ã«ãããã³ã°ããå Žåã @Select ã® mapKeyNaming èŠçŽ ã«ãããã®ããŒã®ããŒãã³ã°èŠçŽãæå®ã§ããŸãã
@Select(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
List<Map<String, Object>> selectAll();
MapKeyNamingType.CAMEL_CASE ã¯ãã«ã©ã åããã£ã¡ã«ã±ãŒã¹ã«å€æããããšã瀺ããŸãã ãã®ã»ãã«ã«ã©ã åã倧æåãå°æåã«å€æããèŠçŽããããŸãã
æçµçãªå€æçµæã¯ãããã«æå®ããå€ãš èšå® ã«æå®ããã MapKeyNaming ã®å®è£ ã«ãã決ãŸããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Select ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Select(sqlLog = SqlLogType.RAW)
List<Employee> selectById(Integer id);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
æ¿å ¥Â¶
ç®æ¬¡
æ¿å ¥ãè¡ãã«ã¯ã @Insert ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Insert
int insert(Employee employee);
@Insert
Result<ImmutableEmployee> insert(ImmutableEmployee employee);
}
ããã©ã«ãã§ã¯ãINSERTæãèªåçæãããŸãã @Insert ã® sqlFile èŠçŽ ã« true ãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã® ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããå Žåã æ¿å ¥ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preInsert ã¡ãœãããåŒã³åºãããŸãã ãŸããæ¿å ¥ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postInsert ã¡ãœãããåŒã³åºãããŸãã
æ»ãå€Â¶
ãã©ã¡ãŒã¿ãã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£ã¯ã©ã¹ã®å Žåã æ»ãå€ã¯ãã®ãšã³ãã£ãã£ã¯ã©ã¹ãèŠçŽ ãšãã org.seasar.doma.Result ã§ãªããã°ãããŸããã
äžèšã®æ¡ä»¶ãæºãããªããªãå Žåãæ»ãå€ã¯æŽæ°ä»¶æ°ãè¡šã int ã§ãªããã°ãããŸããã
SQLã®èªåçæã«ããæ¿å ¥Â¶
ãã©ã¡ãŒã¿ã®åã¯ãšã³ãã£ãã£ã¯ã©ã¹ã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯nullã§ãã£ãŠã¯ãããŸããã
@Insert
int insert(Employee employee);
@Insert
Result<ImmutableEmployee> insert(ImmutableEmployee employee);
èå¥å¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã®èå¥åã«ã @GeneratedValue ã泚éãããŠããå Žåã èå¥åãèªåçã«çæããèšå®ãããŸãã
ããŒãžã§ã³çªå·Â¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã« @Version ã泚éãããããããã£ãããå Žåã ãã®ããããã£ã«æ瀺çã« 1 以äžã®å€ãèšå®ãããŠããã°ãã®å€ã䜿çšããŸãã ããèšå®ãããŠããªããã 0 以äžã®å€ãèšå®ãããŠããã° 1 ãèªåã§èšå®ããŸãã
æ¿å ¥å¯Ÿè±¡ããããã£ã®å¶åŸ¡Â¶
insertable¶
ãšã³ãã£ãã£ã¯ã©ã¹ã« @Column ã泚éãããããããã£ãããå Žåã @Column ã® insertable èŠçŽ ã false ã®ãã®ã¯æ¿å ¥å¯Ÿè±¡å€ã§ãã
exclude¶
@Insert ã® exclude èŠçŽ ã«æå®ãããããããã£ãæ¿å ¥å¯Ÿè±¡å€ãšããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããã°ã @Column ã® insertable èŠçŽ ã true ã§ãã£ãŠãæ¿å ¥å¯Ÿè±¡å€ã§ãã
@Insert(exclude = {"name", "salary"})
int insert(Employee employee);
include¶
@Insert ã® include èŠçŽ ã«æå®ãããããããã£ã®ã¿ãæ¿å ¥å¯Ÿè±¡ãšããŸãã @Insert ã® include èŠçŽ ãš exclude èŠçŽ ã®äž¡æ¹ã«åãããããã£ãæå®ãããå Žåã ãã®ããããã£ã¯æ¿å ¥å¯Ÿè±¡å€ã«ãªããŸãã
ããããã£ããã®èŠçŽ ã«æå®ãããŠããŠãã @Column ã® insertable èŠçŽ ã false ã§ããã°æ¿å ¥å¯Ÿè±¡å€ã§ãã
@Insert(include = {"name", "salary"})
int insert(Employee employee);
excludeNull¶
@Insert ã® excludeNull èŠçŽ ã true ã®å Žåã å€ã null ã®ããããã£ãæ¿å ¥å¯Ÿè±¡å€ãšããŸãã ãã®èŠçŽ ã true ã®å Žåã @Column ã® insertable èŠçŽ ã true ã§ãã£ããã @Insert ã® include èŠçŽ ã«ããããã£ãæå®ãããŠããŠããå€ã null ã§ããã°æ¿å ¥å¯Ÿè±¡å€ã§ãã
@Insert(excludeNull = true)
int insert(Employee employee);
SQLãã¡ã€ã«ã«ããæ¿å ¥Â¶
SQLãã¡ã€ã«ã«ããæ¿å ¥ãè¡ãã«ã¯ã @Insert ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
ãã©ã¡ãŒã¿ã«ã¯ä»»æã®åã䜿çšã§ããŸãã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã«å¶éã¯ãããŸããã ãã©ã¡ãŒã¿ã®åãåºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Insert(sqlFile = true)
int insert(Employee employee);
@Insert(sqlFile = true)
Result<ImmutableEmployee> insert(ImmutableEmployee employee);
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
insert into employee (id, name, salary, version)
values (/* employee.id */0,
/* employee.name */'hoge',
/* employee.salary */100,
/* employee.version */0)
SQLãã¡ã€ã«ã«ããæ¿å ¥ã§ã¯ãèå¥åã®èªåèšå®ãããŒãžã§ã³çªå·ã®èªåèšå®ã¯è¡ãããŸããã ãŸãã @Insert ã® exclude èŠçŽ ã include èŠçŽ ã excludeNull èŠçŽ ã¯åç §ãããŸããã
äžæå¶çŽéå¶
äžæå¶çŽéåãçºçããå Žåã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªã UniqueConstraintException ãã¹ããŒãããŸãã
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@Insert ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@Insert(queryTimeout = 10)
int insert(Employee employee);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Insert ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Insert(sqlLog = SqlLogType.RAW)
int insert(Employee employee);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
æŽæ°Â¶
ç®æ¬¡
æŽæ°ãè¡ãã«ã¯ã @Update ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Update
int update(Employee employee);
@Update
Result<ImmutableEmployee> update(ImmutableEmployee employee);
}
ããã©ã«ãã§ã¯ãUPDATEæãèªåçæãããŸãã @Update ã® sqlFile ã«trueãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã®ãšã³ãã£ãã£ã¯ã©ã¹ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããå Žåã æŽæ°ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preUpdate ã¡ãœãããåŒã³åºãããŸãã ãŸããæŽæ°ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postUpdate ã¡ãœãããåŒã³åºãããŸãã
æ»ãå€Â¶
ãã©ã¡ãŒã¿ãã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£ã¯ã©ã¹ã®å Žåã æ»ãå€ã¯ãã®ãšã³ãã£ãã£ã¯ã©ã¹ãèŠçŽ ãšãã org.seasar.doma.Result ã§ãªããã°ãããŸããã
äžèšã®æ¡ä»¶ãæºãããªããªãå Žåãæ»ãå€ã¯æŽæ°ä»¶æ°ãè¡šã int ã§ãªããã°ãããŸããã
SQLã®èªåçæã«ããæŽæ°Â¶
ãã©ã¡ãŒã¿ã®åã¯ãšã³ãã£ãã£ã¯ã©ã¹ã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Update
int update(Employee employee);
@Update
Result<ImmutableEmployee> update(ImmutableEmployee employee);
SQLèªåçæã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã®ãšã³ãã£ãã£ã¯ã©ã¹ã«@Versionã泚éãããããããã£ããã
- @Updateã®ignoreVersionèŠçŽ ãfalseã§ãã
楜芳çæä»å¶åŸ¡ãæå¹ã§ããã°ãããŒãžã§ã³çªå·ã¯èå¥åãšãšãã«æŽæ°æ¡ä»¶ã«å«ãŸãã 1å¢åããŠæŽæ°ãããŸãã ãã®ãšãã®æŽæ°ä»¶æ°ã0件ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã OptimisticLockException ãã¹ããŒãããŸãã ãŸããæŽæ°ä»¶æ°ã0件ã§ãªãå Žåã OptimisticLockException ã¯ã¹ããŒãããã
ignoreVersion¶
ãšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã1å¢åãããŸãã @Update ã® ignoreVersion èŠçŽ ãtrueã®å Žåã ããŒãžã§ã³çªå·ã¯æŽæ°æ¡ä»¶ã«ã¯å«ãŸãããUPDATEæã®SETå¥ã«å«ãŸããŸãã ããŒãžã§ã³çªå·ã¯ã¢ããªã±ãŒã·ã§ã³ã§èšå®ããå€ã§æŽæ°ãããŸãã ãã®å ŽåãæŽæ°ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã
@Update(ignoreVersion = true)
int update(Employee employee);
suppressOptimisticLockException`¶
@Update ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã @Version ã泚éãããããããã£ãããã°ããŒãžã§ã³çªå·ã¯æŽæ°æ¡ä»¶ã«å«ãŸãå¢åããããŸããã æŽæ°ä»¶æ°ã0件ã§ãã£ãŠã OptimisticLockException ã¯ã¹ããŒãããŸããã ãã ãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯1å¢åãããŸãã
@Update(suppressOptimisticLockException = true)
int update(Employee employee);
æŽæ°å¯Ÿè±¡ããããã£ã®å¶åŸ¡Â¶
updatable¶
ãšã³ãã£ãã£ã¯ã©ã¹ã« @Column ã泚éãããããããã£ãããå Žåã @Column ã® updatable èŠçŽ ãfalseã®ãã®ã¯æŽæ°å¯Ÿè±¡å€ã§ãã
exclude¶
@Update ã® exclude èŠçŽ ã«æå®ãããããããã£ãæŽæ°å¯Ÿè±¡å€ãšããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããã°ã @Column ã® updatable èŠçŽ ã true ã§ãã£ãŠãæŽæ°å¯Ÿè±¡å€ã§ãã
@Update(exclude = {"name", "salary"})
int update(Employee employee);
include¶
@Update ã® include èŠçŽ ã«æå®ãããããããã£ã®ã¿ãåé€å¯Ÿè±¡ãšããŸãã @Update ã® include èŠçŽ ãš exclude èŠçŽ ã®äž¡æ¹ã« åãããããã£ãæå®ãããå Žåããã®ããããã£ã¯æŽæ°å¯Ÿè±¡å€ã«ãªããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããŠãã @Column ã® updatable èŠçŽ ã false ã§ããã°æŽæ°å¯Ÿè±¡å€ã§ãã
@Update(include = {"name", "salary"})
int update(Employee employee);
excludeNull¶
@Update ã® excludeNull èŠçŽ ã true ã®å Žåã å€ã null ã®ããããã£ãåé€å¯Ÿè±¡å€ãšããŸãã ãã®èŠçŽ ã true ã®å Žåã @Column ã® updatable èŠçŽ ã true ã§ãã£ããã @Update ã® include èŠçŽ ã«ããããã£ãæå®ãããŠããŠãã å€ã null ã§ããã°æŽæ°å¯Ÿè±¡å€ã§ãã
@Update(excludeNull = true)
int update(Employee employee);
includeUnchanged¶
ãã®èŠçŽ ã¯ãæŽæ°å¯Ÿè±¡ã®ãšã³ãã£ãã£ã¯ã©ã¹ã« @OriginalStates ã泚éãããããããã£ãããå Žåã«ã®ã¿æå¹ã§ãã
ãã®èŠçŽ ãtrueã®å Žåããšã³ãã£ãã£ã®å šããããã£ãæŽæ°å¯Ÿè±¡ãšãªããŸãã ã€ãŸããå šããããã£ã«å¯Ÿå¿ããã«ã©ã ãUPDATEæã®SETå¥ã«å«ãŸããŸãã
ãã®èŠçŽ ã false ã®å Žåã ãšã³ãã£ãã£ãååŸãããŠããå®éã«å€æŽãããããããã£ã®ã¿ãæŽæ°å¯Ÿè±¡ã«ãªããŸãã ã€ãŸããå€æŽãããããããã£ã«å¯Ÿå¿ããã«ã©ã ã®ã¿ãUPDATEæã®SETå¥ã«å«ãŸããŸãã
@Update(includeUnchanged = true)
int update(Employee employee);
SQLãã¡ã€ã«ã«ããæŽæ°Â¶
SQLãã¡ã€ã«ã«ããæŽæ°ãè¡ãã«ã¯ã @Update ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
ãã©ã¡ãŒã¿ã«ã¯ä»»æã®åã䜿çšã§ããŸãã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã«å¶éã¯ãããŸããã ãã©ã¡ãŒã¿ã®åãåºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Update(sqlFile = true)
int update(Employee employee);
@Update(sqlFile = true)
Result<ImmutableEmployee> update(ImmutableEmployee employee);
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
update employee set name = /* employee.name */'hoge', salary = /* employee.salary */100
where id = /* employee.id */0
SQLãã¡ã€ã«ã«ããæŽæ°ã§ã¯ã @Update ã® exclude èŠçŽ ã include èŠçŽ ã excludeNull èŠçŽ ã includeUnchanged èŠçŽ ã¯åç §ãããŸããã
SQLãã¡ã€ã«ã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã«ãšã³ãã£ãã£ã¯ã©ã¹ãå«ã
- ãã©ã¡ãŒã¿ã®å ãå·Šããæ°ããŠæåã«ç»å Žãããšã³ãã£ãã£ã¯ã©ã¹ã«@Versionã泚éãããããããã£ããã
- @Updateã®ignoreVersionèŠçŽ ãfalseã§ãã
ãã ããSQLãã¡ã€ã«ã«æ¥œèŠ³çæä»å¶åŸ¡çšã®SQLãèšè¿°ããã®ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè ã®è²¬ä»»ã§ãã ããšãã°ãäžèšã®SQLã®ããã«ã WHEREå¥ã§ããŒãžã§ã³ãçªå·ãæå®ãSETå¥ã§ããŒãžã§ã³çªå·ã1ã ãå¢åããªããã°ãããŸããã
update EMPLOYEE set DELETE_FLAG = 1, VERSION = /* employee.version */1 + 1
where ID = /* employee.id */1 and VERSION = /* employee.version */1
ãã®SQLã®æŽæ°ä»¶æ°ã0件ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã OptimisticLockException ãã¹ããŒãããŸãã æŽæ°ä»¶æ°ã0件ã§ãªãå Žåã OptimisticLockException ã¯ã¹ããŒãããã ãšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã1å¢åãããŸãã
ignoreVersion¶
@Update ã® ignoreVersion èŠçŽ ã true ã®å Žåã æŽæ°ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã ãŸãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯å€æŽãããŸããã
@Update(sqlFile = true, ignoreVersion = true)
int update(Employee employee);
suppressOptimisticLockException¶
@Update ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã æŽæ°ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã ãã ãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯1å¢åãããŸãã
@Update(sqlFile = true, suppressOptimisticLockException = true)
int update(Employee employee);
äžæå¶çŽéå¶
äžæå¶çŽéåãçºçããå Žåã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªã UniqueConstraintException ãã¹ããŒãããŸãã
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@Update ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@Update(queryTimeout = 10)
int update(Employee employee);
ãã®æå®ã¯SQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Update ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Update(sqlLog = SqlLogType.RAW)
int update(Employee employee);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
åé€Â¶
ç®æ¬¡
åé€ãè¡ãã«ã¯ã @Delete ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Delete
int delete(Employee employee);
}
ããã©ã«ãã§ã¯ãDELETEæãèªåçæãããŸãã @Delete ã® sqlFile ã« true ãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã®ãšã³ãã£ãã£ã¯ã©ã¹ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããå Žåã åé€ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preDelete ã¡ãœãããåŒã³åºãããŸãã ãŸããåé€ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postDelete ã¡ãœãããåŒã³åºãããŸãã
SQLã®èªåçæã«ããåé€Â¶
ãã©ã¡ãŒã¿ã®åã¯ãšã³ãã£ãã£ã¯ã©ã¹ã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Delete
int delete(Employee employee);
@Delete
Result<ImmutableEmployee> delete(ImmutableEmployee employee);
SQLèªåçæã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã®ãšã³ãã£ãã£ã¯ã©ã¹ã«@Versionã泚éãããããããã£ããã
- @Deleteã®ignoreVersionèŠçŽ ãfalseã§ãã
楜芳çæä»å¶åŸ¡ãæå¹ã§ããã°ãããŒãžã§ã³çªå·ã¯èå¥åãšãšãã«åé€æ¡ä»¶ã«å«ãŸããŸãã ãã®å Žåãåé€ä»¶æ°ã0件ã§ããã°ã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã OptimisticLockException ãã¹ããŒãããŸãã
ignoreVersion¶
@Delete ã® ignoreVersion èŠçŽ ã true ã®å Žåã ããŒãžã§ã³çªå·ã¯åé€æ¡ä»¶ã«å«ãŸããŸããã ãã®å Žåãåé€ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã
@Delete(includeVersion = true)
int delete(Employee employee);
suppressOptimisticLockException¶
@Delete ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã ããŒãžã§ã³çªå·ã¯åé€æ¡ä»¶ã«å«ãŸããŸãã ãããããã®å Žåãåé€ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã
@Delete(suppressOptimisticLockException = true)
int delete(Employee employee);
SQLãã¡ã€ã«ã«ããåé€Â¶
SQLãã¡ã€ã«ã«ããåé€ãè¡ãã«ã¯ã @Delete ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
ãã©ã¡ãŒã¿ã«ã¯ä»»æã®åã䜿çšã§ããŸãã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã«å¶éã¯ãããŸããã ãã©ã¡ãŒã¿ã®åãåºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
ãšã³ãã£ãã£ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããŠãããšã³ãã£ãã£ãªã¹ããŒã®ã¡ãœããã¯åŒã³åºããŸããã
@Delete(sqlFile = true)
int delete(Employee employee);
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
delete from employee where name = /* employee.name */'hoge'
SQLãã¡ã€ã«ã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã«ãšã³ãã£ãã£ã¯ã©ã¹ãå«ã
- ãã©ã¡ãŒã¿ã®å ãå·Šããæ°ããŠæåã«ç»å Žãããšã³ãã£ãã£ã¯ã©ã¹ã«@Versionã泚éãããããããã£ããã
- @Deleteã®ignoreVersionèŠçŽ ãfalseã§ãã
- @Deleteã®suppressOptimisticLockExceptionèŠçŽ ãfalseã§ãã
ãã ããSQLãã¡ã€ã«ã«æ¥œèŠ³çæä»å¶åŸ¡çšã®SQLãèšè¿°ããã®ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè ã®è²¬ä»»ã§ãã ããšãã°ãäžèšã®SQLã®ããã«ãWHEREå¥ã§ããŒãžã§ã³ãçªå·ãæå®ããªããã°ãããŸããã
delete from EMPLOYEE where ID = /* employee.id */1 and VERSION = /* employee.version */1
ãã®SQLã®åé€ä»¶æ°ã0件ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã OptimisticLockException ãã¹ããŒãããŸãã åé€ä»¶æ°ã0件ã§ãªãå Žåã OptimisticLockException ã¯ã¹ããŒãããŸããã
ignoreVersion¶
@Delete ã® ignoreVersion èŠçŽ ã true ã®å Žåã åé€ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã
@Delete(sqlFile = true, includeVersion = true)
int delete(Employee employee);
suppressOptimisticLockException¶
@Delete ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã åé€ä»¶æ°ã0件ã§ãã£ãŠãã OptimisticLockException ã¯ã¹ããŒãããŸããã
@Delete(sqlFile = true, suppressOptimisticLockException = true)
int delete(Employee employee);
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@Delete ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@Delete(queryTimeout = 10)
int delete(Employee employee);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Delete ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Delete(sqlLog = SqlLogType.RAW)
int delete(Employee employee);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ãããæ¿å ¥Â¶
ç®æ¬¡
ãããæ¿å ¥ãè¡ãã«ã¯ã @BatchInsert ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@BatchInsert
int[] insert(List<Employee> employees);
@BatchInsert
BatchResult<ImmutableEmployee> insert(List<ImmutableEmployee> employees);
}
ããã©ã«ãã§ã¯ãINSERTæãèªåçæãããŸãã @BatchInsert ã® sqlFile ã« true ãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã®èŠçŽ ã®ã« ãšã³ãã£ãã£ã¯ã©ã¹ ãæå®ãããŠããå Žåã æ¿å ¥ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preInsert ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºããŸãã ãŸããæ¿å ¥ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postInsert ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºããŸãã
æ»ãå€Â¶
ãã©ã¡ãŒã¿ Iterable ã®ãµãã¿ã€ãã®èŠçŽ ãã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£ã¯ã©ã¹ã®å Žåã æ»ãå€ã¯ãã®ãšã³ãã£ãã£ã¯ã©ã¹ãèŠçŽ ãšãã org.seasar.doma.BatchResult ã§ãªããã°ãããŸããã
äžèšã®æ¡ä»¶ãæºãããªããªãå Žåãæ»ãå€ã¯åæŽæ°åŠçã®æŽæ°ä»¶æ°ãè¡šã int[] ã§ãªããã°ãããŸããã
SQLã®èªåçæã«ãããããæ¿å ¥Â¶
ãã©ã¡ãŒã¿ã®å㯠ãšã³ãã£ãã£ã¯ã©ã¹ èŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
èå¥å¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã®èå¥åã«ã @GeneratedValue ã泚éãããŠããå Žåã èå¥åãèªåçã«çæããèšå®ãããŸãã
ããŒãžã§ã³çªå·Â¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã« @Version ã泚éãããããããã£ãããå Žåã ãã®ããããã£ã«æ瀺çã« 1 以äžã®å€ãèšå®ãããŠããã°ãã®å€ã䜿çšããŸãã ããèšå®ãããŠããªããã 0 以äžã®å€ãèšå®ãããŠããã° 1 ãèªåã§èšå®ããŸãã
æ¿å ¥å¯Ÿè±¡ããããã£Â¶
insertable¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã« @Column ã泚éãããããããã£ãããå Žåã @BatchInsert ã® insertable èŠçŽ ã false ã®ãã®ã¯æ¿å ¥å¯Ÿè±¡å€ã§ãã
exclude¶
@BatchInsert ã® exclude èŠçŽ ã«æå®ãããããããã£ãæ¿å ¥å¯Ÿè±¡å€ãšããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããã°ã @Column ã® insertable èŠçŽ ã true ã§ãã£ãŠãæ¿å ¥å¯Ÿè±¡å€ã§ãã
@BatchInsert(exclude = {"name", "salary"})
int[] insert(List<Employee> employees);
include¶
@BatchInsert ã® include èŠçŽ ã«æå®ãããããããã£ã®ã¿ãæ¿å ¥å¯Ÿè±¡ãšããŸãã @BatchInsert ã® include èŠçŽ ãš exclude èŠçŽ ã®äž¡æ¹ã«åãããããã£ãæå®ãããå Žåã ãã®ããããã£ã¯æ¿å ¥å¯Ÿè±¡å€ã«ãªããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããŠãã @Column ã® insertable èŠçŽ ã false ã§ããã°æ¿å ¥å¯Ÿè±¡å€ã§ãã
@BatchInsert(include = {"name", "salary"})
int[] insert(List<Employee> employees);
SQLãã¡ã€ã«ã«ãããããæ¿å ¥Â¶
SQLãã¡ã€ã«ã«ãããããæ¿å ¥ãè¡ãã«ã¯ã @BatchInsert ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
@BatchInsert(sqlFile = true)
int[] insert(List<Employee> employees);
@BatchInsert(sqlFile = true)
BatchResult<ImmutableEmployee> insert(List<ImmutableEmployee> employees);
ãã©ã¡ãŒã¿ã¯ä»»æã®åãèŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããŠãããšã³ãã£ãã£ãªã¹ããŒã®ã¡ãœããã¯åŒã³åºããŸããã
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
insert into employee (id, name, salary, version)
values (/* employees.id */0, /* employees.name */'hoge', /* employees.salary */100, /* employees.version */0)
SQLãã¡ã€ã«äžã§ã¯ããã©ã¡ãŒã¿ã®åå㯠java.lang.Iterable ã®ãµãã¿ã€ãã®èŠçŽ ãæããŸãã
SQLãã¡ã€ã«ã«ãããããæ¿å ¥ã§ã¯ãèå¥åã®èªåèšå®ãããŒãžã§ã³çªå·ã®èªåèšå®ã¯è¡ãããŸããã ãŸãã @BatchInsert ã® exclude èŠçŽ ã include èŠçŽ ã¯åç §ãããŸããã
äžæå¶çŽéå¶
äžæå¶çŽéåãçºçããå Žåã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªã UniqueConstraintException ãã¹ããŒãããŸãã
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@BatchInsert ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@BatchInsert(queryTimeout = 10)
int[] insert(List<Employee> employees);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
ããããµã€ãºÂ¶
@BatchInsert ã® batchSize èŠçŽ ã«ããããµã€ãºãæå®ã§ããŸãã
@BatchInsert(batchSize = 10)
int[] insert(List<Employee> employees);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã batchSize èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããããããµã€ãºã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@BatchInsert ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@BatchInsert(sqlLog = SqlLogType.RAW)
int insert(Employee employee);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ãããæŽæ°Â¶
ç®æ¬¡
ãããæŽæ°ãè¡ãã«ã¯ã @BatchUpdate ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@BatchUpdate
int[] update(List<Employee> employees);
@BatchUpdate
BatchResult<ImmutableEmployee> update(List<ImmutableEmployee> employees);
}
ããã©ã«ãã§ã¯ãUPDATEæãèªåçæãããŸãã @BatchUpdate ã® sqlFile ã« true ãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã®èŠçŽ ã® ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããå Žåã æŽæ°ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preUpdate ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºãããŸãã ãŸããæŽæ°ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postUpdate ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºãããŸãã
æ»ãå€Â¶
ãã©ã¡ãŒã¿ Iterable ã®ãµãã¿ã€ãã®èŠçŽ ãã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£ã¯ã©ã¹ã®å Žåã æ»ãå€ã¯ãã®ãšã³ãã£ãã£ã¯ã©ã¹ãèŠçŽ ãšãã org.seasar.doma.BatchResult ã§ãªããã°ãããŸããã
äžèšã®æ¡ä»¶ãæºãããªããªãå Žåãæ»ãå€ã¯åæŽæ°åŠçã®æŽæ°ä»¶æ°ãè¡šã int[] ã§ãªããã°ãããŸããã
SQLã®èªåçæã«ãããããæŽæ°Â¶
ãã©ã¡ãŒã¿ã®å㯠ãšã³ãã£ãã£ã¯ã©ã¹ ãèŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
SQLèªåçæã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã®java.lang.Iterableã®ãµãã¿ã€ãã®èŠçŽ ã§ãã ãšã³ãã£ãã£ã¯ã©ã¹ ã«@Versionã泚éãããããããã£ããã
- @BatchUpdateã®ignoreVersionèŠçŽ ãfalseã§ãã
楜芳çæä»å¶åŸ¡ãæå¹ã§ããã°ãããŒãžã§ã³çªå·ã¯èå¥åãšãšãã«æŽæ°æ¡ä»¶ã«å«ãŸãã 1å¢åããŠæŽæ°ãããŸãã ãã®ãšãã®æŽæ°ä»¶æ°ã0件ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã BatchOptimisticLockException ãã¹ããŒãããŸãã äžæ¹ãæŽæ°ä»¶æ°ã1件ã®å Žåã¯ã BatchOptimisticLockException ã¯ã¹ããŒãããã ãšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã1å¢åãããŸãã
ignoreVersion¶
@BatchUpdate ã® ignoreVersion èŠçŽ ã true ã®å Žåã ããŒãžã§ã³çªå·ã¯æŽæ°æ¡ä»¶ã«ã¯å«ãŸãããUPDATEæã®SETå¥ã«å«ãŸããŸãã ããŒãžã§ã³çªå·ã¯ã¢ããªã±ãŒã·ã§ã³ã§èšå®ããå€ã§æŽæ°ãããŸãã ãã®å ŽåãæŽæ°ä»¶æ°ã0件ã§ãã£ãŠãã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã
@BatchUpdate(ignoreVersion = true)
int[] update(List<Employee> employees);
suppressOptimisticLockException¶
@BatchUpdate ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã @Versioni ã泚éãããããããã£ãããã°ããŒãžã§ã³çªå·ã¯æŽæ°æ¡ä»¶ã«å«ãŸãå¢åããããŸããã æŽæ°ä»¶æ°ã0件ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã ãã ãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯1å¢åãããŸãã
@BatchUpdate(suppressOptimisticLockException = true)
int[] update(List<Employee> employees);
æŽæ°å¯Ÿè±¡ããããã£Â¶
updatable¶
ãšã³ãã£ãã£ã¯ã©ã¹ ã« @Column ã泚éãããããããã£ãããå Žåã @Column ã® updatable èŠçŽ ã false ã®ãã®ã¯æŽæ°å¯Ÿè±¡å€ã§ãã
exclude¶
@BatchUpdate ã® exclude èŠçŽ ã«æå®ãããããããã£ãæŽæ°å¯Ÿè±¡å€ãšããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããã°ã @Column ã® updatable èŠçŽ ã true ã§ãã£ãŠãåé€å¯Ÿè±¡å€ã§ãã
@BatchUpdate(exclude = {"name", "salary"})
int[] update(List<Employee> employees);
include¶
@BatchUpdate ã® include èŠçŽ ã«æå®ãããããããã£ã®ã¿ãåé€å¯Ÿè±¡ãšããŸãã @BatchUpdate ã® include èŠçŽ ãš exclude èŠçŽ ã®äž¡æ¹ã«åãããããã£ãæå®ãããå Žåããã®ããããã£ã¯æŽæ°å¯Ÿè±¡å€ã«ãªããŸãã ããããã£ããã®èŠçŽ ã«æå®ãããŠããŠãã @Column ã® updatable èŠçŽ ã false ã§ããã°æŽæ°å¯Ÿè±¡å€ã§ãã
@BatchUpdate(include = {"name", "salary"})
int[] update(List<Employee> employees);
SQLãã¡ã€ã«ã«ãããããæŽæ°Â¶
SQLãã¡ã€ã«ã«ãããããæŽæ°ãè¡ãã«ã¯ã @BatchUpdate ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
@BatchUpdate(sqlFile = true)
int[] update(List<Employee> employees);
@BatchUpdate
BatchResult<ImmutableEmployee> update(List<ImmutableEmployee> employees);
ãã©ã¡ãŒã¿ã¯ä»»æã®åãèŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
update employee set name = /* employees.name */'hoge', salary = /* employees.salary */100
where id = /* employees.id */0
SQLãã¡ã€ã«äžã§ã¯ããã©ã¡ãŒã¿ã®åå㯠Iterable ã®ãµãã¿ã€ãã®èŠçŽ ãæããŸãã
SQLãã¡ã€ã«ã«ãããããæŽæ°ã§ã¯ãããŒãžã§ã³çªå·ã®èªåæŽæ°ã¯è¡ãããŸããã ãŸãã @BatchUpdate ã® exclude èŠçŽ ã include èŠçŽ ã¯åç §ãããŸããã
SQLãã¡ã€ã«ã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã®java.lang.Iterableã®ãµãã¿ã€ãã®èŠçŽ ã ãšã³ãã£ãã£ã¯ã©ã¹ ã§ããã ãšã³ãã£ãã£ã¯ã©ã¹ ã«@Versionã泚éãããããããã£ããã
- @BatchUpdateã®ignoreVersionèŠçŽ ãfalseã§ãã
ãã ããSQLãã¡ã€ã«ã«æ¥œèŠ³çæä»å¶åŸ¡çšã®SQLãèšè¿°ããã®ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè ã®è²¬ä»»ã§ãã ããšãã°ãäžèšã®SQLã®ããã«ã WHEREå¥ã§ããŒãžã§ã³ãçªå·ãæå®ãSETå¥ã§ããŒãžã§ã³çªå·ã1ã ãå¢åããªããã°ãããŸããã
update EMPLOYEE set DELETE_FLAG = 1, VERSION = /* employees.version */1 + 1
where ID = /* employees.id */1 and VERSION = /* employees.version */1
ãã®SQLã®æŽæ°ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã BatchOptimisticLockException ãã¹ããŒãããŸãã æŽæ°ä»¶æ°ã1件ã®å Žåã BatchOptimisticLockException ã¯ã¹ããŒãããã ãšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã1å¢åãããŸãã
楜芳çæä»å¶åŸ¡ãæå¹ã§ããã°ãããŒãžã§ã³çªå·ã¯èå¥åãšãšãã«æŽæ°æ¡ä»¶ã«å«ãŸãã 1å¢åããŠæŽæ°ãããŸãã ãã®ãšãã®æŽæ°ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã®å Žåã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã BatchOptimisticLockException ãã¹ããŒãããŸãã äžæ¹ãæŽæ°ä»¶æ°ã1件ã®å Žåã BatchOptimisticLockException ã¯ã¹ããŒãããããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã1å¢åãããŸãã
ignoreVersion¶
@BatchUpdate ã® ignoreVersion èŠçŽ ã true ã®å Žåã æŽæ°ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã§ãã£ãŠãã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã ãŸãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯å€æŽãããŸããã
@BatchUpdate(sqlFile = true, ignoreVersion = true)
int[] update(List<Employee> employees);
suppressOptimisticLockException¶
@BatchUpdate ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã æŽæ°ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã ãã ãããšã³ãã£ãã£ã®ããŒãžã§ã³ããããã£ã®å€ã¯1å¢åãããŸãã
@BatchUpdate(sqlFile = true, suppressOptimisticLockException = true)
int[] update(List<Employee> employees);
äžæå¶çŽéå¶
äžæå¶çŽéåãçºçããå Žåã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªã UniqueConstraintException ãã¹ããŒãããŸãã
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@BatchUpdate ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@BatchUpdate(queryTimeout = 10)
int[] update(List<Employee> employees);
ãã®èšå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå®ã¯ã©ã¹ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
ããããµã€ãºÂ¶
@BatchUpdate ã® batchSize èŠçŽ ã«ããããµã€ãºãæå®ã§ããŸãã
@BatchUpdate(batchSize = 10)
int[] update(List<Employee> employees);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã batchSize èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã¯ã©ã¹ã«æå®ãããããããµã€ãºã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@BatchUpdate ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@BatchUpdate(sqlLog = SqlLogType.RAW)
int[] update(List<Employee> employees);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ãããåé€Â¶
ç®æ¬¡
ãããåé€ãè¡ãã«ã¯ã @BatchDelete ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@BatchDelete
int[] delete(List<Employee> employees);
...
}
ããã©ã«ãã§ã¯ãDELETEæãèªåçæãããŸãã @BatchDelete ã® sqlFile ã« true ãèšå®ããããšã§ãä»»æã®SQLãã¡ã€ã«ã«ãããã³ã°ã§ããŸãã
ãã©ã¡ãŒã¿ã®èŠçŽ ã§ãã ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãšã³ãã£ãã£ãªã¹ããŒãæå®ãããŠããå Žåã åé€ã®å®è¡åã«ãšã³ãã£ãã£ãªã¹ããŒã® preDelete ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºãããŸãã ãŸããåé€ã®å®è¡åŸã«ãšã³ãã£ãã£ãªã¹ããŒã® postDelete ã¡ãœããããšã³ãã£ãã£ããšã«åŒã³åºãããŸãã
æ»ãå€Â¶
æ»ãå€ã¯åæŽæ°åŠçã®æŽæ°ä»¶æ°ãè¡šã int[] ã§ãªããã°ãããŸããã
SQLã®èªåçæã«ãããããåé€Â¶
ãã©ã¡ãŒã¿ã®å㯠ãšã³ãã£ãã£ã¯ã©ã¹ ãèŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
SQLèªåçæã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã®java.lang.Iterableã®ãµãã¿ã€ãã®èŠçŽ ã§ãã ãšã³ãã£ãã£ã¯ã©ã¹ ã«@Versionã泚éãããããããã£ããã
- @BatchDeleteã®ignoreVersionèŠçŽ ãfalseã§ãã
楜芳çæä»å¶åŸ¡ãæå¹ã§ããã°ãããŒãžã§ã³çªå·ã¯èå¥åãšãšãã«åé€æ¡ä»¶ã«å«ãŸããŸãã ãã®å Žåãåé€ä»¶æ°ã0件ã§ããã°ã楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã BatchOptimisticLockException ãã¹ããŒãããŸãã
ignoreVersion¶
@BatchDelete ã® ignoreVersion èŠçŽ ã true ã®å Žåã ããŒãžã§ã³çªå·ã¯åé€æ¡ä»¶ã«ã¯å«ãŸããŸããã åé€ä»¶æ°ã0件ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã
@BatchDelete(ignoreVersion = true)
int[] delete(List<Employee> employees);
suppressOptimisticLockException¶
@BatchDelete ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåã ããŒãžã§ã³çªå·ã¯åé€æ¡ä»¶ã«å«ãŸããŸããã åé€ä»¶æ°ã0件ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã
@BatchDelete(suppressOptimisticLockException = true)
int[] delete(List<Employee> employees);
SQLãã¡ã€ã«ã«ãããããåé€Â¶
SQLãã¡ã€ã«ã«ãããããåé€ãè¡ãã«ã¯ã @BatchDelete ã® sqlFile èŠçŽ ã« true ãèšå®ãã ã¡ãœããã«å¯Ÿå¿ããSQLãã¡ã€ã«ãçšæããŸãã
@BatchDelete(sqlFile = true)
int[] delete(List<Employee> employees);
ãã©ã¡ãŒã¿ã¯ä»»æã®åãèŠçŽ ãšãã java.lang.Iterable ã®ãµãã¿ã€ãã§ãªããã°ãããŸããã æå®ã§ãããã©ã¡ãŒã¿ã®æ°ã¯1ã€ã§ãã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã æ»ãå€ã®é åã®èŠçŽ ã®æ°ã¯ãã©ã¡ãŒã¿ã® Iterable ã®èŠçŽ ã®æ°ãšçãããªããŸãã é åã®ããããã®èŠçŽ ãæŽæ°ããã件æ°ãè¿ããŸãã
ããšãã°ãäžèšã®ã¡ãœããã«å¯Ÿå¿ããSQLã¯æ¬¡ã®ããã«èšè¿°ããŸãã
delete from employee where name = /* employees.name */'hoge'
SQLãã¡ã€ã«äžã§ã¯ããã©ã¡ãŒã¿ã®åå㯠java.lang.Iterable ã®ãµãã¿ã€ãã®èŠçŽ ãæããŸãã
SQLãã¡ã€ã«ã«ãããããŒãžã§ã³çªå·ãšæ¥œèŠ³çæä»å¶åŸ¡Â¶
次ã®æ¡ä»¶ãæºããå Žåã«ã楜芳çæä»å¶åŸ¡ãè¡ãããŸãã
- ãã©ã¡ãŒã¿ã® java.lang.Iterable ã®ãµãã¿ã€ãã®èŠçŽ ã ãšã³ãã£ãã£ã¯ã©ã¹ ã§ããã ãšã³ãã£ãã£ã¯ã©ã¹ ã«@Versionã泚éãããããããã£ããã
- @BatchDeleteã®ignoreVersionèŠçŽ ãfalseã§ãã
ãã ããSQLãã¡ã€ã«ã«æ¥œèŠ³çæä»å¶åŸ¡çšã®SQLãèšè¿°ããã®ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè ã®è²¬ä»»ã§ãã ããšãã°ãäžèšã®SQLã®ããã«ãWHEREå¥ã§ããŒãžã§ã³ãçªå·ãæå®ããªããã°ãããŸããã
delete from EMPLOYEE where ID = /* employees.id */1 and VERSION = /* employees.version */1
ãã®SQLã®åé€ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã®å Žåã 楜芳çæä»å¶åŸ¡ã®å€±æã瀺ã BatchOptimisticLockException ãã¹ããŒãããŸãã
ignoreVersion¶
@BatchDelete ã® ignoreVersion èŠçŽ ã true ã®å Žåãåé€ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã
@BatchDelete(sqlFile = true, ignoreVersion = true)
int[] delete(List<Employee> employees);
suppressOptimisticLockException¶
@BatchDelete ã® suppressOptimisticLockException èŠçŽ ã true ã®å Žåãåé€ä»¶æ°ã0件ãŸãã¯è€æ°ä»¶ã§ãã£ãŠã BatchOptimisticLockException ã¯ã¹ããŒãããŸããã
@BatchDelete(sqlFile = true, suppressOptimisticLockException = true)
int[] delete(List<Employee> employees);
ã¯ãšãªã¿ã€ã ã¢ãŠã¶
@BatchDelete ã® queryTimeout èŠçŽ ã«ã¯ãšãªã¿ã€ã ã¢ãŠãã®ç§æ°ãæå®ã§ããŸãã
@BatchDelete(queryTimeout = 10)
int[] delete(List<Employee> employees);
ãã®æå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã queryTimeout èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããã¯ãšãªã¿ã€ã ã¢ãŠãã䜿çšãããŸãã
ããããµã€ãºÂ¶
@BatchDelete ã® batchSize èŠçŽ ã«ããããµã€ãºãæå®ã§ããŸãã
@BatchDelete(batchSize = 10)
int[] delete(List<Employee> employees);
ãã®èšå®ã¯ãSQLãã¡ã€ã«ã®äœ¿çšã®æç¡ã«é¢ä¿ãªãé©çšãããŸãã batchSize èŠçŽ ã«å€ãæå®ããªãå Žåã èšå® ã«æå®ãããããããµã€ãºã䜿çšãããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@BatchDelete ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@BatchDelete(sqlLog = SqlLogType.RAW)
int[] delete(List<Employee> employees);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ã¹ãã¢ããã¡ã³ã¯ã·ã§ã³Â¶
ç®æ¬¡
ã¹ãã¢ããã¡ã³ã¯ã·ã§ã³ãåŒã³åºãã«ã¯ã @Function ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Function
Integer execute(@In Integer id, @InOut Reference<BigDecimal> salary);
...
}
ãã©ã¡ãŒã¿ã«ã¯ããã©ã¡ãŒã¿ã®çš®å¥ã瀺ã @In ã @InOut ã @Out ã @ResultSet ã®ããããã®ã¢ãããŒã·ã§ã³ãå¿ é ã§ãã ãã©ã¡ãŒã¿ã¯è€æ°æå®ã§ããŸãã
æ»ãå€Â¶
æ»ãå€ã¯æ¬¡ã®ããããã§ãªããã°ãããŸããã
1件ãè¿ãå Žå¶
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ã ãã¡ã€ã³ã¯ã©ã¹ ã ãšã³ãã£ãã£ã¯ã©ã¹ ã java.util.Map<String, Object> ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
è€æ°ä»¶ãè¿ãå Žå¶
次ã®ãããããèŠçŽ ãšãã java.util.List
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®ãããããèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
ãã ããè€æ°ä»¶ãè¿ããã®ã¯ãã¡ã³ã¯ã·ã§ã³ãã«ãŒãœã«ãå®è¡çµæãšããŠè¿ãå Žåã®ã¿ã§ãã
ãã¡ã³ã¯ã·ã§ã³å¶
ããã©ã«ãã§ã¯ã¡ãœããåããã¡ã³ã¯ã·ã§ã³åã«ãªããŸãã @Function ã® name èŠçŽ ã«å€ãæå®ããå Žåã¯ããã®å€ããã¡ã³ã¯ã·ã§ã³åã«ãªããŸãã
@Function(name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
@Function ã® catalog èŠçŽ ã schema èŠçŽ ã«ã«ã¿ãã°åãã¹ããŒãåãæå®ã§ããŸãã ãã®ãšããã¡ã³ã¯ã·ã§ã³ã®åå㯠catalog èŠçŽ ã schema èŠçŽ ã name èŠçŽ ïŒæå®ãããŠããªããã°ã¡ãœããåïŒãããªãªãã§é£çµãããã®ã«ãªããŸãã
@Function(catlog = "CATALOG", schema ="SCHEMA", name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
æ»ãå€ã®åã ãšã³ãã£ãã£ã¯ã©ã¹ ã ãšã³ãã£ãã£ã¯ã©ã¹ ãèŠçŽ ãšãã java.util.List ã®å Žåã«ãããŠã ãšã³ãã£ãã£ã®ããããã£ãã¹ãŠã«å¯ŸããŠæŒããªãçµæã»ããã®ã«ã©ã ããããã³ã°ããããšãä¿èšŒãããå Žåã¯ã @Function ã® ensureResultMapping èŠçŽ ã« true ãæå®ããŸãã
@Function(ensureResultMapping = true)
List<Employee> execute();
çµæã»ããã®ã«ã©ã ã«ãããã³ã°ãããªãããããã£ãååšããå Žå ResultMappingException ãã¹ããŒãããŸãã
ãã©ã¡ãŒã¿Â¶
ã¹ãã¢ããã¡ã³ã¯ã·ã§ã³ã®ãã©ã¡ãŒã¿ãšDaoã¡ãœããã®ãã©ã¡ãŒã¿ã®äžŠã³é ã¯åãããªããã°ãããŸããã
INãã©ã¡ãŒã¿Â¶
INãã©ã¡ãŒã¿ã¯ã @In ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã æå®å¯èœãªãã©ã¡ãŒã¿ã®åã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
ãã©ã¡ãŒã¿ã®åãåºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Function
void execute(@In Integer id);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
dao.execute(1);
INOUTãã©ã¡ãŒã¿Â¶
INOUTãã©ã¡ãŒã¿ã¯ã @InOut ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®å㯠org.seasar.doma.jdbc.Reference ã§ãªããã°ãããŸããã Reference ã®åãã©ã¡ãŒã¿ã«æå®ã§ããåã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Function
void execute(@InOut Reference<BigDecimal> salary);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
BigDecimal in = new BigDecimal(100);
Reference<BigDecimal> ref = new Reference<BigDecimal>(in);
dao.execute(ref);
BigDecimal out = ref.get();
OUTãã©ã¡ãŒã¿Â¶
OUTãã©ã¡ãŒã¿ã¯ã @Out ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®å㯠org.seasar.doma.jdbc.Reference ã§ãªããã°ãããŸããã Reference ã®åãã©ã¡ãŒã¿ã«æå®ã§ããåã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
ã¡ãœããã®æ»ãå€ã®åã void 以å€ã®å Žåãæ»ãå€ã¯OUTãã©ã¡ãŒã¿ãšãªããŸãã
@Function
Integer execute(@Out Reference<BigDecimal> salary);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
Reference<BigDecimal> ref = new Reference<BigDecimal>();
Integer result = dao.execute(ref);
BigDecimal out = ref.get();
ã«ãŒãœã«ã®OUTãã©ã¡ãŒã¿ãããã¯çµæã»ãã¶
ã«ãŒãœã«ã®OUTãã©ã¡ãŒã¿ããããã¯ã¹ãã¢ããã¡ã³ã¯ã·ã§ã³ãè¿ãçµæã»ããã¯ã @ResultSet ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®åã¯ã以äžã®åãèŠçŽ ãšãã java.util.List ã§ãªããã°ãããŸããã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Function
void execute(@ResultSet List<Employee> employee);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
List<Employee> employees = new ArrayList<Employee>();
dao.execute(employees);
for (Employee e : employees) {
...
}
@ResultSet ã泚éããã java.util.List ã®åãã©ã¡ãŒã¿ã ãšã³ãã£ãã£ã¯ã©ã¹ ã§ããããã€ããšã³ãã£ãã£ã®ããããã£ãã¹ãŠã«å¯Ÿã㊠æŒããªãçµæã»ããã®ã«ã©ã ããããã³ã°ããããšãä¿èšŒãããå Žåã¯ã @ResultSet ã® ensureResultMapping èŠçŽ ã« true ãæå®ããŸãã
@Function
void execute(@ResultSet(ensureResultMapping = true) List<Employee> employee);
çµæã»ããã®ã«ã©ã ã«ãããã³ã°ãããªãããããã£ãååšããå Žå ResultMappingException ãã¹ããŒãããŸãã
ãããã®ããŒã®ããŒãã³ã°èŠçŽÂ¶
çµæã»ããã java.util.Map<String, Object> ã«ãããã³ã°ããå Žåã @Function ã® mapKeyNaming èŠçŽ ã«ãããã®ããŒã®ããŒãã³ã°èŠçŽãæå®ã§ããŸãã
@Function(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
List<Map<String, Object>> execute(@In Integer id);
MapKeyNamingType.CAMEL_CASE ã¯ãã«ã©ã åããã£ã¡ã«ã±ãŒã¹ã«å€æããããšã瀺ããŸãã ãã®ã»ãã«ãã«ã©ã åãã倧æåãå°æåã«å€æããèŠçŽããããŸãã
æçµçãªå€æçµæã¯ãããã«æå®ããå€ãš èšå® ã«æå®ããã MapKeyNaming ã®å®è£ ã«ãã決ãŸããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Function ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Function(sqlLog = SqlLogType.RAW)
void execute(@In Integer id);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ã¹ãã¢ãããã·ãŒãžã£ãŒÂ¶
ç®æ¬¡
ã¹ãã¢ãããã·ãŒãžã£ãŒãåŒã³åºãã«ã¯ã @Procedure ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Procedure
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
...
}
ãã©ã¡ãŒã¿ã«ã¯ããã©ã¡ãŒã¿ã®çš®å¥ã瀺ã @In ã @InOut ã @Out ã @ResultSet ã®ããããã®ã¢ãããŒã·ã§ã³ãå¿ é ã§ãã ãã©ã¡ãŒã¿ã¯è€æ°æå®ã§ããŸãã
ããã·ãŒãžã£ãŒå¶
ããã©ã«ãã§ã¯ã¡ãœããåãããã·ãŒãžã£ãŒåã«ãªããŸãã @Procedure ã® name èŠçŽ ã«å€ãæå®ããå Žåã¯ããã®å€ãããã·ãŒãžã£ãŒåã«ãªããŸãã
@Procedure(name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
@Procedure ã® catalog èŠçŽ ã schema èŠçŽ ã«ã«ã¿ãã°åãã¹ããŒãåãæå®ã§ããŸãã ãã®ãšãããã·ãŒãžã£ãŒã®åå㯠catalog èŠçŽ ã schema èŠçŽ ã name èŠçŽ ïŒæå®ãããŠããªããã°ã¡ãœããåïŒãããªãªãã§é£çµãããã®ã«ãªããŸãã
@Procedure(catlog = "CATALOG", schema ="SCHEMA", name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
ãã©ã¡ãŒã¿Â¶
ã¹ãã¢ãããã·ãŒãžã£ãŒã®ãã©ã¡ãŒã¿ãšDaoã¡ãœããã®ãã©ã¡ãŒã¿ã®äžŠã³é ã¯åãããªããã°ãããŸããã
INãã©ã¡ãŒã¿Â¶
INãã©ã¡ãŒã¿ã¯ã @In ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã æå®å¯èœãªãã©ã¡ãŒã¿ã®åã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
ãã©ã¡ãŒã¿ã®åãåºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹ã®å ŽåãåŒæ°ã null ã«ã§ããŸãã ãã以å€ã®åã®å ŽåãåŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Procedure
void execute(@In Integer id);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
dao.execute(1);
INOUTãã©ã¡ãŒã¿Â¶
INOUTãã©ã¡ãŒã¿ã¯ã @InOut ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®å㯠org.seasar.doma.jdbc.Reference ã§ãªããã°ãããŸããã Reference ã®åãã©ã¡ãŒã¿ã«æå®ã§ããåã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Procedure
void execute(@InOut Reference<BigDecimal> salary);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
BigDecimal in = new BigDecimal(100);
Reference<BigDecimal> ref = new Reference<BigDecimal>(in);
dao.execute(ref);
BigDecimal out = ref.get();
OUTãã©ã¡ãŒã¿Â¶
OUTãã©ã¡ãŒã¿ã¯ã @Out ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®å㯠org.seasar.doma.jdbc.Reference ã§ãªããã°ãããŸããã Reference ã®åãã©ã¡ãŒã¿ã«æå®ã§ããåã¯ä»¥äžã®éãã§ãã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Procedure
void execute(@Out Reference<BigDecimal> salary);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
Reference<BigDecimal> ref = new Reference<BigDecimal>();
dao.execute(ref);
BigDecimal out = ref.get();
ã«ãŒãœã«ã®OUTãã©ã¡ãŒã¿ãããã¯çµæã»ãã¶
ã«ãŒãœã«ã®OUTãã©ã¡ãŒã¿ããããã¯ã¹ãã¢ãããã·ãŒãžã£ãŒãè¿ãçµæã»ããã¯ã @ResultSet ãã¡ãœããã®ãã©ã¡ãŒã¿ã«æ³šéããŠç€ºããŸãã 泚éããããã©ã¡ãŒã¿ã®åã¯ã以äžã®åãèŠçŽ ãšãã java.util.List ã§ãªããã°ãããŸããã
- åºæ¬å
- ãã¡ã€ã³ã¯ã©ã¹
- ãšã³ãã£ãã£ã¯ã©ã¹
- java.util.Map<String, Object>
- åºæ¬å ãŸã㯠ãã¡ã€ã³ã¯ã©ã¹ ãèŠçŽ ãšããjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@Procedure
void execute(@ResultSet List<Employee> employees);
次ã®ããã«äœ¿çšããŸãã
EmployeeDao dao = new EmployeeDaoImpl();
List<Employee> employees = new ArrayList<Employee>();
dao.execute(employees);
for (Employee e : employees) {
...
}
@ResultSet ã泚éããã java.util.List ã®åãã©ã¡ãŒã¿ã ãšã³ãã£ãã£ã¯ã©ã¹ ã§ããããã€ããšã³ãã£ãã£ã®ããããã£ãã¹ãŠã«å¯Ÿã㊠æŒããªãçµæã»ããã®ã«ã©ã ããããã³ã°ããããšãä¿èšŒãããå Žåã¯ã @ResultSet ã® ensureResultMapping èŠçŽ ã« true ãæå®ããŸãã
@Procedure
void execute(@ResultSet(ensureResultMapping = true) List<Employee> employee);
çµæã»ããã®ã«ã©ã ã«ãããã³ã°ãããªãããããã£ãååšããå Žå ResultMappingException ãã¹ããŒãããŸãã
ãããã®ããŒã®ããŒãã³ã°èŠçŽÂ¶
çµæã»ããã java.util.Map<String, Object> ã«ãããã³ã°ããå Žåã @Procedure ã® mapKeyNaming èŠçŽ ã«ãããã®ããŒã®ããŒãã³ã°èŠçŽãæå®ã§ããŸãã
@Procedure(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
void execute(@ResultSet List<Map<String, Object>> employees);
MapKeyNamingType.CAMEL_CASE ã¯ãã«ã©ã åããã£ã¡ã«ã±ãŒã¹ã«å€æããããšã瀺ããŸãã ãã®ã»ãã«ãã«ã©ã åãã倧æåãå°æåã«å€æããèŠçŽããããŸãã
æçµçãªå€æçµæã¯ãããã«æå®ããå€ãš èšå® ã«æå®ããã MapKeyNaming ã®å®è£ ã«ãã決ãŸããŸãã
SQL ã®ãã°åºå圢åŒÂ¶
@Procedure ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Procedure(sqlLog = SqlLogType.RAW)
void execute(@In Integer id);
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ãã¡ã¯ããªÂ¶
java.sql.Connection ãæäŸãããã¡ã¯ããªã¡ãœããããã€ã³ã¹ã¿ã³ã¹ãååŸããã«ã¯ã Daoã®ã¡ãœããã«æ¬¡ã®ã¢ãããŒã·ã§ã³ã泚éããŸãã
- java.sql.Arrayãçæããã«ã¯ã@ArrayFactory
- java.sql.Blobãçæããã«ã¯ã@BlobFactory
- java.sql.Clobãçæããã«ã¯ã@ClobFactory
- java.sql.NClobãçæããã«ã¯ã@NClobFactory
- java.sql.SQLXMLãçæããã«ã¯ã@SQLXMLFactory
Arrayã®çæ¶
æ»ãå€ã®å㯠java.sql.Array ããã©ã¡ãŒã¿ã¯1ã€ã®é ååã§ãªããã°ãããŸããã åŒæ°ã¯ null ã§ãã£ãŠã¯ãããŸããã
@ArrayFactory ã® typeName èŠçŽ ã«ã¯ããŒã¿ããŒã¹ã®ååãæå®ããŸãã
@ArrayFactory(typeName = "integer")
Array createIntegerArray(Integer[] elements);
Blobã®çæ¶
æ»ãå€ã®å㯠java.sql.Blob ããã©ã¡ãŒã¿ã®æ°ã¯0ã§ãªããã°ãããŸããã
@BlobFactory
Blob createBlob();
Clobã®çæ¶
æ»ãå€ã®å㯠java.sql.Clob ããã©ã¡ãŒã¿ã®æ°ã¯0ã§ãªããã°ãããŸããã
@ClobFactory
Clob createClob();
NClobã®çæ¶
æ»ãå€ã®å㯠java.sql.NClob ããã©ã¡ãŒã¿ã®æ°ã¯0ã§ãªããã°ãããŸããã
@NClobFactory
NClob createNClob();
SQLXMLã®çæ¶
æ»ãå€ã®å㯠java.sql.SQLXML ããã©ã¡ãŒã¿ã®æ°ã¯0ã§ãªããã°ãããŸããã
@SQLXMLFactory
SQLXML createSQLXML();
ã¹ã¯ãªãã¶
ç®æ¬¡
SQLã¹ã¯ãªããã®å®è¡ãè¡ãã«ã¯ã @Script ãDaoã®ã¡ãœããã«æ³šéããŸãã
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Script
void createTable();
...
}
ã¡ãœããã®æ»ãå€ã®å㯠void ã§ãªããã°ãããŸããããã©ã¡ãŒã¿ã®æ°ã¯0ã§ãªããã°ãããŸããã
ãŸããã¡ãœããã«å¯Ÿå¿ããã¹ã¯ãªãããã¡ã€ã«ãå¿ é ã§ãã
ã¹ã¯ãªãããã¡ã€ã«Â¶
ã¹ã¯ãªãããã¡ã€ã«ã§ã¯ã Dialect ãæäŸããRDBMSåãåºåãæåã䜿çšãããŸãã
ããŒã¿ããŒã¹ | Dialectã®åå | RDBMSå | åºåãæå |
---|---|---|---|
DB2 | Db2Dialect | db2 | @ |
H2 Database Engine 1.2.126 | H212126Dialect | h2 | |
H2 Database | H2Dialect | h2 | |
HSQLDB | HsqldbDialect | hsqldb | |
Microsoft SQL Server 2008 | Mssql2008Dialect | mssql | GO |
Microsoft SQL Server | MssqlDialect | mssql | GO |
MySQL | MySqlDialect | mysql | / |
Oracle Database | OracleDialect | oracle | / |
PostgreSQL | PostgresDialect | postgres | $$ |
SQLite | SqliteDialect | sqlite |
é çœ®å Žæ¶
ã¹ã¯ãªãããã¡ã€ã«ã¯ã¯ã©ã¹ãã¹ãéã£ã META-INF ãã£ã¬ã¯ããªä»¥äžã«é 眮ããªããã°ãããŸããã
ãã¡ã€ã«åã®åœ¢åŒÂ¶
ãã¡ã€ã«åã¯ã次ã®åœ¢åŒã§ãªããã°ãããŸããã
META-INF/Daoã®ã¯ã©ã¹ã®å®å
šä¿®é£Ÿåããã£ã¬ã¯ããªã«å€æãããã®/Daoã®ã¡ãœããå.script
äŸãã°ã Daoã®ã¯ã©ã¹ã aaa.bbb.EmployeeDao ã§ãããã³ã°ãããã¡ãœããã createTable ã®å Žåããã¹åã¯æ¬¡ã®ããã«ãªããŸãã
META-INF/aaa/bbb/EmployeeDao/createTable.script
è€æ°ã®RDBMSã«å¯Ÿå¿ããå¿ èŠãããç¹å®ã®RDBMSã§ã¯å¥ã®ã¹ã¯ãªãããã¡ã€ã«ã䜿ãããå Žåã .script ã®åã«ãã€ãã³åºåãã§RDBMSåãå ¥ããããšã§ã åªå çã«äœ¿çšãããã¡ã€ã«ãæ瀺ã§ããŸãã ããšãã°ãPostgreSQLå°çšã®SQLãã¡ã€ã«ã¯æ¬¡ã®ååã«ããŸãã
META-INF/aaa/bbb/EmployeeDao/createTables-postgres.script
ãã®å ŽåãPostgreSQLã䜿çšããŠããå Žåã«éãã META-INF/aaa/bbb/EmployeeDao/createTable.script ããã META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script ãåªå çã«äœ¿çšãããŸãã
ãšã³ã³ãŒãã£ã³ã°Â¶
ã¹ã¯ãªãããã¡ã€ã«ã®ãšã³ã³ãŒãã£ã³ã°ã¯UTF-8ã§ãªããã°ãããŸããã
åºåãæå¶
ã¹ã¯ãªãããã¡ã€ã«ã®åºåãæåã«ã¯ã ã¹ããŒãã¡ã³ãã®åºåãæåãšãããã¯ã®åºåãæåã®2çš®é¡ããããŸãã
ã¹ããŒãã¡ã³ãã®åºåãæåã¯ã»ãã³ãã³ ; ã§ãã
ãããã¯ã®åºåãæåã¯ã Dialect ãæäŸããå€ã䜿çšãããŸãã
ãããã¯ã®åºåãæåã¯ãã¢ãããŒã·ã§ã³ã® blockDelimiter èŠçŽ ã§æ瀺ããããšãã§ããŸãã ã¢ãããŒã·ã§ã³ã§æå®ããå Žåã Dialect ã®å€ãããåªå ãããŸãã
@Script(blockDelimiter = "GO")
void createTable();
ãšã©ãŒçºçæã®ç¶ç¶å®è¡Â¶
ããã©ã«ãã§ã¯ãã¹ã¯ãªããäžã®ã©ããã®SQLã®å®è¡ã倱æããã°ã åŠçã¯ããã§æ¢ãŸããŸãã ããããã¢ãããŒã·ã§ã³ã® haltOnError èŠçŽ ã« false ãæå®ããããšã§ããšã©ãŒçºçæã«åŠçãç¶ç¶ãããããšãã§ããŸãã
@Script(haltOnError = false)
void createTable();
èšè¿°äŸÂ¶
ã¹ã¯ãªãããã¡ã€ã«ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã ãã®äŸã¯ãOracle Databaseã«æå¹ãªã¹ã¯ãªããã§ãã
/*
* ããŒãã«å®çŸ©ïŒSQLã¹ããŒãã¡ã³ãïŒ
*/
create table EMPLOYEE (
ID numeric(5) primary key, -- èå¥å
NAME varchar2(20) -- åå
);
/*
* ããŒã¿ã®è¿œå ïŒSQLã¹ããŒãã¡ã³ãïŒ
*/
insert into EMPLOYEE (ID, NAME) values (1, 'SMITH');
/*
* ããã·ãŒãžã£ãŒå®çŸ©ïŒSQLãããã¯ïŒ
*/
create or replace procedure proc
( cur out sys_refcursor,
employeeid in numeric
) as
begin
open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/
/*
* ããã·ãŒãžã£ãŒå®çŸ©2ïŒSQLãããã¯ïŒ
*/
create or replace procedure proc2
( cur out sys_refcursor,
employeeid in numeric
) as
begin
open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/
ã³ã¡ã³ãã¯1è¡ã³ã¡ã³ã -- ãšãããã¯ã³ã¡ã³ã /* */ ã®2çš®é¡ã䜿çšã§ããŸãã ã³ã¡ã³ãã¯åãé€ãããŠããŒã¿ããŒã¹ãžçºè¡ãããŸãã
1ã€ã®SQLã¹ããŒãã¡ã³ãã¯è€æ°è¡ã«åããŠèšè¿°ã§ããŸãã ã¹ããŒãã¡ã³ãã¯ã»ãã³ãã³ ; ã§åºåããªããã°ãããŸããã æ¹è¡ã¯ã¹ããŒãã¡ã³ãã®åºåããšã¯ã¿ãªãããŸããã
ã¹ãã¢ãããã·ãŒãžã£ãŒãªã©ã®ãããã¯ã®åºåãã¯ã Dialect ã®ããã©ã«ãã®å€ãã @Script ã® blockDelimiter èŠçŽ ã«æå®ããå€ã䜿çšããŠç€ºããŸãã ãã®äŸã§ã¯ã OracleDialect ã®ããã©ã«ãã®åºåãæåã§ããã¹ã©ãã·ã¥ / ã䜿çšããŠããŸãã ãããã¯ã® åºåãæåã¯è¡é ã«èšè¿°ãã åºåãæåã®åŸãã«ã¯äœãèšè¿°ããªãããã«ããŠãã ããã ã€ãŸããåºåãæåã ãã®è¡ãšããªããã°ãããŸããã
SQL ã®ãã°åºå圢åŒÂ¶
@Script ã® sqlLog èŠçŽ ã« SQL ã®ãã°åºå圢åŒãæå®ã§ããŸãã
@Script(sqlLog = SqlLogType.RAW)
void createTable();
SqlLogType.RAW ã¯ãã€ã³ããã©ã¡ãŒã¿ïŒ?ïŒä»ãã® SQL ããã°åºåããããšãè¡šããŸãã
ã¯ãšãªãã«ã¶
ç®æ¬¡
org.seasar.doma.jdbc.builder ããã±ãŒãžã§ã¯ã ããã°ã©ã ã§SQLãçµã¿ç«ãŠãããã®ã¯ãšãªãã«ããæäŸããŠããŸãã
äœããã®çç±ã«ãã ã¯ãšãª ã®å©çšãé£ããå Žåã«ã®ã¿ã ã¯ãšãªãã«ããå©çšããããšãæšå¥šããŸãã ãŸããã¯ãšãªãã«ã㯠ããã©ã«ãã¡ãœãã ã®äžã§äœ¿çšããããšãæšå¥šããŸãã
ã©ã®ã¯ãšãªãã«ãããã€ã³ã¹ã¿ã³ã¹ã¯ Config åã®åŒæ°ããšã static 㪠newInstance ã¡ãœããã§çæã§ããŸãã ã€ã³ã¹ã¿ã³ã¹ã«ã¯ã sql ã¡ãœããã§SQLæååã®æçãã param ã¡ãœããã§ãã©ã¡ãŒã¿ã®åãšãã©ã¡ãŒã¿ãæž¡ããŸãã
æ€çŽ¢Â¶
æ€çŽ¢ã«ã¯ã SelectBuilder ã¯ã©ã¹ã䜿çšããŸãã
å©çšäŸã¯æ¬¡ã®ãšããã§ãã
SelectBuilder builder = SelectBuilder.newInstance(config);
builder.sql("select");
builder.sql("id").sql(",");
builder.sql("name").sql(",");
builder.sql("salary");
builder.sql("from Emp");
builder.sql("where");
builder.sql("name like ").param(String.class, "S%");
builder.sql("and");
builder.sql("age > ").param(int.class, 20);
Emp emp = builder.getEntitySingleResult(Emp.class);
çµã¿ç«ãŠãSQLã®ããã€ãã®æ¹æ³ã§ååŸã§ããŸãã
1件ååŸÂ¶
- getScalarSingleResult
- getOptionalScalarSingleResult
- getEntitySingleResult
- getOptionalEntitySingleResult
- getMapSingleResult
- getOptionalMapSingleResult
è€æ°ä»¶ååŸÂ¶
- getScalarResultList
- getOptionalScalarResultList
- getEntityResultList
- getMapResultList
ã€ãã¬ãŒãæ€çŽ¢Â¶
- iterateAsScalar
- iterateAsOptionalScalar
- iterateAsEntity
- iterateAsMap
ã¹ããªãŒã æ€çŽ¢Â¶
- streamAsScalar
- streamAsOptionalScalar
- streamAsEntity
- streamAsMap
æ¿å ¥Â¶
æ¿å ¥ã«ã¯ã InsertBuilder ã¯ã©ã¹ã䜿çšããŸãã
å©çšäŸã¯æ¬¡ã®ãšããã§ãã
InsertBuilder builder = InsertBuilder.newInstance(config);
builder.sql("insert into Emp");
builder.sql("(name, salary)");
builder.sql("values (");
builder.param(String.class, "SMITH").sql(", ");
builder.param(BigDecimal.class, new BigDecimal(1000)).sql(")");
builder.execute();
çµã¿ç«ãŠãSQL㯠execute ã¡ãœããã§å®è¡ã§ããŸãã
æŽæ°Â¶
æŽæ°ã«ã¯ã UpdateBuilder ã¯ã©ã¹ã䜿çšããŸãã
å©çšäŸã¯æ¬¡ã®ãšããã§ãã
UpdateBuilder builder = UpdateBuilder.newInstance(config);
builder.sql("update Emp");
builder.sql("set");
builder.sql("name = ").param(String.class, "SMIHT").sql(",");
builder.sql("salary = ").param(BigDecimal.class, new BigDecimal("1000"));
builder.sql("where");
builder.sql("id = ").param(int.class, 10);
builder.execute();
çµã¿ç«ãŠãSQL㯠execute ã¡ãœããã§å®è¡ã§ããŸãã
åé€Â¶
åé€ã«ã¯ã DeleteBuilder ã¯ã©ã¹ã䜿çšããŸãã
å©çšäŸã¯æ¬¡ã®ãšããã§ãã
DeleteBuilder builder = DeleteBuilder.newInstance(config);
builder.sql("delete from Emp");
builder.sql("where");
builder.sql("name = ").param(String.class, "SMITH");
builder.sql("and");
builder.sql("salary = ").param(BigDecimal.class, new BigDecimal(1000));
builder.execute();
çµã¿ç«ãŠãSQL㯠execute ã¡ãœããã§å®è¡ã§ããŸãã
SQL¶
SQL ãã³ãã¬ãŒã¶
SQL 㯠SQL ãã³ãã¬ãŒãã䜿çšããŠèšè¿°ããŸãã
SQL ãã³ãã¬ãŒãã®ææ³ã¯ SQL ã®ãããã¯ã³ã¡ã³ã /* */ ãããŒã¹ã«ãããã®ã§ ãããã1ã€ã®ãã³ãã¬ãŒãã¯æ¬¡ã®2ã€ã®æ¹æ³ã§äœ¿çšã§ããŸãã
- Doma ã§ãã³ãã¬ãŒãã®ææ³ã解éãåçã«SQLãçµã¿ç«ãŠãŠå®è¡ãã
- SQL ã®ããŒã«ã§ãã³ãã¬ãŒãã®ææ³ã¯ã³ã¡ã³ãã¢ãŠãããããã®ãšã㊠éç㪠SQL ãå®è¡ãã
ãã®ç¹åŸŽã¯ 2-way SQL ãšåŒã°ããããšããããŸãã
SQL ãã³ãã¬ãŒãã¯ãã¡ã€ã«ã«èšè¿°ããŠDaoã®ã¡ãœããã«ãããã³ã°ããå¿ èŠããããŸãã
ããšãã°ã SQL ãã¡ã€ã«ã«ã¯æ¬¡ã®ãã㪠SQL ãã³ãã¬ãŒããæ ŒçŽããŸãã
select * from employee where employee_id = /* employeeId */99
ããã§ã¯ããããã¯ã³ã¡ã³ãã§å²ãŸãã employeeId ãDaoã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœããã®ãã©ã¡ãŒã¿ã«å¯Ÿå¿ãã çŽåŸã® 99 ã¯ãã¹ãçšã®ããŒã¿ã«ãªããŸãã ãã¹ãçšã®ããŒã¿ã¯ã Doma ã«è§£éãããŠå®è¡ãããå Žåã«ã¯äœ¿çšãããŸããã SQL ã®ããŒã«ã«ããéçãªå®è¡æã«ã®ã¿äœ¿çšãããŸãã
察å¿ããDaoã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœããã¯æ¬¡ã®ãšããã§ãã
Employee selectById(employeeId);
ã¢ãããŒã·ã§ã³Â¶
SQLãã¡ã€ã«ãšDaoã®ã¡ãœããã®ãããã³ã°ã¯æ¬¡ã®ã¢ãããŒã·ã§ã³ã§ç€ºããŸãã
- @Select
- @Insert(sqlFile = true)
- @Update(sqlFile = true)
- @Delete(sqlFile = true)
- @BatchInsert(sqlFile = true)
- @BatchUpdate(sqlFile = true)
- @BaatchDelete(sqlFile = true)
SQLãã¡ã€ã«Â¶
ãšã³ã³ãŒãã£ã³ã°Â¶
SQLãã¡ã€ã«ã®ãšã³ã³ãŒãã£ã³ã°ã¯UTF-8ã§ãªããã°ãããŸããã
é çœ®å Žæ¶
SQLãã¡ã€ã«ã¯ã¯ã©ã¹ãã¹ãéã£ã META-INF ãã£ã¬ã¯ããªä»¥äžã«é 眮ããªããã°ãããŸããã
ãã¡ã€ã«åã®åœ¢åŒÂ¶
ãã¡ã€ã«åã¯ã次ã®åœ¢åŒã§ãªããã°ãããŸããã
META-INF/Daoã®ã¯ã©ã¹ã®å®å
šä¿®é£Ÿåããã£ã¬ã¯ããªã«å€æãããã®/Daoã®ã¡ãœããå.sql
äŸãã°ã Daoã®ã¯ã©ã¹ã aaa.bbb.EmployeeDao ã§ãããã³ã°ãããã¡ãœããã selectById ã®å Žåããã¹åã¯æ¬¡ã®ããã«ãªããŸãã
META-INF/aaa/bbb/EmployeeDao/selectById.sql
è€æ°ã® RDBMS ã䜿çšããç°å¢äžã§ç¹å®ã® RDBMS ã§ã¯å¥ã® SQL ãã¡ã€ã«ã䜿ãããå Žåã æ¡åŒµå .sql ã®åã«ãã€ãã³åºåã㧠RDBMS åãå ¥ããããšã§ã åªå çã«äœ¿çšãããã¡ã€ã«ãæ瀺ã§ããŸãã ããšãã°ãPostgreSQLå°çšã®SQLãã¡ã€ã«ã¯æ¬¡ã®ååã«ããŸãã
META-INF/aaa/bbb/EmployeeDao/selectById-postgres.sql
ãã®äŸã§ã¯PostgreSQLã䜿çšããŠããå Žåã«éãã META-INF/aaa/bbb/EmployeeDao/selectById.sql ããã META-INF/aaa/bbb/EmployeeDao/selectById-postgres.sql ãåªå çã«äœ¿çšãããŸãã
RDBMS åã¯ã Dialect ã® getName ã¡ãœããã®å€ã䜿çšãããŸãã ãããããçšæããã Dialect ã«ã€ããŠããããã® RDBMS åã以äžã®è¡šã«ç€ºããŸãã
ããŒã¿ããŒã¹ | Dialect | RDBMS å |
---|---|---|
DB2 | Db2Dialect | db2 |
H2 Database Engine 1.2.126 | H212126Dialect | h2 |
H2 Database | H2Dialect | h2 |
HSQLDB | HsqldbDialect | hsqldb |
Microsoft SQL Server 2008 | Mssql2008Dialect | mssql |
Microsoft SQL Server | MssqlDialect | mssql |
MySQL | MySqlDialect | mysql |
Oracle Database | OracleDialect | oracle |
PostgreSQL | PostgresDialect | postgres |
SQLite | SqliteDialect | sqlite |
SQL ã³ã¡ã³ã¶
SQL ã³ã¡ã³ãäžã«åŒãèšè¿°ããããšã§å€ã®ãã€ã³ãã£ã³ã°ãæ¡ä»¶åå²ãè¡ããŸãã Doma ã«è§£éãããSQLã³ã¡ã³ãã åŒã³ã¡ã³ã ãšåŒã³ãŸãã
åŒã³ã¡ã³ãã«ã¯ä»¥äžã®ãã®ããããŸãã
- ãã€ã³ãå€æ°ã³ã¡ã³ã
- åã蟌ã¿å€æ°ã³ã¡ã³ã
- æ¡ä»¶ã³ã¡ã³ã
- ç¹°ãè¿ãã³ã¡ã³ã
- ã«ã©ã ãªã¹ãå±éã³ã¡ã³ã
ããŒã
åŒã³ã¡ã³ãã«èšè¿°ã§ããåŒã®ææ³ã«ã€ããŠã¯ åŒèšèª ãåç §ããŠãã ããã
ãã€ã³ãå€æ°ã³ã¡ã³ã¶
ãã€ã³ãå€æ°ã瀺ãåŒã³ã¡ã³ãã ãã€ã³ãå€æ° ã³ã¡ã³ããšåŒã³ãŸãã ãã€ã³ãå€æ°ã¯ã java.sql.PreparedStatement ãä»ããŠSQLã«èšå®ãããŸãã
ãã€ã³ãå€æ°ã¯ /*ïœ*/ ãšãããããã¯ã³ã¡ã³ãã§å²ãã§ç€ºããŸãã ãã€ã³ãå€æ°ã®ååã¯Daoã¡ãœããã®ãã©ã¡ãŒã¿åã«å¯Ÿå¿ããŸãã 察å¿ãããã©ã¡ãŒã¿ã®å㯠åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã§ãªããã°ãããŸããã ãã€ã³ãå€æ°ã³ã¡ã³ãã®çŽåŸã«ã¯ãã¹ãçšããŒã¿ãæå®ããå¿ èŠããããŸãã ãã ãããã¹ãçšããŒã¿ã¯å®è¡æã«ã¯äœ¿çšãããŸããã
åºæ¬åãããã¯ãã¡ã€ã³ã¯ã©ã¹åã®ãã©ã¡ãŒã¿Â¶
Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœããã®ãã©ã¡ãŒã¿ã åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã®å Žåã ãã®ãã©ã¡ãŒã¿ã¯1ã€ã®ãã€ã³ãå€æ°ãè¡šçŸã§ããŸãã ãã€ã³ãå€æ°ã³ã¡ã³ãã¯ãã€ã³ãå€æ°ãåã蟌ã¿ããå Žæã«èšè¿°ãã ãã€ã³ãå€æ°ã³ã¡ã³ãã®çŽåŸã«ã¯ãã¹ãçšããŒã¿ãæå®ããªããã°ãããŸããã Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœãããšå¯Ÿå¿ãã SQL ã®äŸã¯æ¬¡ã®ãšããã§ãã
Employee selectById(Integer employeeId);
select * from employee where employee_id = /* employeeId */99
Iterableåã®ãã©ã¡ãŒã¿Â¶
Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœããã®ãã©ã¡ãŒã¿ã java.lang.Iterable ã®ãµãã¿ã€ãã®å Žåã ãã®ãã©ã¡ãŒã¿ã¯ã INå¥å ã®è€æ°ã®ãã€ã³ãå€æ°ãè¡šçŸã§ããŸãã ãã ãã java.lang.Iterable ã®ãµãã¿ã€ãã®å®ååŒæ°ã¯ åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã§ãªããã°ãããŸããã ãã€ã³ãå€æ°ã³ã¡ã³ãã¯INããŒã¯ãŒãã®çŽåŸã«çœ®ãã ãã€ã³ãå€æ°ã³ã¡ã³ãã®çŽåŸã«ã¯æ¬åŒ§ã€ãã§ãã¹ãçšããŒã¿ãæå®ããªããã°ãããŸããã Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœãããšå¯Ÿå¿ãã SQL ã®äŸã¯æ¬¡ã®ãšããã§ãã
List<Employee> selectByIdList(List<Integer> employeeIdList);
select * from employee where employee_id in /* employeeIdList */(1,2,3)
Iterable ã空ã§ãããšããINå¥ã®æ¬åŒ§å ã®å€ã¯ null ã«ãªããŸãã
select * from employee where employee_id in (null)
ä»»æã®åã®ãã©ã¡ãŒã¿Â¶
Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœããã®ãã©ã¡ãŒã¿ã åºæ¬å ããã㯠ãã¡ã€ã³ã¯ã©ã¹ ã§ãªãå Žåã ãã©ã¡ãŒã¿ã¯è€æ°ã®ãã€ã³ãå€æ°ã³ã¡ã³ãã«å¯Ÿå¿ããŸãã ãã€ã³ãå€æ°ã³ã¡ã³ãã®äžã§ã¯ãããã . ã䜿çšãä»»æã®åã®ãã£ãŒã«ããã¡ãœããã«ã¢ã¯ã»ã¹ã§ããŸãã Dao ã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœãããšå¯Ÿå¿ãã SQL ã®äŸã¯æ¬¡ã®ãšããã§ãã
EmployeeDto ã¯ã©ã¹ã«ã¯ã employeeName ãã£ãŒã«ãã salary ãã£ãŒã«ããååšãããã®ãšããŸãã
List<Employee> selectByNameAndSalary(EmployeeDto dto);
select * from employee
where
employee_name = /* dto.employeeName */'abc'
and
salary = /* dto.salary */1234
ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ãã代ããã« public ãªã¡ãœãããåŒã³åºãããšãå¯èœã§ãã
select * from employee
where
salary = /* dto.getTaxedSalary() */1234
åã蟌ã¿å€æ°ã³ã¡ã³ã¶
åã蟌ã¿å€æ°ã瀺ãåŒã³ã¡ã³ããåã蟌ã¿å€æ°ã³ã¡ã³ããšåŒã³ãŸãã åã蟌ã¿å€æ°ã®å€ã¯ SQL ãçµã¿ç«ãŠãéã« SQL ã®äžéšãšããŠçŽæ¥åã蟌ãŸããŸãã
SQL ã€ã³ãžã§ã¯ã·ã§ã³ãé²ããããåã蟌ã¿å€æ°ã®å€ã«ä»¥äžã®å€ãå«ããããšã¯çŠæ¢ããŠããŸãã
- ã·ã³ã°ã«ã¯ã©ããŒã·ã§ã³
- ã»ãã³ãã³
- è¡ã³ã¡ã³ã
- ãããã¯ã³ã¡ã³ã
åã蟌ã¿å€æ°ã¯ /*#ïœ*/ ãšãããããã¯ã³ã¡ã³ãã§ç€ºããŸãã åã蟌ã¿å€æ°ã®åå㯠Dao ã¡ãœããã®ãã©ã¡ãŒã¿åã«ãããã³ã°ãããŸãã åã蟌ã¿å€æ°ã¯ ORDER BY å¥ãªã© SQL ã®äžéšãããã°ã©ã ã§çµã¿ç«ãŠããå Žåã«äœ¿çšã§ããŸãã Dao ã®ã¡ãœãããšå¯Ÿå¿ãã SQL ã®äŸã¯æ¬¡ã®ãšããã§ãã
List<Employee> selectAll(BigDecimal salary, String orderyBy);
select * from employee where salary > /* salary */100 /*# orderBy */
Dao ã®åŒã³åºãäŸã¯æ¬¡ã®éãã§ãã
EmployeeDao dao = new EmployeeDaoImpl();
BigDecimal salary = new BigDecimal(1000);
String orderBy = "order by salary asc, employee_name";
List<Employee> list = dao.selectAll(salary, orderBy);
çºè¡ããã SQL ã¯æ¬¡ã®ããã«ãªããŸãã
select * from employee where salary > ? order by salary asc, employee_name
æ¡ä»¶ã³ã¡ã³ã¶
ifãšend¶
æ¡ä»¶åå²ã瀺ãåŒã³ã¡ã³ããæ¡ä»¶ã³ã¡ã³ããšåŒã³ãŸãã æ§æã¯æ¬¡ã®ãšããã§ãã
/*%if æ¡ä»¶åŒ*/ ïœ /*%end*/
æ¡ä»¶åŒã¯çµæã boolean ããã㯠java.lang.Boolean åãšè©äŸ¡ãããåŒã§ãªããã°ãããŸããã äŸã瀺ããŸãã
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
äžèšã® SQL æ㯠employeeId ã null ã§ãªãå Žåã 次ã®ãããªæºåãããæã«å€æãããŸãã
select * from employee where employee_id = ?
ãã® SQL æ㯠employeeId ã null ã®å Žåã«æ¬¡ã®ãããªæºåãããæã«å€æãããŸãã
select * from employee
if ã®æ¡ä»¶ãæãç«ããªãå Žåã« if ã®å€ã«ãã WHEREå¥ãåºåãããªãã®ã¯ã æ¡ä»¶ã³ã¡ã³ãã«ãããWHEREãHAVINGã®èªåé€å» æ©èœãåããŠããããã§ãã
æ¡ä»¶ã³ã¡ã³ãã«ãããWHEREãHAVINGã®èªåé€å»Â¶
æ¡ä»¶ã³ã¡ã³ãã䜿çšããå Žåãæ¡ä»¶ã®åã«ãã WHERE ã HAVING ã«ã€ããŠèªåã§åºåã®èŠ/äžèŠãå€å®ããŸãã ããšãã°ã次ã®ãããªSQL㧠employeeId ã null ã®å Žåã
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
/*%if ïœ*/ ã®åã® where ã¯èªåã§é€å»ããã次ã®SQLãçæãããŸãã
select * from employee
æ¡ä»¶ã³ã¡ã³ãã«ãããANDãORã®èªåé€å»Â¶
æ¡ä»¶ã³ã¡ã³ãã䜿çšããå Žåãæ¡ä»¶ã®åŸãã«ã€ã¥ã AND ã OR ã«ã€ããŠèªåã§åºåã®èŠ/äžèŠãå€å®ããŸãã ããšãã°ã次ã®ãããªSQL㧠employeeId ã null ã®å Žåã
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
and employeeName like 's%'
/*%end*/ ã®åŸãã® and ã¯èªåã§é€å»ããã次㮠SQL ãçæãããŸãã
select * from employee where employeeName like 's%'
elseifãšelse¶
/*%if æ¡ä»¶åŒ*/ ãš /*%end*/ ã®éã§ã¯ã elseif ã else ãè¡šã次ã®æ§æã䜿çšã§ããŸãã
- /*%elseif æ¡ä»¶åŒ*/
- /*%else*/
äŸã瀺ããŸãã
select
*
from
employee
where
/*%if employeeId != null */
employee_id = /* employeeId */9999
/*%elseif department_id != null */
and
department_id = /* departmentId */99
/*%else*/
and
department_id is null
/*%end*/
äžã® SQL ã¯ã employeeId != null ãæç«ãããšãå®éã¯æ¬¡ã® SQL ã«å€æãããŸãã
select
*
from
employee
where
employee_id = ?
employeeId == null && department_id != null ãæç«ãããšããå®éã¯æ¬¡ã® SQL ã«å€æãããŸãã department_id ã®çŽåã® AND ã¯èªåã§é€å»ãããããåºåãããŸããã
select
*
from
employee
where
department_id = ?
employeeId == null && department_id == null ãæç«ãããšããå®éã¯æ¬¡ã® SQL ã«å€æãããŸãã department_id ã®çŽåã® AND ã¯èªåã§é€å»ãããããåºåãããŸããã
select
*
from
employee
where
department_id is null
ãã¹ãããæ¡ä»¶ã³ã¡ã³ã¶
æ¡ä»¶ã³ã¡ã³ãã¯ãã¹ããããããšãã§ããŸãã
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%if employeeName != null */
and
employee_name = /* employeeName */'hoge'
/*%else*/
and
employee_name is null
/*%end*/
/*%end*/
æ¡ä»¶ã³ã¡ã³ãã«ãããå¶çŽÂ¶
æ¡ä»¶ã³ã¡ã³ãã® if ãš end ã¯SQLã®åãç¯ã«å«ãŸããªããã°ãããŸããã ç¯ãšã¯ã SELECTç¯ãFROMç¯ãWHEREç¯ãGROUP BYç¯ãHAVINGç¯ãORDER BYç¯ãªã©ã§ãã 次ã®äŸã§ã¯ã if ãFROMç¯ã«ãã end ãWHEREç¯ã«ããããäžæ£ã§ãã
select * from employee /*%if employeeId != null */
where employee_id = /* employeeId */99 /*%end*/
ãŸãã if ãš end ã¯åãã¬ãã«ã®æã«å«ãŸããªããã°ãããŸããã 次ã®äŸã§ã¯ã if ãæ¬åŒ§ã®å€ã«ããendãæ¬åŒ§ã®å åŽã«ããã®ã§äžæ£ã§ãã
select * from employee
where employee_id in /*%if departmentId != null */(... /*%end*/ ...)
ç¹°ãè¿ãã³ã¡ã³ã¶
forãšend¶
ç¹°ãè¿ãã瀺ãåŒã³ã¡ã³ããç¹°ãè¿ãã³ã¡ã³ããšåŒã³ãŸãã æ§æã¯æ¬¡ã®ãšããã§ãã
/*%for èå¥å : åŒ*/ ïœ /*%end*/
èå¥åã¯ãç¹°ãè¿ãããèŠçŽ ãæãå€æ°ã§ãã åŒã¯ java.lang.Iterable åãšããŠè©äŸ¡ãããåŒã§ãªããã°ãããŸããã äŸã瀺ããŸãã
select * from employee where
/*%for name : names */
employee_name like /* name */'hoge'
/*%if name_has_next */
/*# "or" */
/*%end */
/*%end*/
äžèšã® SQL æã¯ã names ã3ã€ã®èŠçŽ ãããªããªã¹ããè¡šãå Žåã次ã®ãããªæºåãããæã«å€æãããŸãã
select * from employee where
employee_name like ?
or
employee_name like ?
or
employee_name like ?
item_has_nextãšitem_index¶
/*%for èå¥å : åŒ*/ ãã /*%end*/ ãŸã§ã®å åŽã§ã¯æ¬¡ã®2ã€ã®ç¹å¥ãªå€æ°ã䜿çšã§ããŸãã
- item_has_next
- item_index
æ¥é èŸã® item ã¯èå¥åãè¡šããŸããã€ãŸãã for ã®èå¥åã name ã®å Žå ãã®å€æ°ã¯ãããã name_has_next ãš name_index ãšãªããŸãã
item_has_next ã¯æ¬¡ã®ç¹°ãè¿ãèŠçŽ ãååšãããã©ããã瀺ã boolean ã®å€ã§ãã
item_index ã¯ç¹°ãè¿ãã®indexãè¡šã int ã®å€ã§ããå€ã¯0å§ãŸãã§ãã
ç¹°ãè¿ãã³ã¡ã³ãã«ãããWHEREãHAVINGã®èªåé€å»Â¶
ç¹°ãè¿ãã³ã¡ã³ãã䜿çšããå Žåãã³ã¡ã³ãã®åã«ãã WHERE ã HAVING ã«ã€ããŠèªåã§åºåã®èŠ/äžèŠãå€å®ããŸãã ããšãã°ã次ã®ãã㪠SQL 㧠names ã® size ã 0 ã®å ŽåïŒç¹°ãè¿ããè¡ãããªãå ŽåïŒã
select * from employee where
/*%for name : names */
employee_name like /* name */'hoge'
/*%if name_has_next */
/*# "or" */
/*%end */
/*%end*/
/*%for ïœ*/ ã®åã® where ã¯èªåã§é€å»ããã次㮠SQL ãçæãããŸãã
select * from employee
ç¹°ãè¿ãã³ã¡ã³ãã«ãããANDãORã®èªåé€å»Â¶
ç¹°ãè¿ãã³ã¡ã³ãã䜿çšããå Žåãã³ã¡ã³ãã®åŸãã«ã€ã¥ã AND ã OR ã«ã€ããŠèªåã§åºåã®èŠ/äžèŠãå€å®ããŸãã ããšãã°ã次ã®ãã㪠SQL 㧠names ã® size ã 0 ã®å ŽåïŒç¹°ãè¿ããè¡ãããªãå ŽåïŒã
select * from employee where
/*%for name : names */
employee_name like /* name */'hoge'
/*%if name_has_next */
/*# "or" */
/*%end */
/*%end*/
or
salary > 1000
/*%end*/ ã®åŸãã® or ã¯èªåã§é€å»ããã次ã®SQLãçæãããŸãã
select * from employee where salary > 1000
ç¹°ãè¿ãã³ã¡ã³ãã«ãããå¶çŽÂ¶
ç¹°ãè¿ãã³ã¡ã³ãã® for ãš end 㯠SQL ã®åãç¯ã«å«ãŸããªããã°ãããŸããã ç¯ãšã¯ãSELECTç¯ãFROMç¯ãWHEREç¯ãGROUP BYç¯ãHAVINGç¯ãORDER BYç¯ãªã©ã§ãã
ãŸãã for ãš end ã¯åãã¬ãã«ã®æã«å«ãŸããªããã°ãããŸããã ã€ãŸããæ¬åŒ§ã®å€ã§ for ãæ¬åŒ§ã®å åŽã§ end ãšããèšè¿°ã¯èªããããŸããã
ã«ã©ã ãªã¹ãå±éã³ã¡ã³ã¶
expand¶
SELECTç¯ã®ã¢ã¹ã¿ãªã¹ã¯ * ã ãšã³ãã£ãã£ã¯ã©ã¹ ã®å®çŸ©ã åç §ããŠèªåã§ã«ã©ã ã®ãªã¹ãã«å±éããåŒãã«ã©ã ãªã¹ãå±éã³ã¡ã³ããšåŒã³ãŸãã æ§æã¯æ¬¡ã®ãšããã§ãã
/*%expand ãšã€ãªã¢ã¹*/
ãšã€ãªã¢ã¹ã¯æååãšããŠè©äŸ¡ãããåŒã§ãªããã°ãããŸããã ãšã€ãªã¢ã¹ã¯çç¥å¯èœã§ãã
ãã®ã³ã¡ã³ãã®çŽåŸã«ã¯ã¢ã¹ã¿ãªã¹ã¯ * ãå¿ é ã§ãã
äŸã瀺ããŸãã
select /*%expand*/* from employee
äžèšã®SQLæã®çµæã次ã®ãã㪠ãšã³ãã£ãã£ã¯ã©ã¹ ã«ãããã³ã°ãããŠãããã®ãšããŸãã
@Entity
public class Employee {
Integer id;
String name;
Integer age;
}
ãã®ãšãã SQL ã¯ä»¥äžã®ããã«å€æãããŸãã
select id, name, age from employee
SQL äžã§ããŒãã«ã«ãšã€ãªã¢ã¹ãæå®ããå Žåã ã«ã©ã ãªã¹ãå±éã³ã¡ã³ãã«ãåããšã€ãªã¢ã¹ãæå®ããŠãã ããã
select /*%expand "e" */* from employee e
ãã®ãšãã SQL ã¯ä»¥äžã®ããã«å€æãããŸãã
select e.id, e.name, e.age from employee e
éåžžã®ãããã¯ã³ã¡ã³ã¶
/* ã®çŽåŸã«ç¶ã3æåç®ãJavaã®èå¥åã®å é ã§äœ¿çšã§ããªãæå ïŒãã ãã空çœããã³åŒã§ç¹å¥ãªæå³ãã〠%ã#ã @ã "ã ' ã¯é€ãïŒã®å Žåã ããã¯éåžžã®ãããã¯ã³ã¡ã³ãã ãšã¿ãªãããŸãã
ããšãã°ã次ã®äŸã¯ãã¹ãŠéåžžã®ãããã¯ã³ã¡ã³ãã§ãã
/**ïœ*/
/*+ïœ*/
/*=ïœ*/
/*:ïœ*/
/*;ïœ*/
/*(ïœ*/
/*)ïœ*/
/*&ïœ*/
äžæ¹ã次ã®äŸã¯ãã¹ãŠåŒã³ã¡ã³ãã ãšã¿ãªãããŸãã
/* ïœ*/ ...--3æåç®ã空çœã§ããããåŒã³ã¡ã³ãã§ãã
/*aïœ*/ ...--3æåç®ãJavaã®èå¥åã®å
é ã§äœ¿çšå¯èœãªæåã§ããããåŒã³ã¡ã³ãã§ãã
/*$ïœ*/ ...--3æåç®ãJavaã®èå¥åã®å
é ã§äœ¿çšå¯èœãªæåã§ããããåŒã³ã¡ã³ãã§ãã
/*%ïœ*/ ...--3æåç®ãæ¡ä»¶ã³ã¡ã³ããç¹°ãè¿ãã³ã¡ã³ãã®å§ãŸããè¡šãã%ãã§ããããåŒã³ã¡ã³ãã§ãã
/*#ïœ*/ ...--3æåç®ãåã蟌ã¿å€æ°ã³ã¡ã³ããè¡šãã#ãã§ããããåŒã³ã¡ã³ãã§ãã
/*@ïœ*/ ...--3æåç®ãçµã¿èŸŒã¿é¢æ°ãããã¯ã¯ã©ã¹åãè¡šãã@ãã§ããããåŒã³ã¡ã³ãã§ãã
/*"ïœ*/ ...--3æåç®ãæååãªãã©ã«ã®åŒçšç¬Šãè¡šãã"ãã§ããããåŒã³ã¡ã³ãã§ãã
/*'ïœ*/ ...--3æåç®ãæåãªãã©ã«ã®åŒçšç¬Šãè¡šãã'ãã§ããããåŒã³ã¡ã³ãã§ãã
ããŒã
ç¹ã«çç±ããªãå Žåãéåžžã®ãããã¯ã³ã¡ã³ãã«ã¯ æåã®ã¢ã¹ã¿ãªã¹ã¯ã2ã€éãã /**ïœ*/ ã䜿çšããã®ãããã§ãããã
éåžžã®è¡ã³ã¡ã³ã¶
-- ã¯éåžžã®è¡ã³ã¡ã³ãã ãšã¿ãªãããŸãã
Domaã§ã¯è¡ã³ã¡ã³ããç¹å¥ã«è§£éããããšã¯ãããŸããã
åŒèšèªÂ¶
ç®æ¬¡
- åŒèšèª
- ãªãã©ã«
- æ¯èŒæŒç®å
- è«çæŒç®å
- ç®è¡æŒç®å
- é£çµæŒç®å
- ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®åŒã³åºã
- ã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹
- staticã¡ãœããã®åŒã³åºã
- staticãã£ãŒã«ããžã®ã¢ã¯ã»ã¹
- çµã¿èŸŒã¿é¢æ°ã®äœ¿çš
- ã«ã¹ã¿ã é¢æ°ã®äœ¿çš
SQL äžã®åŒã³ã¡ã³ãã«ã¯ç°¡æãªåŒãèšè¿°ã§ããŸãã ææ³ã¯Javaãšã»ãšãã©åãã§ãã ãã ããJavaã§å¯èœãªããšãã¹ãŠãã§ããããã§ã¯ãããŸããã
ããŒã
ç¹ã«å€§ããªéãã¯ã java.util.Optional ãªã©ã®ãªãã·ã§ãã«ãªåã®æ±ãæ¹ã«ãããŸãã åŒã®äžã§ã¯ã Optional åã®å€ã¯åžžã«ãã®èŠçŽ ã®åã®å€ã«èªåå€æãããŸãã ããšãã°ã Optional<String> åã®å€ã¯ String åã®å€ãšããŠæ±ãããŸãã ãããã£ãŠã Optional åã®ã¡ãœãããåŒã³åºãããã Optional åããã©ã¡ãŒã¿ãšããã¡ãœããã®åŒã³åºãã¯ã§ããŸããã
å€ã®ååšã®æç¡ã確èªããå Žåã¯ã /*%if optional.isPresent() */ ãšããæ¿ããã« /*%if optional != null */ ãšããŠãã ããã
java.util.OptionalInt ã java.util.OptionalInt ã java.util.OptionalInt ã«ã€ããŠãåæ§ã§ãã
ãªãã©ã«Â¶
以äžã®ãªãã©ã«ãçšæãããŠããŸãã
ãªãã©ã« | å |
---|---|
null | void |
true | boolean |
false | boolean |
10 | int |
10L | long |
0.123F | float |
0.123D | double |
0.123B | java.math.BigDecimal |
‘a’ | char |
“a” | java.lang.String |
æ°å€ã®åã¯ããªãã©ã«ã®æåŸã« L ã F ãªã©ã®ãµãã£ãã¯ã¹ãä»äžããŠåºå¥ããŸãã ãµãã£ãã¯ã¹ã¯ã¯å€§æåã§ãªããã°ãããŸããã
select * from employee where
/*%if employeeName != null && employeeName.length() > 10 */
employee_name = /* employeeName */'smith'
/*%end*/
æ¯èŒæŒç®å¶
以äžã®æ¯èŒæŒç®åã䜿çšã§ããŸãã
æŒç®å | 説æ |
---|---|
== | çå€æŒç®å |
!= | äžçå€æŒç®å |
< | å°ãªãæŒç®å |
<= | å°ãªãã€ã³ãŒã«æŒç®å |
> | 倧ãªãæŒç®å |
>= | 倧ãªãã€ã³ãŒã«æŒç®å |
æ¯èŒæŒç®åãå©çšããã«ã¯ã 被æŒç®åã java.lang.Comparable ãå®è£ ããŠããå¿ èŠããããŸãã
< ã <= ã > ã >= ã§ã¯ã被æŒç®åã null ã§ãã£ãŠã¯ãããŸããã
select * from employee where
/*%if employeeName.indexOf("s") > -1 */
employee_name = /* employeeName */'smith'
/*%end*/
è«çæŒç®å¶
以äžã®è«çæŒç®åã䜿çšã§ããŸãã
æŒç®å | 説æ |
---|---|
! | è«çåŠå®æŒç®å |
&& | è«çç©æŒç®å |
|| | è«çåæŒç®å |
æ¬åŒ§ã䜿ã£ãŠãæŒç®åãé©çšãããåªå 床ãå¶åŸ¡ã§ããŸãã
select * from employee where
/*%if (departmentId == null || managerId == null) and employee_name != null */
employee_name = /* employeeName */'smith'
/*%end*/
ç®è¡æŒç®å¶
以äžã®ç®è¡æŒç®åã䜿çšã§ããŸãã
æŒç®å | 説æ |
---|---|
+ | å ç®æŒç®å |
- | æžç®æŒç®å |
* | ä¹ç®æŒç®å |
/ | é€ç®æŒç®å |
% | å°äœæŒç®å |
被æŒç®åã¯æ°å€åã§ãªããã°ãããŸããã
select * from employee where
salary = /* salary + 1000 */0
é£çµæŒç®å¶
é£çµæŒç®å + ã䜿ã£ãŠæåãé£çµã§ããŸãã
被æŒç®åã¯æ¬¡ã®ããããã®åã§ãªããã°ãããŸããã
- java.lang.String
- java.lang.Character
- char
select * from employee where
employee_name like /* employeeName + "_" */'smith'
ã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®åŒã³åºã¶
ããã . ã§åºåã£ãŠã¡ãœããåãæå®ããããšã§ã€ã³ã¹ã¿ã³ã¹ã¡ãœãããå®è¡å¯èœã§ãã å®è¡å¯èœãªã¡ãœããã¯å¯èŠæ§ãpublicãªãã®ã ãã«éãããŸãã
select * from employee where
/*%if employeeName.startsWith("s") */
employee_name = /* employeeName */'smith'
/*%end*/
åŒæ°ããªãå Žåã¯ã¡ãœããåã®åŸãã« () ãæå®ããŸãã
select * from employee where
/*%if employeeName.length() > 10 */
employee_name = /* employeeName */'smith'
/*%end*/
ã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹Â¶
ããã . ã§åºåã£ãŠãã£ãŒã«ãåãæå®ããããšã§ã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸãã å¯èŠæ§ã¯privateã§ãã£ãŠãã¢ã¯ã»ã¹å¯èœã§ãã
select * from employee where
employee_name = /* employee.employeeName */'smith'
staticã¡ãœããã®åŒã³åºã¶
@ ã§å²ãŸããã¯ã©ã¹ã®å®å šä¿®é£Ÿåã«ã¡ãœãããç¶ããããšã§staticã¡ãœãããå®è¡å¯èœã§ãã å®è¡å¯èœãªã¡ãœããã¯å¯èŠæ§ãpublicãªãã®ã ãã«éãããŸãã
select * from employee where
/*%if @java.util.regex.Pattern@matches("^[a-z]*$", employeeName) */
employee_name = /* employeeName */'smith'
/*%end*/
staticãã£ãŒã«ããžã®ã¢ã¯ã»ã¹Â¶
@ ã§å²ãŸããã¯ã©ã¹ã®å®å šä¿®é£Ÿåã«ãã£ãŒã«ããç¶ããããšã§staticãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸãã å¯èŠæ§ã¯privateã§ãã£ãŠãã¢ã¯ã»ã¹å¯èœã§ãã
select * from employee where
/*%if employeeName.length() < @java.lang.Byte@MAX_VALUE */
employee_name = /* employeeName */'smith'
/*%end*/
çµã¿èŸŒã¿é¢æ°ã®äœ¿çšÂ¶
çµã¿èŸŒã¿é¢æ°ã¯ãäž»ã«ãSQLã«ãã€ã³ãããåã«ãã€ã³ãå€æ°ã®å€ãå€æŽããããã®ãŠãŒãã£ãªãã£ã§ãã
ããšãã°ãLIKEå¥ã§åæ¹äžèŽæ€çŽ¢ãè¡ãå Žåã«æ¬¡ã®ããã«èšè¿°ã§ããŸãã
select * from employee where
employee_name like /* @prefix(employee.employeeName) */'smith' escape '$'
ããã§ã¯ã @prefix(employee.employeeName) ãšããããã«ã employee.employeeName ã @prefix é¢æ°ã«æž¡ããŠããŸãã @prefix é¢æ°ã¯ããã©ã¡ãŒã¿ã§åãåãæååãåæ¹äžèŽæ€çŽ¢çšã®æååã«å€æããŸãã ãŸããç¹å¥ãªæå³ãæã€æåããšã¹ã±ãŒãããŸãã ããšãã° employee.employeeName ã®å€ã ABC ã§ããå Žåã å€ã¯ ABC% ã«å€æãããŸãã ããã employee.employeeName ã®å€ã AB%C ãšããããã« % ãå«ãã§ããå Žåã % ã¯ããã©ã«ãã®ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ $ ã§ãšã¹ã±ãŒããããå€ã¯ AB$%C% ã«å€æãããŸãã
䜿çšå¯èœãªé¢æ°ã®ã·ã°ããã£ã¯ä»¥äžã®ãšããã§ãã
- String @escape(String text, char escapeChar = ‘$’)
- LIKEæŒç®ã®ããã®ãšã¹ã±ãŒããè¡ãããšã瀺ããŸãã æ»ãå€ã¯å ¥åå€ããšã¹ã±ãŒãããæååã§ãã escapeChar ãæå®ãããªãå Žåãããã©ã«ãã®ãšã¹ã±ãŒãæå $ ã䜿çšãããŸãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- String @prefix(String prefix, char escapeChar = ‘$’)
- åæ¹äžèŽæ€çŽ¢ãè¡ãããšã瀺ããŸãã æ»ãå€ã¯å ¥åå€ããšã¹ã±ãŒããã¯ã€ã«ãã«ãŒããåŸãã«ä»äžããæååã§ãã escapeChar ãæå®ãããªãå Žåãããã©ã«ãã®ãšã¹ã±ãŒãæå $ ã䜿çšãããŸãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- String @infix(String infix, char escapeChar = ‘$’)
- äžéäžèŽæ€çŽ¢ãè¡ãããšã瀺ããŸãã æ»ãå€ã¯å ¥åå€ããšã¹ã±ãŒããã¯ã€ã«ãã«ãŒããåãšåŸãã«ä»äžããæååã§ãã escapeChar ãæå®ãããªãå Žåãããã©ã«ãã®ãšã¹ã±ãŒãæå $ ã䜿çšãããŸãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- String @suffix(String suffix, char escapeChar = ‘$’)
- åŸæ¹äžèŽæ€çŽ¢ãè¡ãããšã瀺ããŸãã æ»ãå€ã¯å ¥åå€ããšã¹ã±ãŒããã¯ã€ã«ãã«ãŒããåã«ä»äžããæååã§ãã escapeChar ãæå®ãããªãå Žåãããã©ã«ãã®ãšã¹ã±ãŒãæå $ ã䜿çšãããŸãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.util.Date @roundDownTimePart(java.util.Date date)
- æå»éšåãåãæšãŠãããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãæšãŠãããæ°ããæ¥ä»ã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.sql.Date @roundDownTimePart(java.sql.Date date)
- æå»éšåãåãæšãŠãããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãæšãŠãããæ°ããæ¥ä»ã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.sql.Timestamp @roundDownTimePart(java.sql.Timestamp timestamp)
- æå»éšåãåãæšãŠãããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãæšãŠãããæ°ããã¿ã€ã ã¹ã¿ã³ãã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.util.Date @roundUpTimePart(java.util.Date date)
- æå»éšåãåãäžããããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãäžããããæ°ããæ¥ä»ã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.sql.Date @roundUpTimePart(java.sql.Date date)
- æå»éšåãåãäžããããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãäžããããæ°ããæ¥ä»ã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- java.sql.Timestamp @roundUpTimePart(java.sql.Timestamp timestamp)
- æå»éšåãåãäžããããšã瀺ããŸãã æ»ãå€ã¯æå»éšåãåãäžããããæ°ããã¿ã€ã ã¹ã¿ã³ãã§ãã åŒæ°ã« null ãæž¡ããå Žåã null ãè¿ããŸãã
- boolean @isEmpty(CharSequence charSequence)
- æåã·ãŒã±ã³ã¹ã null ããããã¯æåã·ãŒã±ã³ã¹ã®é·ãã 0 ã®å Žå true ãè¿ããŸãã
- boolean @isNotEmpty(CharSequence charSequence)
- æåã·ãŒã±ã³ã¹ã null ã§ãªãããã€æåã·ãŒã±ã³ã¹ã®é·ãã 0 ã§ãªãå Žå true ãè¿ããŸãã
- boolean @isBlank(CharSequence charSequence)
- æåã·ãŒã±ã³ã¹ã null ããããã¯æåã·ãŒã±ã³ã¹ã®é·ãã 0 ã ãããã¯æåã·ãŒã±ã³ã¹ã空çœã ããã圢æãããå Žå trueãè¿ããŸãã
- boolean @isNotBlank(CharSequence charSequence)
- æåã·ãŒã±ã³ã¹ã null ã§ãªãããã€æåã·ãŒã±ã³ã¹ã®é·ãã 0 ã§ãªãã ãã€æåã·ãŒã±ã³ã¹ã空çœã ãã§åœ¢æãããªãå Žå true ãè¿ããŸãã
ãããã®é¢æ°ã¯ã org.seasar.doma.expr.ExpressionFunctions ã®ã¡ãœããã«å¯Ÿå¿ããŠããŸãã
ã«ã¹ã¿ã é¢æ°ã®äœ¿çšÂ¶
é¢æ°ãç¬èªã«å®çŸ©ã䜿çšã§ããŸãã
ç¬èªã«å®çŸ©ããé¢æ°ïŒã«ã¹ã¿ã é¢æ°ïŒã䜿çšããã«ã¯æ¬¡ã®èšå®ãå¿ èŠã§ãã
- é¢æ°ã¯ã org.seasar.doma.expr.ExpressionFunctions ãå®è£ ããã¯ã©ã¹ã®ã¡ãœãããšããŠå®çŸ©ããã
- ã¡ãœããã¯publicãªã€ã³ã¹ã¿ã³ã¹ã¡ãœãããšããã
- äœæããã¯ã©ã¹ã¯ 泚éåŠç ã®ãªãã·ã§ã³ã§ç»é²ããã ãªãã·ã§ã³ã®ããŒã¯ doma.expr.functions ã§ããã
- äœæããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãèšå®ã¯ã©ã¹ã®RDBMSã®æ¹èšã§äœ¿çšãã ïŒDomaãæäŸããRDBMSã®æ¹èšã®å®è£ ã¯ã³ã³ã¹ãã©ã¯ã¿ã§ ExpressionFunctions ãåãåãããšãå¯èœïŒã
ã«ã¹ã¿ã é¢æ°ãåŒã³åºãã«ã¯ãçµã¿èŸŒã¿é¢æ°ãšåãããã«é¢æ°åã®å é ã« @ ãã€ããŸãã ããšãã°ã myfunc ãšããé¢æ°ã®åŒã³åºãã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
select * from employee where
employee_name = /* @myfunc(employee.employeeName) */'smith'
ãã©ã³ã¶ã¯ã·ã§ã³Â¶
ç®æ¬¡
Domaã¯ãããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŸãã ãã®ããã¥ã¡ã³ãã§ã¯ãããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ã®èšå®æ¹æ³ãšå©çšæ¹æ³ã«ã€ããŠèª¬æããŸãã
ã°ããŒãã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšãããå Žåã¯ãJTAïŒJava Transaction APIïŒ ã®å®è£ ããã€ãã¬ãŒã ã¯ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®æ©èœãå©çšããŠãã ããã
èšå®Â¶
ããŒã«ã«ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããã«ã¯æ¬¡ã®æ¡ä»¶ãæºããå¿ èŠããããŸãã
- Config ã® getDataSource 㧠LocalTransactionDataSource ãè¿ã
- äžèšã® LocalTransactionDataSource ãã³ã³ã¹ãã©ã¯ã¿ã§åã㊠LocalTransactionManager ãçæãã
- äžèšã® LocalTransactionManager ã®ç®¡çäžã§ããŒã¿ããŒã¹ã¢ã¯ã»ã¹ãè¡ã
LocalTransactionManager ã®çæãšååŸæ¹æ³ã¯ããã€ããããŸãããæãåçŽãªæ¹æ³ã¯ã Config ã®å®è£ ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã§çæã Config ã®å®è£ ã¯ã©ã¹ãã·ã³ã°ã«ãã³ãšããããšã§ãã
å®è£ äŸã§ãã
@SingletonConfig
public class AppConfig implements Config {
private static final AppConfig CONFIG = new AppConfig();
private final Dialect dialect;
private final LocalTransactionDataSource dataSource;
private final TransactionManager transactionManager;
private AppConfig() {
dialect = new H2Dialect();
dataSource = new LocalTransactionDataSource(
"jdbc:h2:mem:tutorial;DB_CLOSE_DELAY=-1", "sa", null);
transactionManager = new LocalTransactionManager(
dataSource.getLocalTransaction(getJdbcLogger()));
}
@Override
public Dialect getDialect() {
return dialect;
}
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public TransactionManager getTransactionManager() {
return transactionManager;
}
public static AppConfig singleton() {
return CONFIG;
}
}
ããŒã
ã¯ã©ã¹ã« @SingletonConfig ãæå®ããããšã§ã·ã³ã°ã«ãã³ã§ããããšãè¡šããŠããŸã
å©çšäŸÂ¶
èšå® ã§ç€ºãã AppConfig ã¯ã©ã¹ã以äžã®ããã«Daoã€ã³ã¿ãã§ãŒã¹ã«æ³šéãããã®ãšããŠäŸã瀺ããŸãã
@Dao(config = AppConfig.class)
public interface EmployeeDao {
...
}
以éã®ã³ãŒãäŸã«ç»å Žãã dao ã¯äžèšã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ãšçµäºÂ¶
ãã©ã³ã¶ã¯ã·ã§ã³ã¯ TransactionManager ã®ä»¥äžã®ã¡ãœããã®ããããã䜿ã£ãŠéå§ããŸãã
- required
- requiresNew
- notSupported
ãã©ã³ã¶ã¯ã·ã§ã³å ã§è¡ãåŠçã¯ã©ã ãåŒãšããŠæž¡ããŸãã
TransactionManager tm = AppConfig.singleton().getTransactionManager();
tm.required(() -> {
Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);
dao.update(employee);
});
ã©ã ãåŒãæ£åžžã«çµäºããã°ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã³ããããããŸãã ã©ã ãåŒãäŸå€ãã¹ããŒããå Žåã¯ãã©ã³ã¶ã¯ã·ã§ã³ã¯ããŒã«ããã¯ãããŸãã
æ瀺çãªããŒã«ããã¯Â¶
äŸå€ãã¹ããŒããæ¹æ³ä»¥å€ã§ãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ããã«ã¯ setRollbackOnly ã¡ãœãããåŒã³åºããŸãã
TransactionManager tm = AppConfig.singleton().getTransactionManager();
tm.required(() -> {
Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);
dao.update(employee);
// ããŒã«ããã¯ãããã®ãšããŠããŒã¯ãã
tm.setRollbackOnly();
});
ã»ãŒããã€ã³ã¶
ã»ãŒããã€ã³ãã䜿çšããããšã§ããã©ã³ã¶ã¯ã·ã§ã³äžã®ç¹å®ã®å€æŽãåãæ¶ãããšãã§ããŸãã
TransactionManager tm = AppConfig.singleton().getTransactionManager();
tm.required(() -> {
// æ€çŽ¢ããŠæŽæ°
Employee employee = dao.selectById(1);
employee.setName("hoge");
dao.update(employee);
// ã»ãŒããã€ã³ããäœæ
tm.setSavepoint("beforeDelete");
// åé€
dao.delete(employee);
// ã»ãŒããã€ã³ããžæ»ãïŒäžã§è¡ã£ãåé€ãåãæ¶ãïŒ
tm.rollback("beforeDelete");
});
泚éåŠç¶
Pluggable Annotation Processing API ãå©çšãããšããœãŒã¹ã³ãŒãã®èªåçæãæ€èšŒã ã³ã³ãã€ã«æ ã«è¡ãããšãã§ããŸãã
Domaã§ã¯ãã®APIãå©çšããããšã§ @Entity ã @Dao ãšèšã£ãã¢ãããŒã·ã§ã³ã泚éãããã¯ã©ã¹ãã€ã³ã¿ãã§ãŒã¹ãåŠçãã å¿ èŠãªã¯ã©ã¹ãèªåçæããŸãã ãŸãã泚éãããã¯ã©ã¹ãã€ã³ã¿ãã§ãŒã¹ã®æ€èšŒãè¡ããDomaã®èŠçŽã«åŸã£ãŠããªããœãŒã¹ã³ãŒããããå Žå㯠ãšã©ãŒã¡ãã»ãŒãžãIDEïŒEclipseãªã©ïŒã®ãšãã£ã¿ãjavacãå®è¡ããã³ã³ãœãŒã«äžã«è¡šç€ºããŸãã
ããã§ã¯ãDomaãæäŸãããªãã·ã§ã³ã®çš®é¡ãšããã«ãããŒã«ããšã®ãªãã·ã§ã³ã®èšå®æ¹æ³ã説æããŸãã
ãªãã·ã§ã³Â¶
- doma.dao.package
- @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ã®å®è£ ã¯ã©ã¹ãçæãããããã±ãŒãžã äœããã®å€ãæå®ããå Žåãdoma.dao.subpackageã®æå®ãããåªå ãããã ããã©ã«ãã®å€ã¯ã @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ãšåãããã±ãŒãžã
- doma.dao.subpackage
- @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ã®å®è£ ã¯ã©ã¹ãçæããããµãããã±ãŒãžã doma.dao.packageã«å€ãæå®ããŠããªãå Žåã«ã®ã¿æå¹ã @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ã®ããã±ãŒãžã example.dao ã§ãããã«æå®ããå€ã impl ã®å Žåã çæãããã¯ã©ã¹ã®ããã±ãŒãžã¯ example.dao.impl ãšãªãã
- doma.dao.suffix
- @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ã®å®è£ ã¯ã©ã¹ã®ååã®ãµãã£ãã¯ã¹ã @Dao ã泚éãããã€ã³ã¿ãã§ãŒã¹ã®åçŽåã EmployeeDao ã§ãããã«æå®ããå€ã Bean ã®å Žåã çæãããã¯ã©ã¹ã®åçŽå㯠EmployeeDaoBean ãšãªãã ããã©ã«ãã®å€ã¯ Impl ã
- doma.debug
- 泚éåŠçã®ãããã°æ å ±ããã°åºåãããã©ããã true ã®å Žåããã°åºåãè¡ãã ããã©ã«ãã®å€ã¯ã false ã
- doma.domain.converters
- ä»»æã®åãšåºæ¬åãçžäºå€æãã DomainConverter ã®ãããã€ããšãªãã¯ã©ã¹ã®å®å šä¿®é£Ÿåã®ã«ã³ãåºåãã ã¯ã©ã¹ã¯ org.seasar.doma.DomainConverters ã«ãã£ãŠæ³šéãããŠããªãããã°ãããªãã
- doma.entity.field.prefix
- @Entity ã泚éãããã¯ã©ã¹ããšã«çæãããã¿ã€ãã¯ã©ã¹ã§äœ¿çšãããã ã¿ã€ãã¯ã©ã¹ã®publicãªãã£ãŒã«ãåã®ãã¬ãã£ãã¯ã¹ã none ãæå®ãããšãã¬ãã£ãã¯ã¹ã䜿çšããªããšããæå³ã«ãªãã ããã©ã«ãã®å€ã¯ã $ ã
- doma.expr.functions
- åŒã³ã¡ã³ãã§å©çšå¯èœãªé¢æ°çŸ€ãè¡šãã¯ã©ã¹ã®å®å šä¿®é£Ÿåã org.seasar.doma.expr.ExpressionFunctions ã®ãµãã¿ã€ãã§ãªããã°ãããªãã ããã©ã«ãã®å€ã¯ã org.seasar.doma.expr.ExpressionFunctions ã
- doma.sql.validation
- SQLãã¡ã€ã«ã®ååšãã§ãã¯ãšSQLã³ã¡ã³ãã®ææ³ãã§ãã¯ãè¡ãå Žå㯠true ã è¡ããªãå Žå㯠false ã ããã©ã«ãã®å€ã¯ã true ã
- doma.version.validation
- 泚éåŠçã«ãããœãŒã¹ã³ãŒãçæã§å©çšããDomaã®ããŒãžã§ã³ãšå®è¡æã®Domaã®ããŒãžã§ã³ãåãã§ããããšã ãã§ãã¯ããå Žå㯠true ã ããªãå Žå㯠false ã Domaã®ããããŒãžã§ã³ã§çæãããã³ãŒããå«ãã©ã€ãã©ãªãäœæããå Žåã« false ãæå®ããŠãã«ããããšã ãã®ã©ã€ãã©ãªã®åå©çšæ§ãé«ãŸããŸãã ã©ã€ãã©ãªãäŸåããDomaã®ããŒãžã§ã³ãšã¯ç°ãªãããŒãžã§ã³ã®Domaã§å®è¡ã§ããããã§ã ïŒDomaã®ããŒãžã§ã³ã«äºææ§ãããéãã«ãããŠïŒã ããã©ã«ãã®å€ã¯ã true ã
Eclipse¶
ãããžã§ã¯ãã®ãPropertiesã-ãJava Compilerã-ãAnnotation Processingãã®é ç®ã§ãªãã·ã§ã³ãç»é²ããŸãã
ãã«ã¶
ç®æ¬¡
Maven Central Repository¶
Doma ã® jar ãã¡ã€ã«ã¯ Maven Central Repository ããå ¥æã§ããŸãã GroupId ãš ArtifactId ã®å称ã¯ä»¥äžã®éãã§ãã
GroupId: | org.seasar.doma |
---|---|
ArtifactId: | doma |
Eclipse ã䜿ã£ããã«ã¶
Eclipse ã§ãã«ããè¡ãéã®ãã€ã³ãã¯ä»¥äžã®éãã§ãã
- ãããžã§ã¯ãã®èšå®ã§æ³šéåŠçãæå¹ã«ãã
- Build Path ã«å ã㊠Factory Path ã«ã Doma ã® jar ãã¡ã€ã«ãèšå®ãã
ããŒã
æåã§èšå®ããããã Gradle ã® eclipse ã¿ã¹ã¯ã§èªåèšå®ããããšãæšå¥šããŸãã 詳现ã«ã€ããŠã¯ã domaframework/simple-boilerplate ã«å«ãŸãã build.gradle ãš eclipse.gradle ãåç §ãã ããã
泚éåŠçã®æå¹å¶
泚éåŠçãæå¹åããã«ã¯ãã¡ãã¥ãŒãã Project > Properties ãéžãã§ç»é¢ãéã å·Šã®ã¡ãŠãŒãã Java Compiler > Annotation Processing ãéžæããŸãã
ãããŠãäžèšã«ç€ºããã§ãã¯ããã¯ã¹ã«ãã§ãã¯ãå ¥ããŸãã
Factory Path ã®èšå®Â¶
泚éåŠçãæå¹åããã«ã¯ãã¡ãã¥ãŒãã Project > Properties ãéžãã§ç»é¢ãéã å·Šã®ã¡ãŠãŒãã Java Compiler > Annotation Processing > Factory Path ãéžæããŸãã
ãããŠãäžèšã«ç€ºããã§ãã¯ããã¯ã¹ã«ãã§ãã¯ãå ¥ãã ãã«ããã¹ã§æå®ããŠããã®ãšåãããŒãžã§ã³ã® Doma ã® jar ãç»é²ããŸãã
Gradle ã䜿ã£ããã«ã¶
Gradle ã§ãã«ããè¡ãéã®ãã€ã³ãã¯ä»¥äžã®ãšããã§ãã
- Javaã¯ã©ã¹ãšSQLãã¡ã€ã«ã®åºåå ãã£ã¬ã¯ããªãåãã«ãã
- ã³ã³ãã€ã«ããåã«SQLãã¡ã€ã«ãåºåå ãã£ã¬ã¯ããªã«ã³ããŒãã
- äŸåé¢ä¿ã®èšå®ã§domaãžã®äŸåãæå®ãã
ãµã³ãã«ã®build.gradleã§ãã
apply plugin: 'java'
// Javaã¯ã©ã¹ãšSQLãã¡ã€ã«ã®åºåå
ãã£ã¬ã¯ããªãåãã«ãã
processResources.destinationDir = compileJava.destinationDir
// ã³ã³ãã€ã«ããåã«SQLãã¡ã€ã«ãåºåå
ãã£ã¬ã¯ããªã«ã³ããŒããããã«äŸåé¢ä¿ãé転ãã
compileJava.dependsOn processResources
repositories {
mavenCentral()
maven {url 'https://oss.sonatype.org/content/repositories/snapshots/'}
}
dependencies {
compile "org.seasar.doma:doma:2.1.0"
}
ããŒã
ãªããžããªã«ããã https://oss.sonatype.org/content/repositories/snapshots/ ã®èšå®ã¯ Doma ã® SNAPSHOT ãåç §ãããå Žåã«ã®ã¿å¿ èŠã§ãã
Doma ã® SNAPSHOT 㯠Travis-CI ã§ãã«ããæåããããã³ã«äœæãããªããžããªã«é 眮ãããŸãã
Gradle ã䜿ã£ããã詳现ãªãã«ãã¹ã¯ãªããã®äŸãšããŠã domaframework/simple-boilerplate ãåç §ã«ããŠãã ããã
Developer Documentation¶
Doma ã®éçºÂ¶
ç®æ¬¡
ããŒã
ãã®ããŒãžã¯ Doma ã®éçºè ã«åããŠæžãããŠããŸãã
ãœãŒã¹ã³ãŒã¶
$ git clone git@github.com:domaframework/doma.git
ãã«ã¶
$ ./gradlew build
Maven ããŒã«ã«ãªããžããªãžã®ã€ã³ã¹ããŒã«Â¶
$ ./gradlew build install
ããŒã
ããŒã«ã«ã§ä¿®æ£ãå ããã³ãŒãã«å¯Ÿã㊠統åãã¹ã ãå®è¡ããã«ã¯ã ããŒã«ã«ã® Maven ãªããžããªã« Doma æ¬äœã®ææç©ãäºåã«ã€ã³ã¹ããŒã«ããŠããå¿ èŠããããŸãã
Continuous Integration¶
Continuous Integration ã®å®è¡ã«ã¯ Travis CI ãå©çšããŠããŸãã
ããã¥ã¡ã³ã¶
ããã¥ã¡ã³ãã®äœæã«ã¯ Sphinx ãå©çšããŠããŸãã
ç°å¢æ§ç¯Â¶
$ cd docs
$ pip install -r requirements.txt
ããã¥ã¡ã³ãã®çæ¶
$ make dirhtml
LiveReload¶
Google Chrome ã« LiveReload ãã€ã³ã¹ããŒã«ããããšã§ ããã¥ã¡ã³ãã®ä¿®æ£ãå³åº§ã«ãã©ãŠã¶ã§ç¢ºèªã§ããŸãã
ãã®æ¡åŒµæ©èœãæå¹ã«ããäžã§ãµãŒããŒãèµ·åããŸãã
$ python server.py
次㮠URL ã§ããã¥ã¡ã³ãã確èªã§ããŸãã
çµ±åãã¹ã¶
ããŒã
ãã®ããŒãžã¯ Doma ã®éçºè ã«åããŠæžãããŠããŸãã
çµ±åãã¹ãã®ç®çã¯2ã€ã§ãã
- Eclipse ã javac ã®æ³šéåŠçã®æåããã¹ããã
- ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ã䌎ãæ©èœããã¹ããã
çµ±åãã¹ãã§ã¯ RDBMS ã䜿ã£ããã¹ããè¡ããŸãã ããã©ã«ãã§äœ¿çšãã RDBMS 㯠H2 Database Engine ã§ãã
ãœãŒã¹ã³ãŒã¶
$ git clone git@github.com:domaframework/doma-it.git
Eclipse¶
Eclipse ã®èšå®ãã¡ã€ã«ãçæã§ããŸãã
$ ./gradlew eclipse
ãã¡ã¯ããªãã¹ã®èšå®ãè¡ãããŸãã
Continuous Integration¶
Travis CI ãå©çšããŠããŸãã
以äžã® RDBMS ãå©çšãããã¹ããå®è¡ããŠããŸãã
- H2 Database Engine
- HSQLDB
- MySQL
- PostgreSQL
About Doma¶
ãªãªãŒã¹ããŒã¶
2.0.1: 2014-08-06¶
- DomainConverter ã®ç¬¬2ååŒæ°ã« byte[] ãæå®ãããšæ³šéåŠçã§ã³ã³ãã€ã« ãšã©ãŒã«ãªãåé¡ãä¿®æ£ããŸãã
2.0.0: 2014-07-02¶
- UnitOfWork ãåé€ããŸãã
2.0-beta-5: 2014-06-07¶
- List<Optional<Emp>> ã List<Optional<Map<String, Object>>> ãæ»ãå€ãšãã Dao ã¡ãœããã¯æ³šéåŠçã§ã³ã³ãã€ã«ãšã©ãŒã«ããŸãã
- Entity æŽæ°åŸã« OriginalStates ãžå€æŽãåæ ãããªãåé¡ãä¿®æ£ããŸãã
- ãšã³ãã£ãã£ã®èå¥åã®å€ããã§ã«èšå®ãããŠããå Žåã¯èªåçæåŠçãå®è¡ããªãããã«ããŸãã
- ã«ã©ã ãªã¹ãå±éã³ã¡ã³ã 㧠DOMA4257 ãšã©ãŒã«ãªãåé¡ãä¿®æ£ããŸãã
- SQLã®ãã°åºåæ¹æ³ãã¢ãããŒã·ã§ã³ã§å¶åŸ¡ã§ããããã«ããŸãã
- Dao ããåºåããããã°ã®ã¡ãã»ãŒãžã詳现åããŸãã
- UtilLoggingJdbcLogger ã®ãã¬ãŒã®ååãã¯ã©ã¹ã®å®å šä¿®é£Ÿåã«å€æŽããŸãã
- SQLå®è¡æã«SQLãã¡ã€ã«ã®ãã¹ããã°ã«åºåãããªãåé¡ãä¿®æ£ããŸãã
2.0-beta-4: 2014-05-04¶
- Pluggable Annotation Processing API ã® Visitor ã Java 8 çšã®ãã®ãžããŒãžã§ã³ã¢ããããŸãã
- 空㮠java.util.Iterable ã IN å¥ã«ãã€ã³ãããå Žå㯠SQL ã® null ãšããŠæ±ãããã«ããŸãã
- java.sql.SQLXML ã«å¯Ÿå¿ããŸãã
- LocalTransaction ã§æå®ããã»ãŒããã€ã³ãã以éããåé€ãã¹ãç®æã§ã以åããåé€ããŠããäžå ·åãä¿®æ£ããŸãã
- LocalTransaction ã§ã»ãŒããã€ã³ãåé€æã®ãã°ãééã£ãŠããäžå ·åãä¿®æ£ããŸãã
- Entity ã®ããããã£ã®åã byte é åã«ãããšæ³šéåŠçã«å€±æããäžå ·åãä¿®æ£ããŸãã
2.0-beta-3: 2014-04-03¶
- æ€çŽ¢çµæã java.util.stream.Collector ã§åŠçã§ããããã«ããŸããã
- LocalTransactionManager ãã TransactionManager ã€ã³ã¿ãã§ãŒã¹ãæœåºããŸããã
- Config ã§æå®ããèšå®ãäžéšç¡èŠãããäžå ·åãä¿®æ£ããŸããã
- ãããã®ããŒãã³ã°èŠçŽãäžåŸå¶åŸ¡ããããã®ã€ã³ã¿ãã§ãŒã¹ MapKeyNaming ãè¿œå ããŸããã
- java.time.LocalDate ã java.time.LocalTime ã java.time.LocalDateTime ãåºæ¬åãšããŠäœ¿çšã§ããããã«ããŸããã
- JdbcLogger ã®å®è£ ã®å·®ãæ¿ãã容æã«ããããã« AbstractJdbcLogger ãè¿œå ããŸããã
- SelectStrategyType ã®ååã SelectType ã«å€æŽããŸããã
Doma 2 ã«ãããäž»èŠãªå€æŽç¹Â¶
ç®æ¬¡
Doma 1.36.0 ããã®å€æŽç¹ã®å ãäž»ãªãã®ã瀺ããŠããŸãã
å šè¬Â¶
- Java 8 ã«å¯Ÿå¿ããŸãããJava 7 以åã§ã¯åäœããŸããã
- deprecated 㪠API ãåé€ãããŸããã
èšå®Â¶
- Config ã®å®è£ ã¯ã©ã¹ãã·ã³ã°ã«ãã³ãšããŠæ±ããããã« @SingletonConfig ãè¿œå ãããŸããã
- ãã©ã³ã¶ã¯ã·ã§ã³åŠçãç°¡æåããããã« TransactionManager ãè¿œå ãããŸããã
- ã¯ãšãªãã«ã¹ã¿ãã€ãºå¯èœã«ããããã« QueryImplementors ãš CommandImplementors ãè¿œå ãããŸããã
- çµæã»ããã«æªç¥ã®ã«ã©ã ãå«ãŸããŠããå Žåã®æåãã«ã¹ã¿ãã€ãºå¯èœã«ããããã« UnknownColumnHandler ãè¿œå ãããŸããã
- ãããã®ããŒã®ããŒãã³ã°èŠçŽãäžåŸã§è§£æ±ºã§ããããã« MapKeyNaming ãè¿œå ãããŸããã
- AbstractDomaConfing ãåé€ãããŸããã ãã®ã¯ã©ã¹ãæäŸããŠããå®è£ 㯠Config ã®ããã©ã«ãã¡ãœããã§æäŸãããããã«ãªããŸããã
- DefaultClassHelper ãåé€ãããŸããã ãã®ã¯ã©ã¹ãæäŸããŠããå®è£ 㯠ClassHelper ã®ããã©ã«ãã¡ãœããã§æäŸãããããã«ãªããŸããã
- NullRequiresNewController ãåé€ãããŸããã ãã®ã¯ã©ã¹ãæäŸããŠããå®è£ 㯠RequiresNewController ã®ããã©ã«ãã¡ãœããã§æäŸãããããã«ãªããŸããã
åºæ¬å¶
- Object åãåºæ¬åãšèªèãããããã«ãªããŸããã
- java.time.LocalDate åãåºæ¬åãšèªèãããããã«ãªããŸããã
- java.time.LocalTime åãåºæ¬åãšèªèãããããã«ãªããŸããã
- java.time.LocalDateTime åãåºæ¬åãšèªèãããããã«ãªããŸããã
ãã¡ã€ã³ã¯ã©ã¹Â¶
- @Domain ã䜿ã£ãŠãã¡ã€ã³ã¯ã©ã¹ãäœã£ãå Žåãããã©ã«ãã§ã¯ null ãåãå ¥ããªããªããŸããã null ãåãå ¥ããã«ã¯ @Domain ã® acceptNull èŠçŽ ã« true ã®æå®ãå¿ èŠã§ãã
ãšã³ãã£ãã£ã¯ã©ã¹Â¶
- å®éšçãªæ±ãã ã£ãã€ãã¥ãŒã¿ãã«ãªãšã³ãã£ãã£ãæ£åŒã«ãµããŒããããŸããã
- ããããã£ã«åºæ¬åããã¡ã€ã³ã¯ã©ã¹ãèŠçŽ ãšãã java.util.Optional ãå®çŸ©ã§ããããã«ãªããŸããã
- ããããã£ã« java.util.OptionalInt ãå®çŸ©ã§ããããã«ãªããŸããã
- ããããã£ã« java.util.OptionalLong ãå®çŸ©ã§ããããã«ãªããŸããã
- ããããã£ã« java.util.OptionalDouble ãå®çŸ©ã§ããããã«ãªããŸããã
Daoã€ã³ã¿ãã§ãŒã¹Â¶
- ãã©ã¡ãŒã¿ãæ»ãå€ã®åã« java.util.Optional ãå®çŸ©ã§ããããã«ãªããŸããã
- ãã©ã¡ãŒã¿ãæ»ãå€ã®åã« java.util.OptionalInt ãå®çŸ©ã§ããããã«ãªããŸããã
- ãã©ã¡ãŒã¿ãæ»ãå€ã®åã« java.util.OptionalLong ãå®çŸ©ã§ããããã«ãªããŸããã
- ãã©ã¡ãŒã¿ãæ»ãå€ã®åã« java.util.OptionalDouble ãå®çŸ©ã§ããããã«ãªããŸããã
- java.util.stream.Stream ã䜿ã£ãŠæ€çŽ¢çµæãåŠçã§ããããã«ãªããŸããã
- java.util.stream.Collector ã䜿ã£ãŠæ€çŽ¢çµæãåŠçã§ããããã«ãªããŸããã
- @Delegate ãå»æ¢ã«ãªãã代ããã«ããã©ã«ãã¡ãœããã䜿ããããã«ãªããŸããã
- IterationCallback ã䜿ã£ãæ€çŽ¢ãçŠæ¢ãããŸããã 代ããã« java.util.stream.Stream ã䜿ã£ãæ€çŽ¢ãããŠãã ããã
SQLã«é¢ããå€æŽÂ¶
- ã«ã©ã ãªã¹ãå±éã³ã¡ã³ããå°å ¥ãããŸããã
泚éåŠç¶
- 泚éåŠçã®ãªãã·ã§ã³ã®ååã« doma ãšããåå空éãä»äžããŸããã Doma 以å€ã®æ³šéåŠçã®ãªãã·ã§ã³ãšããŒãéè€ããããšãé¿ããããã§ãã
FAQ¶
ç®æ¬¡
- FAQ
- äžè¬çãªè³ªå
- åäœç°å¢ã«é¢ãã質å
- éçºç°å¢ã«é¢ãã質å
- ã©ã®ããŒãžã§ã³ã®JDKããµããŒãããŠããŸããïŒ
- æšå¥šãããIDEïŒçµ±åéçºç°å¢ïŒã¯ãããŸããïŒ
- Domaã®jarãEclipseã®ãã«ããã¹ã«èšå®ããŸããã泚éåŠçãå®è¡ãããŸããã
- 泚éåŠçã§çæãããã³ãŒãã¯ã©ãã«åºåãããŸããïŒ
- Eclipseã䜿çšããŠããŸããã.apt_generated ãã£ã¬ã¯ããªãã¿ã€ãããŸããã
- SQLãã¡ã€ã«ãèŠã€ãããŸããã
- DBã¢ã¯ã»ã¹ã©ã€ãã©ãªãšããŠã®æ©èœã«é¢ãã質å
- SQLãèªåçæããæ©èœã¯ãããŸããïŒ
- æ¡ä»¶ãåçã«å€ããSQLã¯ã©ã®ããã«å®è¡ã§ããŸããïŒ
- 1察1 ã 1察n ãªã©ããŒã¿ããŒã¹äžã®ãªã¬ãŒã·ã§ã³ã·ãããJavaãªããžã§ã¯ãã«ãããã³ã°ã§ããŸããïŒ
- ã³ãã¯ã·ã§ã³ããŒãªã³ã°ã®æ©èœã¯ãããŸããïŒ
äžè¬çãªè³ªå¶
Domaãšã¯ã©ã®ãããªæå³ã§ããïŒÂ¶
D omain O riented Database MA pping Framework ã®ç¥ã§ãã
泚éåŠçãšã¯ãªãã§ããïŒÂ¶
Java 6 ã§å°å ¥ããã Pluggable Annotation Processing API ãå©çšããåŠçã§ã ã³ã³ãã€ã«æã®ãœãŒã¹ã³ãŒãæ€èšŒãããœãŒã¹ã³ãŒãçæãå¯èœã§ãã
Domaã§ã¯ã泚éåŠçã䜿çšããŠä»¥äžã®ããšãå®çŸããŠããŸãã
- ãšã³ãã£ãã£ã¯ã©ã¹ããã¡ã€ã³ã¯ã©ã¹ã®ã¡ã¿æ å ±ã®çæ
- Daoã®ã€ã³ã¿ãã§ãŒã¹ããå®è£ ã¯ã©ã¹ã®çæ
- SQLãã¡ã€ã«ã®ããªããŒã·ã§ã³
åäœç°å¢ã«é¢ãã質å¶
ã©ã®ããŒãžã§ã³ã®JREããµããŒãããŠããŸããïŒÂ¶
JER 8 以äžããµããŒãããŠããŸãã
Domaãåäœãããã®ã«å¿ èŠãªã©ã€ãã©ãªã¯äœã§ããïŒÂ¶
äœããããŸããã Domaã¯JRE以å€ã®ã©ããªã©ã€ãã©ãªã«ãäŸåããŠããŸããã
éçºç°å¢ã«é¢ãã質å¶
ã©ã®ããŒãžã§ã³ã®JDKããµããŒãããŠããŸããïŒÂ¶
JDK 8 以äžããµããŒãããŠããŸãã
æšå¥šãããIDEïŒçµ±åéçºç°å¢ïŒã¯ãããŸããïŒÂ¶
Eclipse ã§ãã
Domaã®jarãEclipseã®ãã«ããã¹ã«èšå®ããŸããã泚éåŠçãå®è¡ãããŸããã¶
Factory Pathã«ãDomaã®jarãã¡ã€ã«ãç»é²ããŠãã ããã
Factory Pathã®èšå®ç»é¢ã¯ããããžã§ã¯ãã®ããããã£èšå®ç»é¢ããã Java - Compiler - Annotation Processing - Factory Path ãšèŸ¿ããŸãã Annotation ProcessingãšFactory Pathã®ç»é¢ã§ã¯ã ãEnable project specific settingsãã®ãã§ãã¯ããã¯ã¹ããã§ãã¯ããŠãã ããã
泚éåŠçã§çæãããã³ãŒãã¯ã©ãã«åºåãããŸããïŒÂ¶
Eclipseãå©çšããŠããå Žåã ããã©ã«ãã§ã¯ãããžã§ã¯ãçŽäžã® .apt_generated ãã£ã¬ã¯ããªã«åºåãããŸãã
Eclipseã䜿çšããŠããŸããã.apt_generated ãã£ã¬ã¯ããªãã¿ã€ãããŸããã¶
åã«Package Explorerãã¥ãŒäžã« .apt_generated ãã£ã¬ã¯ããªã衚瀺ãããŠããªãã ããããããŸããã .apt_generated ã¯ãå称ã . ã§å§ãŸã£ãŠããããã«ã Package Explorerãã¥ãŒã§è¡šç€ºå¯Ÿè±¡å€ã«ãªããŸãã 察å¿æ¹æ³ãšããŠã¯ä»¥äžã®ãããããéžæããŠãã ããã
- Nivigatorãã¥ãŒãã .apt_generated ãã£ã¬ã¯ããªã確èªãã
- Package Explorerãã¥ãŒã®ãã£ã«ã¿ãªã³ã°ã®èšå®ãå€æŽã .apt_generated ãã£ã¬ã¯ããªã衚瀺ããã
- åºåå ãã£ã¬ã¯ããªãå€æŽãå称ã . ã§å§ãŸããªãããã«ãã
SQLãã¡ã€ã«ãèŠã€ãããŸããã¶
SQLãã¡ã€ã«ãååšããã«ãé¢ãããã次ã®ãšã©ãŒã¡ãã»ãŒãžãåºåãããããšããããŸãã
[DOMA4019] SQLãã¡ã€ã«[META-INF/../select.sql]ãã¯ã©ã¹ãã¹ããèŠã€ãããŸããã§ãã
SQLãã¡ã€ã«ã¯ã¯ã©ã¹ã®åºåãã£ã¬ã¯ããªããæ€çŽ¢ãããŸãã SQLãã¡ã€ã«ã®åºåãã£ã¬ã¯ããªãšã¯ã©ã¹ã®åºåãã£ã¬ã¯ããªãåãã§ããããšã確èªããŠãã ããã
Eclipseã®å Žåããããžã§ã¯ãã®ããããã£ã®ãJava Build Pathãã®èšå®ç»é¢ã§ã ãœãŒã¹ãã©ã«ãããšã«åºåå ãã£ã¬ã¯ããªãå€æŽå¯èœã«ãªã£ãŠããŸãã
DBã¢ã¯ã»ã¹ã©ã€ãã©ãªãšããŠã®æ©èœã«é¢ãã質å¶
SQLãèªåçæããæ©èœã¯ãããŸããïŒÂ¶
ã¯ãã
æŽæ°ç³»SQLãã¹ãã¢ãããã·ãŒãžã£ãŒ/ãã¡ã³ã¯ã·ã§ã³åŒã³åºãã«ã€ããŠã¯SQLãèªåã§çæã§ããŸãã æ€çŽ¢ç³»ã®SQLã«ã€ããŠã¯ãèªåçææ©èœã¯ãããŸãããããã¡ã€ã«ã«å€éšåããSQLãå®è¡ãã ãã®çµæãJavaã®ãªããžã§ã¯ãã«ãããã³ã°ããæ©èœããããŸãã
詳ãã㯠ã¯ãšãª ãåç §ããŠãã ããã
æ¡ä»¶ãåçã«å€ããSQLã¯ã©ã®ããã«å®è¡ã§ããŸããïŒÂ¶
SQLãã¡ã€ã«ã«ãSQLã³ã¡ã³ãã䜿ã£ãŠæ¡ä»¶ãæå®ã§ããŸãã SQLã³ã¡ã³ãã¯å®è¡æã«è§£æãããæ¡ä»¶ã«ãã£ãŠç°ãªãSQLãçæãããŸãã
詳ãã㯠SQL ãåç §ããŠãã ããã
1察1 ã 1察n ãªã©ããŒã¿ããŒã¹äžã®ãªã¬ãŒã·ã§ã³ã·ãããJavaãªããžã§ã¯ãã«ãããã³ã°ã§ããŸããïŒÂ¶
ããããã§ããŸããã
Domaã§ã¯ãSQLã®çµæã»ããã®1è¡ããã®ãŸãŸ1ã€ã®ãšã³ãã£ãã£ã®ã€ã³ã¹ã¿ã³ã¹ã«ãããã³ã°ããŸãã ãã®ã»ããã·ã³ãã«ã§ãããããããšèããŠããããã§ãã
ã³ãã¯ã·ã§ã³ããŒãªã³ã°ã®æ©èœã¯ãããŸããïŒÂ¶
ããããDomaã§ã¯æäŸããŠããŸããã
ã³ãã¯ã·ã§ã³ããŒãªã³ã°æ©èœããã€ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããã¬ãŒã ã¯ãŒã¯ã ã©ã€ãã©ãªçãšçµã¿åãããŠäœ¿çšããŠãã ããã