JOOQ 入門(三)-- CRUD 語句


序言

上一篇關於JOOQ的隨筆介紹了Springboot項目的創建以及JOOQ 代碼生成器的使用。

那么在上次的項目基礎上來看看實際的JOOQ怎么使用。

准備工作

先將項目的目錄結構創建好

接下來CRUD的語法這篇文章會分別去寫一個示例,看完之后基礎的增刪查改不在話下。

查詢(select)

 1 /**
 2      * 查詢
 3      * @return
 4      */
 5     public Result<BkUserRecord> getAll(){
 6         Result<BkUserRecord> result = this.create
 7                 .selectFrom(BkUser.BK_USER)
 8                 .orderBy(1)
 9                 .fetch();
10         return result;
11     }

更新(update)

 1 /**
 2      * 更新
 3      */
 4     public void updateUser(){
 5         // 設置別名
 6         BkUser a = BkUser.BK_USER.as("a");
 7         BkUserRecord user = new BkUserRecord();
 8         this.create
 9                 .update(a)
10                 .set(a.ADDRESS,user.getAddress())
11                 .set(a.NAME,user.getName())
12                 .where(a.ID.equal(user.getId()))
13                 .execute();
14     }

刪除(delete)

 1 /**
 2      * 刪除
 3      * @param userId
 4      */
 5     public void deleteUserById(Integer userId){
 6         this.create
 7                 .deleteFrom(BkUser.BK_USER)
 8                 .where(BkUser.BK_USER.ID.eq(userId))
 9                 .execute();
10     }

新增(insert)

/**
     * 新增
     */
    public void addUser(){
        byte enabled = 1;
        this.create
                .insertInto(BkUser.BK_USER)
                .columns(BkUser.BK_USER.ADDRESS,
                        BkUser.BK_USER.ENABLED,
                        BkUser.BK_USER.NAME,
                        BkUser.BK_USER.PHONE,
                        BkUser.BK_USER.PASSWORD)
                .values("后海",enabled,"小毛","10086","123456")
                .execute();
    }

 

完整代碼

 1 package com.bkn.breakingnews.modules.user.dao;
 2 
 3 import com.bkn.breakingnews.model.tables.BkUser;
 4 import com.bkn.breakingnews.model.tables.records.BkUserRecord;
 5 import com.zaxxer.hikari.HikariDataSource;
 6 import org.jooq.DSLContext;
 7 import org.jooq.Result;
 8 import org.jooq.SQLDialect;
 9 import org.jooq.impl.DSL;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.stereotype.Repository;
12 
13 /**
14  * @author wuqi
15  * @description user DAO
16  * @date 2020/5/15 14:52
17  */
18 @Repository
19 public class UserDao {
20     // 注入Hikari的DataSource,
21     @Autowired
22     HikariDataSource dataSource;
23 
24     /**
25      * 查詢
26      * @return
27      */
28     public Result<BkUserRecord> getAll(){
29         // DSL上下文是所有數據庫操作的入口,意思就是要用jooq干任何事都要先實例化這個DSLContext
30         DSLContext create = DSL.using(this.dataSource,SQLDialect.MYSQL);
31         Result<BkUserRecord> result = create
32                 .selectFrom(BkUser.BK_USER)
33                 .orderBy(1)
34                 .fetch();
35         return result;
36     }
37     /**
38      * 更新
39      */
40     public void updateUser(){
41         // 設置別名
42         BkUser a = BkUser.BK_USER.as("a");
43         BkUserRecord user = new BkUserRecord();
44         user.setId(5);
45         user.setAddress("印度");
46         user.setName("阿三哥");
47         DSL.using(this.dataSource,SQLDialect.MYSQL)
48                 .update(a)
49                 .set(a.ADDRESS,user.getAddress())
50                 .set(a.NAME,user.getName())
51                 .where(a.ID.equal(user.getId()))
52                 .execute();
53     }
54 
55     /**
56      * 刪除
57      * @param userId
58      */
59     public void deleteUserById(Integer userId){
60         DSL.using(this.dataSource,SQLDialect.MYSQL)
61                 .deleteFrom(BkUser.BK_USER)
62                 .where(BkUser.BK_USER.ID.eq(userId))
63                 .execute();
64     }
65 
66     /**
67      * 新增
68      */
69     public void addUser(){
70         byte enabled = 1;
71         DSL.using(this.dataSource,SQLDialect.MYSQL)
72                 .insertInto(BkUser.BK_USER)
73                 .columns(BkUser.BK_USER.ADDRESS,
74                         BkUser.BK_USER.ENABLED,
75                         BkUser.BK_USER.NAME,
76                         BkUser.BK_USER.PHONE,
77                         BkUser.BK_USER.PASSWORD)
78                 .values("后海",enabled,"小毛","10086","123456")
79                 .execute();
80     }
81 
82 }

