中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做網(wǎng)站的注意什么口碑最好的it培訓(xùn)機構(gòu)

做網(wǎng)站的注意什么,口碑最好的it培訓(xùn)機構(gòu),怎樣做網(wǎng)站代理,建設(shè)凡科網(wǎng)站Mybatis 作為頭部的 ORM 框架,他的增強工具可謂層出不窮,比如出名的 Mybatis-Plus 和 阿里云開源的 Fluent-MyBatis,如今出了一款 Mybatis-Flex ,相比前兩款功能更為強大、性能更為強悍,不妨來了解一下。 目錄 1 Myba…

Mybatis 作為頭部的 ORM 框架,他的增強工具可謂層出不窮,比如出名的?Mybatis-Plus 和 阿里云開源的 Fluent-MyBatis,如今出了一款 Mybatis-Flex ,相比前兩款功能更為強大、性能更為強悍,不妨來了解一下。

目錄

1?Mybatis-Flex 介紹

2 準(zhǔn)備工作

2.1 數(shù)據(jù)庫中創(chuàng)建表及插入數(shù)據(jù)

2.2 Spring Boot 項目初始化

2.3 添加?Maven 主要依賴

2.4 配置數(shù)據(jù)源

3?Mybatis-Flex 實踐

3.1?編寫實體類和 Mapper 接口

3.2?在主啟動類添加 @MapperScan 注解

3.3?Test 測試

① 普通查詢

② 鏈?zhǔn)讲樵?/p>

4 MyBatis-Flex/Plus?代碼對比

4.1?基礎(chǔ)查詢

4.2 集合查詢

4.3 and(...) 和 or(...)

4.4 多表查詢

4.5?部分字段更新


1?Mybatis-Flex 介紹

MyBatis-Flex 是一個優(yōu)雅的 MyBatis 增強框架,它非常輕量、同時擁有極高的性能與靈活性。

📌?特征

  • 輕量:除了 MyBatis,沒有任何第三方依賴、沒有任何攔截器,在執(zhí)行的過程中,沒有任何的 Sql 解析(Parse)。 這帶來了幾個好處:極高的性能、極易對代碼進(jìn)行跟蹤和調(diào)試、把控性更高。
  • 靈活:支持 Entity 的增刪改查、以及分頁查詢的同時,MyBatis-Flex 提供了 Db + Row?工具,可以無需實體類對數(shù)據(jù)庫進(jìn)行增刪改查以及分頁查詢。 與此同時,MyBatis-Flex 內(nèi)置的 QueryWrapper?可以輕易的幫助我們實現(xiàn) 多表查詢、鏈接查詢、子查詢 等等常見的 SQL 場景。
  • 強大:支持任意關(guān)系型數(shù)據(jù)庫,還可以通過方言持續(xù)擴展,同時支持 多(復(fù)合)主鍵、邏輯刪除、樂觀鎖配置、數(shù)據(jù)脫敏、數(shù)據(jù)審計、 數(shù)據(jù)填充 等等功能。

簡單來說,Mybatis-Flex 相比?Mybatis-Plus 等框架 速度更快、功能更多、代碼更簡潔~

2 準(zhǔn)備工作

官方文檔:快速開始 - MyBatis-Flex

Spring Boot + Maven +?Mysql 項目做演示 👇

2.1 數(shù)據(jù)庫中創(chuàng)建表及插入數(shù)據(jù)

首先往?Mysql 數(shù)據(jù)庫中添加數(shù)據(jù)表和對應(yīng)的數(shù)據(jù),腳本如下:

CREATE TABLE IF NOT EXISTS `flex_user`
(`id`        INTEGER PRIMARY KEY auto_increment,`user_name` VARCHAR(100),`age`       INTEGER,`birthday`  DATETIME
);INSERT INTO flex_user(id, user_name, age, birthday)
VALUES (1, '張三', 18, '2020-01-11'),(2, '李四', 19, '2021-03-21');

我使用的是 DBeaver 工具,執(zhí)行完該語句后效果如下 👇

2.2 Spring Boot 項目初始化

