鄭州網(wǎng)站制作推廣公司抖音推廣合作方式
文章目錄
- 1.MyBatis-plus基礎(chǔ)
- 1.1.mybatis-plus簡介
- 1.2.基本使用
- 1.3.注解映射
- 主鍵生成策略
- 1.4.命名轉(zhuǎn)換問題
- 1.5.關(guān)閉命名轉(zhuǎn)換功能
- 2.BaseMapper核心接口
1.MyBatis-plus基礎(chǔ)
1.1.mybatis-plus簡介
MyBatis-Plus(簡稱 MP)是一個 MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。
MyBatis-plus官網(wǎng):https://baomidou.com/
特點:
- 潤物無聲:只做增強(qiáng)不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑。
- 效率至上:只需簡單配置,即可快速進(jìn)行單表 CRUD 操作,從而節(jié)省大量時間。
- 豐富功能:代碼生成、自動分頁、邏輯刪除、自動填充等功能一應(yīng)俱全
1.2.基本使用
- 插入依賴
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version>
</dependency>
- 配置文件,這里只配置了數(shù)據(jù)庫,可以加上mybatis-plus加入相關(guān)配置,也可以單獨創(chuàng)建一個java配置類,專門用于配置mybatis-plus
# DataSource Config
spring:datasource:driver-class-name: org.h2.Driverusername: rootpassword: testsql:init:schema-locations: classpath:db/schema-h2.sqldata-locations: classpath:db/data-h2.sql
- 編寫實體類
@Data
public class User {private Long id;private String name;private Integer age;private String email;
}
- 編寫Mapper接口類UserMapper
public interface UserMapper extends BaseMapper<User> {}
要想讓spring知道這個bean,有倆種方式
- 在Mapper接口上加上@Mapper注解,自動注入(推薦)
- 在啟動類添加@MapperScan掃描注解,掃描Mapper文件夾
1.3.注解映射
上面實例中,實體類名與表名,包括屬性名與字段名都是完全一致的,所以mybatis-plus是可以識別的。但在實際開發(fā)中,很有可能會出現(xiàn)表名與實體類名不一致,或者屬性名與字段名不一致的情況。此時就需要使用注解來進(jìn)行映射。
● @TableName:表名注解,標(biāo)識實體類對應(yīng)的表。
● @TableId:主鍵注解(可以使用 type=IdType.AUTO 形式指定主鍵生成策略)
● @TableField:字段注解(非主鍵)
一般在代碼中,實體類應(yīng)該跟數(shù)據(jù)庫中字段名保持一致,這是規(guī)范做法
主鍵生成策略
主鍵生成策略類型 | 描述 |
---|---|
AUTO | 數(shù)據(jù)庫 ID 自增 |
INPUT | insert 前自行 set 主鍵值 |
ASSIGN_ID | 分配 ID(主鍵類型為 Number(Long 和 Integer)或 String) |
ASSIGN_UUID | 分配 UUID,主鍵類型為 String |
使用對應(yīng)策略時,要注意數(shù)據(jù)庫中主鍵屬性與對應(yīng)策略保持一致,否則無法應(yīng)用,如果第一次Snowflake生成之后刪掉后面應(yīng)用策略的時候還是生成Snowflake,需要把數(shù)據(jù)庫對應(yīng)表刪除重新建
1.4.命名轉(zhuǎn)換問題
在實際開發(fā)中,項目中的類名、屬性名,包括數(shù)據(jù)庫中的表名、字段名,這些命名要嚴(yán)格遵守規(guī)范。一般來說:
● 在數(shù)據(jù)庫設(shè)計中,由于數(shù)據(jù)庫不區(qū)分大小寫,所以都采用下劃線命名法。
● 在java中,類名都采用帕斯卡命名法(大駝峰),屬性名都采用駝峰命名法。
在配置文件加入:
# mybatis-plus配置
mybatis-plus:configuration:# 駝峰命名map-underscore-to-camel-case: true# 日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: auto
可以開啟mybatis-plus的駝峰命名
日志可以使運行時控制臺打印輸出的SQL語句
1.5.關(guān)閉命名轉(zhuǎn)換功能
如果數(shù)據(jù)庫中沒有采用下劃線命名法,那么可以在SpringBoot的application.yml配置文件中關(guān)閉此功能:
mybatis-plus:configuration:map-underscore-to-camel-case: false
默認(rèn)開啟
2.BaseMapper核心接口
/*** Mapper 繼承該接口后,無需編寫 mapper.xml 文件,即可獲得CRUD功能*/
public interface BaseMapper<T> extends Mapper<T> {/*** 插入一條記錄* @param entity 實體對象*/int insert(T entity);/*** 根據(jù) ID 刪除* @param id 主鍵ID*/int deleteById(Serializable id);/*** 根據(jù)實體(ID)刪除* @param entity 實體對象*/int deleteById(T entity);/*** 根據(jù) columnMap 條件,刪除記錄* @param columnMap 表字段 map 對象*/int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根據(jù) entity 條件,刪除記錄* @param queryWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句)*/int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 刪除(根據(jù)ID或?qū)嶓w 批量刪除)* @param idList 主鍵ID列表或?qū)嶓w列表(不能為 null 以及 empty)*/int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);/*** 根據(jù) ID 修改* @param entity 實體對象*/int updateById(@Param(Constants.ENTITY) T entity);/*** 根據(jù) whereEntity 條件,更新記錄* @param entity 實體對象 (set 條件值,可以為 null)* @param updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句)*/int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);/*** 根據(jù) ID 查詢* @param id 主鍵ID*/T selectById(Serializable id);/*** 查詢(根據(jù)ID 批量查詢)* @param idList 主鍵ID列表(不能為 null 以及 empty)*/List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 查詢(根據(jù) columnMap 條件)* @param columnMap 表字段 map 對象*/List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根據(jù) entity 條件,查詢一條記錄* <p>查詢一條記錄,例如 qw.last("limit 1") 限制取一條記錄, 注意:多條數(shù)據(jù)會報異常</p>* @param queryWrapper 實體對象封裝操作類(可以為 null)*/default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {List<T> ts = this.selectList(queryWrapper);if (CollectionUtils.isNotEmpty(ts)) {if (ts.size() != 1) {throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");}return ts.get(0);}return null;}/*** 根據(jù) Wrapper 條件,判斷是否存在記錄* @param queryWrapper 實體對象封裝操作類* @return*/default boolean exists(Wrapper<T> queryWrapper) {Long count = this.selectCount(queryWrapper);return null != count && count > 0;}/*** 根據(jù) Wrapper 條件,查詢總記錄數(shù)* @param queryWrapper 實體對象封裝操作類(可以為 null)*/Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據(jù) entity 條件,查詢?nèi)坑涗? @param queryWrapper 實體對象封裝操作類(可以為 null)*/List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據(jù) Wrapper 條件,查詢?nèi)坑涗? @param queryWrapper 實體對象封裝操作類(可以為 null)*/List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據(jù) Wrapper 條件,查詢?nèi)坑涗? <p>注意: 只返回第一個字段的值</p>* @param queryWrapper 實體對象封裝操作類(可以為 null)*/List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據(jù) entity 條件,查詢?nèi)坑涗?#xff08;并翻頁)* @param page 分頁查詢條件(可以為 RowBounds.DEFAULT)* @param queryWrapper 實體對象封裝操作類(可以為 null)*/<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據(jù) Wrapper 條件,查詢?nèi)坑涗?#xff08;并翻頁)* @param page 分頁查詢條件* @param queryWrapper 實體對象封裝操作類*/<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
查看BaseMapper核心接口的源代碼,這里詳細(xì)說明了封裝的增刪改查方法