測試類代碼

 1 package com.bkn.breakingnews;
 2 
 3 import com.bkn.breakingnews.model.tables.BkUser;
 4 import com.bkn.breakingnews.model.tables.records.BkUserRecord;
 5 import com.bkn.breakingnews.modules.user.dao.UserDao;
 6 import com.zaxxer.hikari.HikariDataSource;
 7 import org.jooq.DSLContext;
 8 import org.jooq.Result;
 9 import org.jooq.SQLDialect;
10 import org.jooq.impl.DSL;
11 import org.junit.jupiter.api.Test;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.boot.test.context.SpringBootTest;
14 
15 @SpringBootTest
16 class BreakingnewsApplicationTests {
17 
18     @Autowired
19     HikariDataSource dataSource;
20 
21     @Test
22     void contextLoads() {
23         DSLContext create = DSL.using(dataSource, SQLDialect.MYSQL);
24         Result<BkUserRecord> records = create.selectFrom(BkUser.BK_USER).fetch();
25         System.out.println(records);
26     }
27 
28     //將userDao注入進單元測試類
29     @Autowired
30     UserDao userDao;
31 
32     @Test
33     void testUser(){
34         System.out.println("查詢---");
35         System.out.println(userDao.getAll());
36         System.out.println("查詢---");
37 
38         System.out.println("更新---");
39         userDao.updateUser();
40         System.out.println("更新后---");
41         System.out.println(userDao.getAll());
42 
43         System.out.println("新增---");
44         userDao.addUser();
45         System.out.println("新增后---");
46         System.out.println(userDao.getAll());
47 
48         System.out.println("刪除---");
49         userDao.deleteUserById(5);
50         System.out.println("刪除---");
51         System.out.println(userDao.getAll());
52 
53     }
54 
55 }

測試結果

查詢---
更新---
更新后---
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|  id|name |phone      |telephone   |address|enabled|username|password                                          |remark|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|   3|系統管理員|18568887789|029-82881234|深圳南山   |      1|admin   |$2a$10$ySG2lkvjFHY5O0./CPIE1OI8VJsuKYEzOYzqIa7A...|{null}|
|   5|阿三哥  |18568123489|029-82123434|印度     |      1|libai   |$2a$10$oE39aG10kB/rFu2vQeCJTu/V/v4n6DRR0f8WyXRi...|{null}|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+

新增---
新增后---
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|  id|name |phone      |telephone   |address|enabled|username|password                                          |remark|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|   3|系統管理員|18568887789|029-82881234|深圳南山   |      1|admin   |$2a$10$ySG2lkvjFHY5O0./CPIE1OI8VJsuKYEzOYzqIa7A...|{null}|
|   5|阿三哥  |18568123489|029-82123434|印度     |      1|libai   |$2a$10$oE39aG10kB/rFu2vQeCJTu/V/v4n6DRR0f8WyXRi...|{null}|
|   6|小毛   |10086      |{null}      |后海     |      1|{null}  |123456                                            |{null}|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+

刪除---
刪除---
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|  id|name |phone      |telephone   |address|enabled|username|password                                          |remark|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+
|   3|系統管理員|18568887789|029-82881234|深圳南山   |      1|admin   |$2a$10$ySG2lkvjFHY5O0./CPIE1OI8VJsuKYEzOYzqIa7A...|{null}|
|   6|小毛   |10086      |{null}      |后海     |      1|{null}  |123456                                            |{null}|
+----+-----+-----------+------------+-------+-------+--------+--------------------------------------------------+------+

總結

a.從代碼中可以看出,java代碼非常的簡潔(別杠說這是因為sql邏輯簡單),和Mybatis相比的話省去了配置Mapper.xml的步驟,

這一點還是比較吸引人的。

b.示例中用到的方法fetch()和execute()按照字面意思理解就可以

c.DSL上下文DSLContext就像一個入口,所有的sql相關操作都需要在上線文上執行,所以用之前都要進行實例化

d.where..and..or以及join的用法和增刪改查一樣都比較簡單,一看就會,這里不做多介紹。寫CRUD示例主要是能夠讓腦海中對JOOQ的語句有個印象。

e.下一篇文章會通過相對CRUD復雜一點的例子來講講比較常用的field()方法、with語句的用法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM