做網(wǎng)站自己租服務(wù)器還是網(wǎng)絡(luò)公司如何發(fā)布自己的廣告
結(jié)構(gòu)直接看目錄
前言
MyBatis-Plus?是一個?MyBatis?的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。
愿景
我們的愿景是成為 MyBatis 最好的搭檔,就像?魂斗羅?中的 1P、2P,基友搭配,效率翻倍。
特性:
- 無侵入:只做增強(qiáng)不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/li>
- 強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求
- 支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯
- 支持主鍵自動生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
- 內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
- 分頁插件支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫
- 內(nèi)置性能分析插件:可輸出 SQL 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
- 內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作
SpringBoot使用
將以下內(nèi)容引入pom.xml
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency>
以下內(nèi)容可自選
spring:#配置數(shù)據(jù)源信息datasource:type: com.zaxxer.hikari.HikariDataSource#配置數(shù)據(jù)庫連接信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhostusername: rootpassword: root#mybatisplus添加日志功能
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.stdOutImpl
global-config:db-config:#配置Mybatis-plus操作表的默認(rèn)前綴table-prefix: t_#配置Mybatis-plus的主鍵策略id-type: auto
配置文件注意事項
驅(qū)動類driver-class-name
spring boot 2.0(內(nèi)置jdbc5驅(qū)動),驅(qū)動類使用:driver-class-name: com.mysql.jdbc.Driver
spring boot 2.1及以上(內(nèi)置jdbc8驅(qū)動),驅(qū)動類使用:
driver-class-name: com.mysql.cj.jdbc.Driver
否則運行測試用例的時候會有 WARN 信息
連接地址url
MySQL5.7版本的url:
jdbc:mysql://localhost:3306/?characterEncoding=utf-8&useSSL=false
MySQL8.0版本的url:
jdbc:mysql://localhost:3306/?
serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
?注意事項
// 這個屬性用于指定 MyBatis Mapper XML 文件的位置,例如:mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml
mybatis-plus.mapper-locations
// 這個屬性用于設(shè)置是否顯示 MyBatis-Plus 的啟動 banner。在示例中,該屬性被設(shè)置為 false,表示禁用啟動 banner
mybatis-plus.global-config.banner
// 這個屬性用于設(shè)置主鍵 ID 的生成策略。在示例中,auto 表示使用數(shù)據(jù)庫自動生成的主鍵 ID
mybatis-plus.global-config.db-config.id-type:auto
// 這些屬性用于設(shè)置全局的 SQL 過濾策略。在示例中,not_empty 表示只在參數(shù)值非空時才會生成對應(yīng)的 SQL 條件
mybatis-plus.global-config.db-config.where-strategy:not_empty
mybatis-plus.global-config.db-config.insert-strategy:not_empty
mybatis-plus.global-config.db-config.update-strategy:not_null
// 這個屬性用于設(shè)置在 SQL 中處理空值時使用的 JDBC 類型。在示例中,'null' 表示使用 NULL 類型
mybatis-plus.configuration.jdbc-type-for-null:'null'
// 這個屬性用于設(shè)置是否在設(shè)置屬性為 NULL 時調(diào)用對應(yīng)的 setter 方法。在示例中,該屬性被設(shè)置為 true,表示在設(shè)置屬性為 NULL 時會調(diào)用 setter 方法
mybatis-plus.configuration.call-setters-on-nulls:true
引導(dǎo)類中添加 @MapperScan 注解,掃描 Mapper 文件夾
@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class MPApplication {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
建立實體類
自行建立一個實體,可以是最簡單的 學(xué)生,姓名,班級,學(xué)號
建立Mapper層
繼承BaseMapper,后面的實體寫自己的實體
@Mapper
public interface UserMapper extends BaseMapper<UserEntity>{}
建立Service層
建立Service接口
public interface UserService extends IService<UserEntity> {}
建立Service接口實現(xiàn)類ServiceImpl
@Slf4j@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {}
Service Interface接口內(nèi)容說明
插入功能save
// 插入一條記錄(選擇字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
功能描述:插入記錄,根據(jù)實體對象的字段進(jìn)行策略性插入。
返回值:?boolean,表示插入操作是否成功。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
T | entity | 實體對象 |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 插入批次數(shù)量 |
示例?
// 假設(shè)有一個 User 實體對象
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
boolean result = userService.save(user); // 調(diào)用 save 方法
if (result) {System.out.println("User saved successfully.");
} else {System.out.println("Failed to save user.");
}
?生成的 SQL:
INSERT INTO user (name, email) VALUES ('John Doe', 'john.doe@example.com')
如果存在就更新不存在就新增 saveOrUpdate
功能描述:?根據(jù)實體對象的主鍵 ID 進(jìn)行判斷,存在則更新記錄,否則插入記錄。
返回值:?boolean,表示插入或更新操作是否成功。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
T | entity | 實體對象 |
Wrapper<T> | updateWrapper | 實體對象封裝操作類 UpdateWrapper |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 插入批次數(shù)量 |
// TableId 注解屬性值存在則更新記錄,否插入一條記錄
boolean saveOrUpdate(T entity);
// 根據(jù)updateWrapper嘗試更新,否繼續(xù)執(zhí)行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
示例
// 假設(shè)有一個 User 實體對象,其中 id 是 TableId 注解的屬性
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
boolean result = userService.saveOrUpdate(user); // 調(diào)用 saveOrUpdate 方法
if (result) {System.out.println("User updated or saved successfully.");
} else {System.out.println("Failed to update or save user.");
}
生成的 SQL(假設(shè) id 為 1 的記錄已存在):
UPDATE user SET name = 'John Doe', email = 'john.doe@example.com' WHERE id = 1
生成的 SQL(假設(shè) id 為 1 的記錄不存在):
INSERT INTO user (id, name, email) VALUES (1, 'John Doe', 'john.doe@example.com')
刪除功能remove
// 根據(jù) queryWrapper 設(shè)置的條件,刪除記錄
boolean remove(Wrapper<T> queryWrapper);
// 根據(jù) ID 刪除
boolean removeById(Serializable id);
// 根據(jù) columnMap 條件,刪除記錄
boolean removeByMap(Map<String, Object> columnMap);
// 刪除(根據(jù)ID 批量刪除)
boolean removeByIds(Collection<? extends Serializable> idList);
功能描述:?通過指定條件刪除符合條件的記錄。
返回值:?boolean,表示刪除操作是否成功。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
Wrapper<T> | queryWrapper | 實體包裝類 QueryWrapper |
Serializable | id | 主鍵 ID |
Map<String, Object> | columnMap | 表字段 map 對象 |
Collection<? extends Serializable> | idList | 主鍵 ID 列表 |
示例:
刪除
// 假設(shè)有一個 QueryWrapper 對象,設(shè)置刪除條件為 name = 'John Doe'
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
boolean result = userService.remove(queryWrapper); // 調(diào)用 remove 方法
if (result) {System.out.println("Record deleted successfully.");
} else {System.out.println("Failed to delete record.");
}
?生成的 SQL:
DELETE FROM user WHERE name = 'John Doe'
根據(jù)ID刪除
// 假設(shè)要刪除 ID 為 1 的用戶
boolean result = userService.removeById(1); // 調(diào)用 removeById 方法
if (result) {System.out.println("User deleted successfully.");
} else {System.out.println("Failed to delete user.");
}
??生成的 SQL:
DELETE FROM user WHERE id = 1
批量刪除
// 假設(shè)有一組 ID 列表,批量刪除用戶
List<Integer> ids = Arrays.asList(1, 2, 3);
boolean result = userService.removeByIds(ids); // 調(diào)用 removeByIds 方法
if (result) {System.out.println("Users deleted successfully.");
} else {System.out.println("Failed to delete users.");
}
??生成的 SQL:
DELETE FROM user WHERE id IN (1, 2, 3)
更新功能update
// 根據(jù) UpdateWrapper 條件,更新記錄 需要設(shè)置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根據(jù) whereWrapper 條件,更新記錄
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根據(jù) ID 選擇修改
boolean updateById(T entity);
// 根據(jù)ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根據(jù)ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
功能描述:?通過指定條件更新符合條件的記錄。
返回值:?boolean,表示更新操作是否成功。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
Wrapper<T> | updateWrapper | 實體對象封裝操作類 UpdateWrapper |
T | entity | 實體對象 |
Collection<T> | entityList | 實體對象集合 |
int | batchSize | 更新批次數(shù)量 |
?根據(jù)元素進(jìn)行更新
// 假設(shè)有一個 UpdateWrapper 對象,設(shè)置更新條件為 name = 'John Doe',更新字段為 email
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "John Doe").set("email", "john.doe@newdomain.com");
boolean result = userService.update(updateWrapper); // 調(diào)用 update 方法
if (result) {System.out.println("Record updated successfully.");
} else {System.out.println("Failed to update record.");
}
???生成的 SQL:
UPDATE user SET email = 'john.doe@newdomain.com' WHERE name = 'John Doe'
根據(jù)ID進(jìn)行更新
// 假設(shè)有一個 User 實體對象,設(shè)置更新字段為 email,根據(jù) ID 更新
User updateEntity = new User();
updateEntity.setId(1);
updateEntity.setEmail("updated.email@example.com");
boolean result = userService.updateById(updateEntity); // 調(diào)用 updateById 方法
if (result) {System.out.println("Record updated successfully.");
} else {System.out.println("Failed to update record.");
}
????生成的 SQL:
UPDATE user SET email = 'updated.email@example.com' WHERE id = 1
查詢功能get
// 根據(jù) ID 查詢
T getById(Serializable id);
// 根據(jù) Wrapper,查詢一條記錄。結(jié)果集,如果是多個會拋出異常,隨機(jī)取一條加上限制條件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根據(jù) Wrapper,查詢一條記錄
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根據(jù) Wrapper,查詢一條記錄
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根據(jù) Wrapper,查詢一條記錄
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
功能描述:?根據(jù)指定條件查詢符合條件的記錄。
返回值:?查詢結(jié)果,可能是實體對象、Map 對象或其他類型。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
Serializable | id | 主鍵 ID |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
boolean | throwEx | 有多個 result 是否拋出異常 |
T | entity | 實體對象 |
Function<? super Object, V> | mapper | 轉(zhuǎn)換函數(shù) |
根據(jù)id進(jìn)行查詢
// 假設(shè)要查詢 ID 為 1 的用戶
User user = userService.getById(1); // 調(diào)用 getById 方法
if (user != null) {System.out.println("User found: " + user);
} else {System.out.println("User not found.");
}
???生成的 SQL:
SELECT * FROM user WHERE id = 1
根據(jù)對象進(jìn)行查詢
// 假設(shè)有一個 QueryWrapper 對象,設(shè)置查詢條件為 name = 'John Doe'
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
User user = userService.getOne(queryWrapper); // 調(diào)用 getOne 方法
if (user != null) {System.out.println("User found: " + user);
} else {System.out.println("User not found.");
}
生成的SQL:
SELECT * FROM user WHERE name = 'John Doe' LIMIT 1
查詢記錄功能list
// 查詢所有
List<T> list();
// 查詢列表
List<T> list(Wrapper<T> queryWrapper);
// 查詢(根據(jù)ID 批量查詢)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查詢(根據(jù) columnMap 條件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查詢所有列表
List<Map<String, Object>> listMaps();
// 查詢列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查詢?nèi)坑涗?List<Object> listObjs();
// 查詢?nèi)坑涗?<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根據(jù) Wrapper 條件,查詢?nèi)坑涗?List<Object> listObjs(Wrapper<T> queryWrapper);
// 根據(jù) Wrapper 條件,查詢?nèi)坑涗?<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
功能描述:?查詢符合條件的記錄。
返回值:?查詢結(jié)果,可能是實體對象、Map 對象或其他類型。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
Collection<? extends Serializable> | idList | 主鍵 ID 列表 |
Map<String, Object> | columnMap | 表字段 map 對象 |
Function<? super Object, V> | mapper | 轉(zhuǎn)換函數(shù) |
示例:
查詢?nèi)?/h5>
// 查詢所有用戶
List<User> users = userService.list(); // 調(diào)用 list 方法
for (User user : users) {System.out.println("User: " + user);
}
生成的SQL:
SELECT * FROM user
根據(jù)實體進(jìn)行查詢
// 假設(shè)有一個 QueryWrapper 對象,設(shè)置查詢條件為 age > 25
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 25);
List<User> users = userService.list(queryWrapper); // 調(diào)用 list 方法
for (User user : users) {System.out.println("User: " + user);
}
生成的SQL:
SELECT * FROM user WHERE age > 25
批量查詢用戶
// 假設(shè)有一組 ID 列表,批量查詢用戶
List<Integer> ids = Arrays.asList(1, 2, 3);
Collection<User> users = userService.listByIds(ids); // 調(diào)用 listByIds 方法
for (User user : users) {System.out.println("User: " + user);
}
// 查詢所有用戶
List<User> users = userService.list(); // 調(diào)用 list 方法
for (User user : users) {System.out.println("User: " + user);
}
SELECT * FROM user
// 假設(shè)有一個 QueryWrapper 對象,設(shè)置查詢條件為 age > 25
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 25);
List<User> users = userService.list(queryWrapper); // 調(diào)用 list 方法
for (User user : users) {System.out.println("User: " + user);
}
SELECT * FROM user WHERE age > 25
// 假設(shè)有一組 ID 列表,批量查詢用戶
List<Integer> ids = Arrays.asList(1, 2, 3);
Collection<User> users = userService.listByIds(ids); // 調(diào)用 listByIds 方法
for (User user : users) {System.out.println("User: " + user);
}
生成的SQL:
SELECT * FROM user WHERE id IN (1, 2, 3)
分頁查詢
// 無條件分頁查詢
IPage<T> page(IPage<T> page);
// 條件分頁查詢
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 無條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 條件分頁查詢
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
功能描述:?分頁查詢符合條件的記錄。
返回值:?分頁查詢結(jié)果,包含記錄列表和總記錄數(shù)。
參數(shù)說明:
類型 | 參數(shù)名 | 描述 |
---|---|---|
IPage<T> | page | 翻頁對象 |
Wrapper<T> | queryWrapper | 實體對象封裝操作類 QueryWrapper |
示例
分頁查詢
// 假設(shè)要進(jìn)行無條件的分頁查詢,每頁顯示10條記錄,查詢第1頁
IPage<User> page = new Page<>(1, 10);
IPage<User> userPage = userService.page(page); // 調(diào)用 page 方法
List<User> userList = userPage.getRecords();
long total = userPage.getTotal();
System.out.println("Total users: " + total);
for (User user : userList) {System.out.println("User: " + user);
}
?生成的SQL:
SELECT * FROM user LIMIT 10 OFFSET 0