联合查询是要多创建一个实体类么_SpringBoot2.x教程——整合使用jOOQ面向对象查询...

一. jOOQ简介

1. jOOQ概述

jOOQ(Java Object Oriented Querying): 翻译成中文是 Java面向对象查询 的意思。

jOOQ是Data Geekery提供的基于Java的轻量级数据库访问库,通过特定的语法将类以及数据库模型翻译成对应的SQL语句实现实体与关系的映射,在数据库与类之间建立起一一对应关系,也可以让我们通过它的流式API构建出类型安全的SQL查询。

jOOQ是一个基于Java编写SQL的工具包,具有简单、轻量、函数式编程写SQL等独特优势,非常适合敏捷快速迭代开发。

jOOQ不管是商业版,还是开源版本都能跟Spring Boot一块使用。

2. jOOQ的特点:

  • 继承了ORM框架的优点,简单操作,类型安全等。jOOQ将SQL建模为内部DSL,使用Java编译器编译SQL语法,元数据和数据类型。
  • jOOQ会根据数据库的元数据来生成对应的实体类,省略了原有开发中不断修改对应数据库的类名,属性名。
  • jOOQ允许运行时配置数据库模式,且支持行级别的安全。
  • 支持联合查询,多表查询,存储过程等数据库高级操作。

二. Spring Boot中整合jOOQ

1.创建Web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

f0ccf446546dfca6ba4dcec60f894b4d.png

2. 添加依赖和插件

mysql            mysql-connector-java        com.alibaba            fastjson            1.2.46com.alibaba            druid            1.1.10org.springframework.boot            spring-boot-starter-jooq        org.jooq            jooq-meta        org.jooq            jooq-codegen        org.springframework.boot            spring-boot-starter-data-jpa        org.apache.maven.plugins                maven-compiler-plugin            org.jooq                jooq-codegen-maven                generatemysql                        mysql-connector-java                        ${mysql.version}src/main/resources/JooqConfig.xml

3. 创建JooqConfig配置文件

在resource目录下,创建一个JooqConfig.xml配置文件,用来进行关联数据库,根据数据库进行逆向生成对应的Java代码。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/db4?serverTimezone=GMTrootsycorg.jooq.codegen.JavaGeneratorpublic..*.idoverride_primmary_keyorg.jooq.meta.mysql.MySQLDatabase.*db4truetruetruefalsecom.yyg.boot.generatorsrc/main/java

4. mvn执行逆向工程

在lifecycle中执行compile命令,就可以自动执行逆向工程的命令了。只要JooqConfig.xml配置文件没问题,并且依赖包都完整下载,就可以逆向工程执行成功。

282f77254c9c6826dfde607e0f71db55.png

逆向工程执行完毕后,我们就可以看到如下效果,发现自动生成了很多的Java代码,这些Java代码就是根据我们数据库中的表,生成的对应的Java代码。

bbe13e07cc6c2c35aa3dca8246d1e108.png

对应的数据库表:

fa899cbaaee069e7bae0865a6a850fba.png

5. 配置application.yml文件

主要是配置关联我们的数据库。

spring:  datasource:    url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true    type: com.alibaba.druid.pool.DruidDataSource    username: root    password: syc    driver-class-name: com.mysql.jdbc.Driver #驱动  jpa:    hibernate:      ddl-auto: update #自动更新    show-sql: true  #日志中显示sql语句

6. 创建DataSource配置类

package com.yyg.boot.config;import com.alibaba.druid.pool.DruidDataSource;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/** * @Author 一一哥Sun * @Date Created in 2020/3/30 * @Description 第二种配置数据源的方式 */@Data@ComponentScan@Configuration@ConfigurationProperties(prefix="spring.datasource")public class DbConfig {    private String url;    private String username;    private String password;    @Bean    public DataSource getDataSource() {        DruidDataSource dataSource = new DruidDataSource();        dataSource.setUrl(url);        dataSource.setUsername(username);        dataSource.setPassword(password);        return dataSource;    }}

