jOOQ (Java Object Oriented Querying) ã®ä½¿ãæ¹ã®ç´¹ä»
jOOQ (http://www.jooq.org/) ã«ã¤ãã¦ã®ã¡ã¢ã jOOQã¯ãtype safeãã¤database orientedãªã¯ã¨ãªãã«ãã¼ã§ããã database orientedãªã®ã§ããã¢ããªã±ã¼ã·ã§ã³ããDBã®ãã¨ãªãã¦å ¨ç¶æèããããªããããçãªææ³ã«åºãã¦ä½ãããé¡ã®ãããã¯ãã¨ã¯ç°ãªããæãéãã®SQLãçæã§ããããã«ãªã£ã¦ããã
以ä¸gradleåæã§ãversionçã¯ãããªã«ã
gradle
dependenciesã¯ãããªæã
compile 'org.jooq:jooq:3.7.1' compile 'org.jooq:jooq-meta:3.7.1'
ãã¼ãã«çã«ç¸å½ããã¯ã©ã¹ãgradle taskããçæããããã«buildscriptã®dependenciesã«ã以ä¸ãããã¦ãã
classpath 'org.jooq:jooq-codegen:3.7.1'
ãã§ã以ä¸ã®ãããªã³ã¼ããbuild.gradleã«æ¸ããMySQLåæã§ããç´°ããé¨åã¯èªåã®ç°å¢ã«åããã¦ãããªã«ã
def genXml = { db, writer -> new groovy.xml.MarkupBuilder(writer).configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.6.0.xsd') { jdbc() { driver("com.mysql.jdbc.Driver") url("jdbc:mysql://localhost:3306/") user("root") password("") } generator() { database() { inputSchema(db) } generate() { } target() { packageName("com.foo.bar.jooq." + db) directory("src/main/java") } } } } def generateJooqSources = { db -> def writer = new StringWriter() def xml = genXml(db, writer) org.jooq.util.GenerationTool.generate( javax.xml.bind.JAXB.unmarshal(new StringReader(writer.toString()), org.jooq.util.jaxb.Configuration.class) ) }
ã§ã以ä¸ã®ããã«ãã¼ã¿ãã¼ã¹æ¯ã«taskãå®ç¾©ãããã¨ã
task("jooq-generate-example") << { generateJooqSources(name) }
è¥å¹²DRYã§ã¯ãªããããã§ã¯æ°ã«ããªãã
åæå
åã«ã¯ã¨ãªãçºè¡ããã ããªããConnectionãDataSourceããDSLContextã¯ã©ã¹ã®ãªãã¸ã§ã¯ããä½ãã°ããã
DSLContext ctx = DSL.using(dataSource, SQLDialect.MYSQL);
ã¯ã¨ãªã®æ¸ãæ¹
SQLã§ãããããã¨ã¯å¤§ä½åºæ¥ãããã¾ã«ããã©ãããæ¸ãæ¹ãããå¿ è¦ãããã...
以ä¸ãuserã¨ããtableããã³ã¼ãçæãã¦ãé©å®static importãã¦ããåæã
ååSELECT
UserRecord record = ctx.selectFrom(USER)
.where(USER.ID.equal(userId)
.fetchOneInto(UserRecord.class);
ã«ã©ã ãæå®ãã¦ååSELECT
è¿ãå¤ãå¶å¾¡ããé¢ä¿ã§ãçµæã¨ãã¦äºåã«ã©ã åãæå®ããå¿ è¦ããã
String name = ctx.select(USER.NAME) .from(USER) .where(USER.ID.equal(userId) .fetchOne(USER.NAME);
è¤æ°SELECT
List<UserRecord> userRecords = ctx.selectFrom(USER)
.where(USER.NAME.equal(name)
.fetchInto(UserRecord.class);
ç¹å®ã®ã«ã©ã ã®å¤ãkeyã«ããMapãåå¾
Perlã®DBIã§ããã¨ããã®selectrow_hashrefçãªãã¨ãåºæ¥ãã1対1ã®ãããã
Map<Integer, UserRecord> userRecords = ctx.selectFrom(USER)
.where(USER.NAME.equal(name)
.fetchMap(USER.ID, UserRecord.class);
ç¹å®ã®ã«ã©ã ã®å¤ãkeyãkeyã®å¤ã§ã°ã«ã¼ãã³ã°ãããã¬ã³ã¼ãã®Listãvalueã«ããMapãåå¾
Perlã®DBIã§ããã¨ããã®â¦ãªãã ã£ãããã£ãã£ããã1対nã®ãããã
Map<Integer, List<UserRecord>> userRecords = ctx.selectFrom(USER)
.where(USER.ID.in(userIds))
.fetchGroups(USER.STATUS, UserRecord.class);
INSERT
ctx.insertInto(USER, USER.NAME, USER.STATUS)
.values(name, 0)
.execute();
batch INSERT
List<UserRecord> userRecords = new ArrayList<UserRecord>(); ... ctx.batchInsert(userRecords) .execute();
UPDATE
ctx.update(USER) .set(USER.NAME, name) .where(USER.ID.equal(userId)) .execute();
DELETE
ctx.deleteFrom(USER) .where(USER.ID.equal(userId)) .execute();
ãã©ã³ã¶ã¯ã·ã§ã³
ctx.transaction(new TransactionalRunnable() { @Override public void run(Configuration configuration) throws Exception { // ããã®ä¸ } })
whereæ¡ä»¶ã®åçãªçµã¿ç«ã¦
SelectQuery<UserRecord> query = ctx.selectFrom(USER).getQuery(); for (User u : users) { Condition condition = USER.NAME.equal(userName).and(USER.STATUS.equal(1)); query.addConditions(Operator.OR, condition); } List<UserRecord> userRecords = query.fetchInto(UserRecord.class);
DAO
使ã£ããã¨ã¯ãªããçæã§ããããã
http://www.jooq.org/doc/2.6/manual/sql-execution/daos/
ã§ãå®éã©ããªãï¼
ãã¾ã«ãããæããããã©ãä¸éãã®ãã¨ã¯åºæ¥ã¦ã¾ãã¾ã使ããããã§ãã
ããã¥ã¡ã³ããçµæ§å å®ãã¦ããã®ã¨ãéçºè ãstackoverflowã§ãã¾ãã«ã¬ã¹ä»ãã¦ãæãè¦ãã¨ãæ°åã®å ¥ã£ã¦ãããã¨ãåããã¾ãã

JDBCã«ããJavaãã¼ã¿ãã¼ã¹ããã°ã©ãã³ã° 第2ç
- ä½è : ã¸ã§ã¼ã¸ãªã¼ã¹,George Reese,ç³äºå²å,ç¦é¾èæ¥
- åºç社/ã¡ã¼ã«ã¼: ãªã©ã¤ãªã¼ã»ã¸ã£ãã³
- çºå£²æ¥: 2001/09
- ã¡ãã£ã¢: åè¡æ¬
- ã¯ãªãã¯: 7å
- ãã®ååãå«ãããã° (3ä»¶) ãè¦ã