内容简介:JOOQ(Java Object Oriented Querying),Java面向对象查询,是一个类型安全的ORM框架JOOQ使用APT技术,通过分析数据库,对每个数据表和试图生成对应的Bean和查询对象,实现类型安全的ORM操作SpringBootStarterParent管理了JOOQ依赖,可以不用设置版本号
JOOQ(Java Object Oriented Querying),Java面向对象查询,是一个类型安全的ORM框架
JOOQ使用APT技术,通过分析数据库,对每个数据表和试图生成对应的Bean和查询对象,实现类型安全的ORM操作
JOOQ的配置
1. 添加JOOQ的Maven依赖
SpringBootStarterParent管理了JOOQ依赖,可以不用设置版本号
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jooq</artifactId> </dependency>
2. 配置APT插件
JOOQ需要通过APT动态生成需要的 Java 类,所以需要配置Maven插件
重要的配置项:
-
executions.execution.goals.goal
如果需要在mvn compile
的时候执行apt,需要此设置 -
dependencies.dependency
数据库驱动所在包 -
configuration.jdbc
数据库连接配置 -
configuration.generator.database.inputSchema
指定数据库名称 -
configuration.generator.target.packageName
指定输出包名 -
configuration.generator.target.packageName
指定输出位置
<build> <plugins> <plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>${jooq.version}</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> <configuration> <jdbc> <url>jdbc:mysql://localhost:3306/foo</url> <user>root</user> <password>root</password> </jdbc> <generator> <database> <includes>.*</includes> <inputSchema>foo</inputSchema> </database> <target> <packageName>jooq</packageName> <directory>${basedir}/target/generated-sources/java</directory> </target> </generator> </configuration> </plugin> </plugins> </build>
执行APT
- 显示执行: mvn jooq-codegen:generate
- 隐式执行: mvn compile
执行成功后,会在 /target/generated-sources
目录下生成所需的Class
JOOQ简单示例
package bj.mybatis; import com.zaxxer.hikari.HikariDataSource; import jooq.tables.records.UserRecord; import org.jooq.*; import org.jooq.conf.ParamType; import org.jooq.impl.DSL; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.core.JdbcTemplate; import javax.annotation.Resource; import javax.sql.DataSource; import javax.validation.constraints.NotNull; import static jooq.tables.User.USER; /** * Created by BaiJiFeiLong@gmail.com at 2018/12/11 上午9:57 */ @SpringBootApplication(exclude = QuartzAutoConfiguration.class) public class App implements ApplicationListener<ApplicationReadyEvent> { public static void main(String[] args) { new SpringApplication(App.class) {{ setWebApplicationType(WebApplicationType.NONE); }}.run(args); } @Resource private JdbcTemplate jdbcTemplate; @Override public void onApplicationEvent(@NotNull ApplicationReadyEvent event) { initDatabase(); DSLContext dslContext = DSL.using(dataSource, SQLDialect.MYSQL_8_0); // 插入方式1: 插入对象 UserRecord userRecord = dslContext.newRecord(USER); userRecord.setUsername("sky"); userRecord.setRealName("九天"); userRecord.insert(); System.out.println("Inserted user: "); System.out.println(userRecord); // 插入方式2: 动态插入 dslContext.insertInto(USER).set(USER.USERNAME, "rain").set(USER.REAL_NAME, "暴雨").execute(); // 查询方式1: 查询完整对象 Result<UserRecord> userRecords = dslContext.selectFrom(USER).fetch(); System.out.println("All records: "); System.out.println(userRecords); // SEEK分页查询 System.out.println("SEEK:"); dslContext.selectFrom(USER).orderBy(USER.USERNAME.asc(), USER.REAL_NAME.asc()).seek("rain", "暴雨").limit(10).forEach(System.out::println); // 查询方式2: 查询指定字段 SelectConditionStep<Record1<String>> where = dslContext.select(USER.REAL_NAME).from(USER).where(USER.ID.eq(2)); Record1<String> stringRecord1 = where.fetchOne(); System.out.println("SQL:"); // 打印SQL。在DSL.using()可以不传dataSource,此时JOOQ做纯SQLBuilder System.out.println(where.getSQL(ParamType.INLINED)); System.out.println("realName: "); System.out.println(stringRecord1); } @Resource private DataSource dataSource; private void initDatabase() { jdbcTemplate.execute("DROP TABLE IF EXISTS user"); jdbcTemplate.execute("CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(16) UNIQUE ,real_name VARCHAR(32) CHARSET 'utf8')"); } @Bean public DataSource dataSource() { return new HikariDataSource() {{ this.setJdbcUrl("jdbc:mysql://localhost/foo?characterEncoding=utf-8"); this.setUsername("root"); this.setPassword("root"); }}; } }
示例输出:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.0.RELEASE) 2018-12-11 15:04:05.021 INFO 18538 --- [ main] bj.mybatis.App : Starting App on MacBook-Air-2.local with PID 18538 (/Users/yuchao/temp/java/hellomaven/target/classes started by yuchao in /Users/yuchao/temp/java/hellomaven) 2018-12-11 15:04:05.027 INFO 18538 --- [ main] bj.mybatis.App : No active profile set, falling back to default profiles: default 2018-12-11 15:04:06.422 WARN 18538 --- [ main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[bj.mybatis]' package. Please check your configuration. 2018-12-11 15:04:07.529 INFO 18538 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2018-12-11 15:04:07.709 INFO 18538 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2018-12-11 15:04:08.393 WARN 18538 --- [ main] reactor.netty.tcp.TcpResources : [http] resources will use the default LoopResources: DefaultLoopResources {prefix=reactor-http, daemon=true, selectCount=4, workerCount=4} 2018-12-11 15:04:08.393 WARN 18538 --- [ main] reactor.netty.tcp.TcpResources : [http] resources will use the default ConnectionProvider: PooledConnectionProvider {name=http, poolFactory=reactor.netty.resources.ConnectionProvider$$Lambda$282/589610983@112d1c8e} 2018-12-11 15:04:08.645 INFO 18538 --- [ main] bj.mybatis.App : Started App in 4.832 seconds (JVM running for 6.859) 2018-12-11 15:04:08.900 INFO 18538 --- [ main] org.jooq.Constants : @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@ @@ @@ @@@@@@@@@@ @@@@@@@@@@ @@@@ @@ @@ @@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@ @@@@@@@@@@ @@ @@ @@@@ @@@@@@@@@@ @@@@@@@@@@ @@ @ @ @@@@@@@@@@ @@@@@@@@@@ @@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Thank you for using jOOQ 3.11.5 Inserted user: +----+--------+---------+ | id|username|real_name| +----+--------+---------+ | 1|sky |九天 | +----+--------+---------+ All records: +----+--------+---------+ | id|username|real_name| +----+--------+---------+ | 1|sky |九天 | | 2|rain |暴雨 | +----+--------+---------+ SEEK: +----+--------+---------+ | id|username|real_name| +----+--------+---------+ | 1|sky |九天 | +----+--------+---------+ SQL: select `foo`.`user`.`real_name` from `foo`.`user` where `foo`.`user`.`id` = 2 realName: +---------+ |real_name| +---------+ |暴雨 | +---------+ 2018-12-11 15:04:09.722 INFO 18538 --- [ Thread-16] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2018-12-11 15:04:09.738 INFO 18538 --- [ Thread-16] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网:碎片化生存
段永朝 / 中信出版社 / 2009-11 / 42.00元
《互联网:碎片化生存》内容简介:在世界互联网人数超过17亿,中国网民接近4亿的时候,断言“这个版本的互联网没有未来”是要冒很大风险的。我们生活在比特和连线的世界,现代互联网所描绘出的“数字化”、“虚拟化”的未来是否完全值得信赖? 现代商业取得了巨大成功,但这并不是电脑和互联网精髓的自由体现,我们所使用的这个版本的电脑和互联网只不过是“被阉割”、“被劫持”的商业玩偶。 《互联网:碎片化生......一起来看看 《互联网:碎片化生存》 这本书的介绍吧!