JOOQ-The easiest way to write SQL in Java

本文介绍了JOOQ ORM框架的特性、基本使用步骤,包括在SpringBoot环境中配置依赖,自动生成代码,以及如何进行数据库操作。通过示例展示了DSLContext的使用,如select、from和where等API,强调了JOOQ在类型安全和简化SQL操作方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类似的插件拦截机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值