此時需要創(chuàng)建 Spring Boot 項目,并添加 Maven 依賴;此處我通過 IDEA 使用 Spring Initializer 快速初始化一個 Spring Boot 工程。

📌 創(chuàng)建新項目,以下是相關(guān)參數(shù):

📌 指定 spring boot 版本和勾選 web 依賴

📌 刪除不需要的文件,項目如圖 👇

2.3 添加?Maven 主要依賴

pom.xml 文件中添加以下依賴,由于本項目是通過?Spring Initializer 搭建,因此已存在?spring-boot-starter-webspring-boot-starter-test 依賴。

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--1.數(shù)據(jù)庫驅(qū)動--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- 數(shù)據(jù)庫連接池組件--><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!--2.lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--3.mybatis-flex--><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.5.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2.4 配置數(shù)據(jù)源

application.properties 或?application.yml 中配置數(shù)據(jù)源:

#數(shù)據(jù)庫連接配置
spring.datasource.username=root
spring.datasource.password=root
#mysql5~8 驅(qū)動不同driver-class-name     8需要增加時區(qū)的配置serverTimezone=UTC,放在url最后
#useSSL=false 安全連接
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3?Mybatis-Flex 實踐

3.1?編寫實體類和 Mapper 接口

路徑:src/main/java/com/yinyu/flex/pojo/User.java

📌 User?實體類

  • 使用 @Table("flex_user") 設(shè)置實體類與表名的映射關(guān)系
  • 使用 @Id(keyType = KeyType.Auto) 標(biāo)識主鍵為自增
package com.yinyu.flex.pojo;import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.util.Date;@Data
@Table("flex_user")
public class User {@Id(keyType = KeyType.Auto)private Long id;private String userName;private Integer age;private Date birthday;
}

📌 Mapper 接口繼承 BaseMapper 接口

路徑:src/main/java/com/yinyu/flex/mapper/UserMapper.java

package com.yinyu.flex.mapper;import com.mybatisflex.core.BaseMapper;
import com.yinyu.flex.pojo.User;
import org.springframework.stereotype.Repository;@Repository//代表持久層
public interface UserMapper extends BaseMapper<User> {//所有CRUD操作都編寫完成了
}

這部分也可以使用 MyBatis-Flex 的代碼生成器來生,功能非常強大的。詳情進(jìn)入:代碼生成器章節(jié)?了解。

3.2?在主啟動類添加 @MapperScan 注解

路徑:src/main/java/com/yinyu/flex/MybatisFlexApplication.java

用于掃描 Mapper 文件夾:

package com.yinyu.flex;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.yinyu.flex.mapper")
public class MybatisFlexApplication {public static void main(String[] args) {SpringApplication.run(MybatisFlexApplication.class, args);}}

3.3?Test 測試

路徑:src/test/java/com/yinyu/flex/MybatisFlexApplicationTests.java

使用測試類進(jìn)行測試~

① 普通查詢

package com.yinyu.flex;import com.yinyu.flex.mapper.UserMapper;
import com.yinyu.flex.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;@SpringBootTest
class MybatisFlexApplicationTests {//繼承了BaseMapper,所有的方法都來自父類,我們也可以編寫自己的擴展方法!@Autowiredprivate UserMapper userMapper;@Testvoid contextLoads() {// 查詢所有的記錄List<User> users = userMapper.selectAll();users.forEach(System.out::println);}
}

輸出成功 👇,可以看到完成了查詢數(shù)據(jù)表的操作,展示準(zhǔn)確!

② 鏈?zhǔn)讲樵?/h3>

若想使用鏈?zhǔn)讲樵?/strong>還得需要 APT 配置,MyBatis-Flex 使用了 APT(Annotation Processing Tool)技術(shù),在項目編譯的時候,會自動根據(jù) Entity/pojo?類定義的字段幫你生成 "USER" 類(可用于鏈?zhǔn)讲樵?#xff09;

通過開發(fā)工具構(gòu)建項目(如下圖),或者執(zhí)行 maven 編譯命令: mvn clean package 都可以自動生成。

?正常情況下,會在 target 包下生成如下資源 👇