7.创建Service层代码

创建UserService接口

package com.yyg.boot.service;import com.yyg.boot.generator.tables.pojos.User;import java.util.Iterator;import java.util.List;/** * @Author 一一哥Sun * @Date Created in 2020/4/2 * @Description Description */public interface UserService {    /**     * 删除     */    void delete(int id);    /**     * 增加     */    void insert(User user);    /**     * 更新     */    int update(User user);    /**     * 查询单个     */    User selectById(int id);    /**     * 查询全部列表     */    List selectAll(int pageNum, int pageSize);}

创建UserServiceImpl类

package com.yyg.boot.service.impl;import com.yyg.boot.generator.tables.User;import com.yyg.boot.generator.tables.records.UserRecord;import com.yyg.boot.service.UserService;import org.jooq.DSLContext;import org.jooq.Record;import org.jooq.Result;import org.jooq.UpdateSetMoreStep;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.Iterator;import java.util.List;/** * @Author 一一哥Sun * @Date Created in 2020/4/2 * @Description Description */@Servicepublic class UserServiceImpl implements UserService {    @Autowired    DSLContext dsl;    /**     * 给User表 重命名 u 。(类似sql语句中的 user as u).     * 注意一点,这个User类是逆向生成的tables包下的,不是pojos包下的User实体类。     * (逆向工程它会生成两个User类。一个在pojos下,一个再tables下)     */    com.yyg.boot.generator.tables.User u = User.USER.as("u");    /**     * 删除     */    @Override    public void delete(int id) {        dsl.delete(u).where(u.ID.eq(id));    }    /**     * 增加     */    @Override    public void insert(com.yyg.boot.generator.tables.pojos.User user) {        dsl.insertInto(u).                columns(u.ADDRESS, u.BIRTHDAY, u.SEX, u.USERNAME).                values(user.getAddress(), user.getBirthday(), user.getSex(), user.getUsername())                .execute();    }    /**     * 更新     *     * @param user     */    @Override    public int update(com.yyg.boot.generator.tables.pojos.User user) {        dsl.update(u).set((Record) user);        return 0;    }    /**     * 查询单个     */    @Override    public com.yyg.boot.generator.tables.pojos.User selectById(int id) {        List result =  dsl.select(u.ADDRESS,u.BIRTHDAY,u.ID,u.SEX,u.USERNAME)                .from(u)                .where(u.ID.eq(id))                .fetch()                .into(com.yyg.boot.generator.tables.pojos.User.class);        return result.get(0);    }    /**     * 查询全部列表     */    @Override    public List selectAll(int pageNum, int pageSize) {        return dsl.select()                .from(u)                //id倒序                .orderBy(u.ID.desc())                //分页                .limit(0)                //分页                .offset(10)                .fetch()                //数据类型格式转化                .into(com.yyg.boot.generator.tables.pojos.User.class);    }}

8. 创建Controller测试接口

package com.yyg.boot.web;import com.yyg.boot.generator.tables.pojos.User;import com.yyg.boot.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @Author 一一哥Sun * @Date Created in 2020/4/2 * @Description Description */@RestController@RequestMapping("/user")public class UserController {    @Autowired    private UserService userService;    @GetMapping("/{id}")    public User findUserById(@PathVariable("id") Integer id) {        return userService.selectById(id);    }}

9. 创建入口类

package com.yyg.boot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * @Author 一一哥Sun * @Date Created in 2020/4/2 * @Description Description */@SpringBootApplicationpublic class JooqApplication {    public static void main(String[] args){        SpringApplication.run(JooqApplication.class,args);    }}

10.总的项目结构

624546ee3437ed760a982d3d1f2c30f8.png

11.测试接口

我们在浏览器中进行测试。

78535369552e833fce5d1ce266c467f2.png

可以看到我们的接口功能已经实现了,其他方法没有一一测试,感兴趣的朋友可以自己试验一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值