1、简介
一个ORM框架,官方地址:http://jooq.org
特点:
(1) 方便、好用
(2) 有强类型校验
所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险。
2、基本使用
基本环境:
Mysql
SpringBoot
(1)引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--用以生成代码-->
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.9.6</version>
<configuration>
<jdbc>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/</url>
<user>数据库用户名</user>
<password>数据库密码</password>
</jdbc>
<generator>
<database>
<!--表名-->
<includes>employee</includes>
<!--数据库名称-->
<inputSchema>family</inputSchema>
</database>
<generate>
<!--生成dao和pojo-->
<daos>true</daos>
<pojos>true</pojos>
<!--把数据库时间类型映射到java 8时间类型-->
<javaTimeTypes>true</javaTimeTypes>
<!--<interfaces>true</interfaces>-->
<!--不在生成的代码中添加spring注释,比如@Repository-->
<springAnnotations>false</springAnnotations>
</generate>
<target>
<!--生成代码文件的包名及放置目录-->
<packageName>com.family.structure</packageName>
<directory>src/main/java</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
</build>
(2)自动生成代码:
使用maven的generate命令,在我们制定的项目路径下生成相应表的代码。
其中:
EmployeeDao:Dao的实现类,封装了基本的数据库操作。
pojos包下的Employee: 简单的pojo。
records包下的EmployeeRecord:涉及表操作对象。
Employee:开发者编写代码时,使用其进行表相关字段的操作。代码中直接引用。
DefaultCatalog:默认表目录,可以获取数据库的表的集合。
Family:数据库信息
Keys:记录该表的主键、唯一键、外键等
Tables:该数据库下生成的表信息,目前就只有Employee一个表。
(3)java使用示例:
public static void main(String[] args) {
String jdbcUrl = "jdbc:mysql://localhost:3306/family";
String jdbcUsername = "";
String jdbcPassword = "";
// 获取 JDBC 连接
try (Connection connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)) {
// 获取 jOOQ 执行器
DSLContext dslContext = DSL.using(connection, SQLDialect.MYSQL);
//获取id和name
Result<Record2<Integer, String>> fetch = dslContext.select(EMPLOYEE.ID,EMPLOYEE.NAME).from(EMPLOYEE).fetch();
//只获取name集合
/*List<String> nameList = dslContext.select(EMPLOYEE.NAME).from(EMPLOYEE).fetchInto(String.class);
nameList.forEach(System.out::println);
//排序、分页
dslContext.select(EMPLOYEE.ID,EMPLOYEE.NAME).from(EMPLOYEE)
.orderBy(EMPLOYEE.ID.desc()).limit(1).offset(10).fetch();
*/
} catch (SQLException e) {
e.printStackTrace();
}
}
(4)执行结果:
执行sql结果会以这种类似表格的方式打印出来,如下图。
3、API
通过上面的例子,这里介绍几个比较重要的API相关内容。
(1)DSLContext
DSLContext 和DSL是访问JOOQ类和功能的主要入口点,所有对于SQL的操作API,可以通过其提供的API方便的进行SQL操作。类似一个sql执行器。
(2)fetch()
上面的例子中通过fetch()进行查询,在DSLContext中,提供了大量的数据操作API,仅以查询为例。
(3)拼接sql
//select方法返回SelectSelectStep、SelectWhereStep
public interface DSLContext extends Scope, AutoCloseable {
<T1, T2> SelectSelectStep<Record2<T1, T2>> select(SelectField<T1> var1, SelectField<T2> var2);
<R extends Record> SelectWhereStep<R> selectFrom(Table<R> var1);
}
//from()返回SelectJoinStep
public interface SelectFromStep<R extends Record> extends SelectWhereStep<R> {
SelectJoinStep<R> from(TableLike<?> var1);
}
//where()返回SelectConditionStep
public interface SelectWhereStep<R extends Record> extends SelectConnectByStep<R> {
SelectConditionStep<R> where(Condition condition);
}
以上几个方法返回的实体对象,都继承了接口Select。实际是在做各种条件的查询条件的拼接。
4、小结
a.编写上看,和写sql语句的方式差不多,提供的API很丰富,且都与sql的关键字相对应。使用起来很方便,比如:select、from、where等。
b.省去了类型的对应的问题,即Java 数据类型和mysql数据类型的对应。
c.暂未了解到,有和mybatis类似的插件拦截机制。