若導(dǎo)入該資源失敗,可點擊項目目錄(注意是項目的根目錄),右鍵 > Maven:

  1. 先點擊 Generate Sources and Update Folders
  2. 再點擊 Reload project

若生成該資源并導(dǎo)入成功,那么此時,可使用鏈?zhǔn)讲樵?👇

import static com.yinyu.flex.pojo.table.UserTableDef.USER;
... @Testvoid testWrapper() {// 測試鏈?zhǔn)讲樵僎ueryWrapper queryWrapper = QueryWrapper.create().select().where(USER.AGE.eq(18));User account = userMapper.selectOneByQuery(queryWrapper);System.out.println(account);}
...

總的來說,MyBatis-Flex 的鏈?zhǔn)讲樵兿啾?MyBatis-Plus 多了一步配置環(huán)節(jié),目前來看其他步驟類似。

4 MyBatis-Flex/Plus?代碼對比

接下來看一下MyBatis-Flex ?MyBatis-Plus?各部分功能代碼的差別,Employee、Account

4.1?基礎(chǔ)查詢

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(EMPLOYEE.LAST_NAME.like(searchWord)) //條件為null時自動忽略.and(EMPLOYEE.GENDER.eq(1)).and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().like(searchWord != null, "last_name", searchWord).eq("gender", 1).gt("age", 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);//lambda 寫法:
LambdaQueryWrapper<Employee> queryWrapper = Wrappers.<Employee>lambdaQuery().like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B").eq(Employee::getGender, 1).gt(Employee::getAge, 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

4.2 集合查詢

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select(ACCOUNT.ID,ACCOUNT.USER_NAME,max(ACCOUNT.BIRTHDAY),avg(ACCOUNT.SEX).as("sex_avg"));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().select("id","user_name","max(birthday)","avg(birthday) as sex_avg");
List<Employee> employees = employeeMapper.selectList(queryWrapper);

缺點:字段硬編碼,容易拼錯。無法使用 IDE 的字段進(jìn)行重構(gòu),無法使用 IDE 自動提示,發(fā)生錯誤不能及時發(fā)現(xiàn)。

4.3 and(...) 和 or(...)

假設(shè)我們要構(gòu)建如下的 SQL 進(jìn)行查詢(需要在 SQL 中添加括號)。

SELECT * FROM tb_account
WHERE id >= 100
AND (sex = 1 OR sex = 2)
OR (age IN (18,19,20) AND user_name LIKE "%michael%" )

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(ACCOUNT.ID.ge(100)).and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))).or(ACCOUNT.AGE.in(18, 19, 20).and(ACCOUNT.USER_NAME.like("michael")));

MyBatis-Plus:

QueryWrapper<Employee> query = Wrappers.query().ge("id", 100).and(i -> i.eq("sex", 1).or(x -> x.eq("sex", 2))).or(i -> i.in("age", 18, 19, 20).like("user_name", "michael"));
// or lambda
LambdaQueryWrapper<Employee> query = Wrappers.<Employee>lambdaQuery().ge(Employee::getId, 100).and(i -> i.eq(Employee::getSex, 1).or(x -> x.eq(Employee::getSex, 2))).or(i -> i.in(Employee::getAge, 18, 19, 20).like(Employee::getUserName, "michael"));

4.4 多表查詢

📌 情況1

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select().from(ACCOUNT).leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)).where(ACCOUNT.AGE.ge(10));List<Account> accounts = mapper.selectListByQuery(query);

MyBatis-Plus:不支持

📌 情況2

假設(shè)查詢的 SQL 如下:

SELECT a.id, a.user_name, b.id AS articleId, b.title
FROM tb_account AS a, tb_article AS b
WHERE a.id = b.account_id

MyBatis-Flex:

QueryWrapper query = new QueryWrapper()
.select(ACCOUNT.ID, ACCOUNT.USER_NAME, ARTICLE.ID.as("articleId"), ARTICLE.TITLE)
.from(ACCOUNT.as("a"), ARTICLE.as("b"))
.where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID));

MyBatis-Plus:不支持

4.5?部分字段更新

