序言
上一篇關於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語句的用法。