假設(shè)一個實體類 Account 中,我們要更新其內(nèi)容如下:

  • userName 為 "michael"
  • age 為 "18"
  • birthday 為 null

其他字段保持?jǐn)?shù)據(jù)庫原有內(nèi)容不變,要求執(zhí)行的 SQL 如下:

update tb_account
set user_name = "michael", age = 18, birthday = null
where id = 100

MyBatis-Flex?代碼如下:

Account account = UpdateEntity.of(Account.class);
account.setId(100); //設(shè)置主鍵
account.setUserName("michael");
account.setAge(18);
account.setBirthday(null);accountMapper.update(account);

MyBatis-Plus 代碼如下(或可使用 MyBatis-Plus 的 LambdaUpdateWrapper,但性能沒有 UpdateWrapper 好):

UpdateWrapper<Account> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 100);
updateWrapper.set("user_name", "michael");
updateWrapper.set("age", 18);
updateWrapper.set("birthday", null);accountMapper.update(null, updateWrapper);

如上,MyBatis-Flex 在代碼編寫來說還是有些優(yōu)勢。

http://www.risenshineclean.com/news/36847.html

相關(guān)文章:

  • 建立網(wǎng)站服務(wù)的公司網(wǎng)站武漢百度快速排名提升
  • 網(wǎng)站怎么做一盤優(yōu)化排名百度旗下13個app
  • 石家莊個人建網(wǎng)站長沙服務(wù)好的網(wǎng)絡(luò)營銷
  • 如何做網(wǎng)站后臺的維護互聯(lián)網(wǎng)推廣項目
  • 網(wǎng)站建設(shè)公司怎么找客戶天津推廣的平臺
  • 煙臺做網(wǎng)站那家好網(wǎng)絡(luò)營銷的缺點及建議
  • phpcms 怎么做視頻網(wǎng)站seo關(guān)鍵詞排名優(yōu)化軟件怎么選
  • 網(wǎng)上課程網(wǎng)站建設(shè)方案百度競價官網(wǎng)
  • 泰州網(wǎng)站建設(shè)報價合肥seo推廣外包
  • 網(wǎng)站設(shè)計一年費用有鏈接的網(wǎng)站
  • 優(yōu)化網(wǎng)站關(guān)鍵詞網(wǎng)站一般怎么推廣
  • 做便民網(wǎng)站都需要提供什么seo搜索優(yōu)化是什么意思
  • 移動網(wǎng)站開發(fā)基礎(chǔ)知識seo綜合查詢站長工具關(guān)鍵詞
  • 地板網(wǎng)站源碼app推廣接單渠道
  • 做電子商務(wù)網(wǎng)站需要什么軟件愛站網(wǎng)seo查詢
  • 百度上如何創(chuàng)建自己的網(wǎng)站北京網(wǎng)站seo公司
  • 使用模板建站惠州seo計費管理
  • 展示頁網(wǎng)站怎么做排名網(wǎng)站設(shè)計與制作畢業(yè)論文范文
  • 網(wǎng)站建設(shè)常用的方法蘇州吳中區(qū)seo關(guān)鍵詞優(yōu)化排名
  • 重慶建筑模板生產(chǎn)廠家seo價格查詢公司
  • 公司網(wǎng)站制作流程今天的新聞 聯(lián)播最新消息
  • 豐都網(wǎng)站建設(shè)信息流推廣
  • 用html5做的網(wǎng)站素材山東seo百度推廣
  • 做網(wǎng)站的服務(wù)器怎么弄什么網(wǎng)站推廣比較好
  • 做優(yōu)惠券網(wǎng)站賺錢嗎seo整站怎么優(yōu)化
  • 在搜狐快站上做網(wǎng)站怎么跳轉(zhuǎn)我的百度賬號登錄
  • wordpress 電商網(wǎng)站百度首頁 百度一下
  • 口碑好的揚州網(wǎng)站建設(shè)指數(shù)是什么
  • 淘寶客的api怎么做網(wǎng)站高端定制網(wǎng)站建設(shè)公司
  • 企術(shù)建站公司網(wǎng)站設(shè)計方案