欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Spring Data JPA與MyBatisPlus的比較

 更新時(shí)間:2024年08月30日 10:50:32   投稿:zx  
本文主要介紹了淺談Spring Data JPA 與 MyBatisPlus的比較

1 前言

JPA(Java Persistence API)和MyBatis Plus是兩種不同的持久化框架,它們具有不同的特點(diǎn)和適用場(chǎng)景。

JPA是Java官方的持久化規(guī)范,它提供了一種基于對(duì)象的編程模型,可以通過注解或XML配置來實(shí)現(xiàn)對(duì)象與數(shù)據(jù)庫(kù)的映射關(guān)系。JPA的優(yōu)點(diǎn)是可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行更高級(jí)的操作,如查詢、更新、刪除等,同時(shí)也支持事務(wù)管理和緩存機(jī)制,能夠更好地支持復(fù)雜的業(yè)務(wù)邏輯。

MyBatis Plus (MPP) 是在MyBatis基礎(chǔ)上進(jìn)行封裝的增強(qiáng)版本,它提供了更簡(jiǎn)單易用的API和更高效的性能。MyBatis Plus通過XML或注解的方式來配置數(shù)據(jù)庫(kù)映射關(guān)系,并提供了豐富的查詢、更新、刪除操作的方法。相對(duì)于JPA,MyBatis Plus配置簡(jiǎn)單、易于上手,同時(shí)也靈活性較高,能夠更好地滿足項(xiàng)目的特定需求。

如果只是針對(duì)單表的增刪改查,兩者十分相似,本質(zhì)上都算ORM框架,那么到底什么時(shí)候適合用JPA,什么時(shí)候用MyBatisPlus,下面做下這兩者的詳細(xì)對(duì)比。

2 POM依賴

  • JPA
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  • MPP
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

3 Entity定義

  • JPA
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GeneratedValue;

@Entity
@Table(name = "dept")
public class Dept {
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@Column(name = "code")
	private String code;
	
	@Column(name = "name")
	private String name;
}
  • MPP
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

@TableName(value = "dept")
public class Dept {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @TableField(value = "code")
    private String code;

    @TableField(value = "name")
    private String name;
}

4 DAO基類

  • JPA
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface DeptRepository extends JpaRepository<Dept, Long> {
}
  • MPP
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

@Mapper
public interface DeptMapper extends BaseMapper&lt;Dept&gt; {
}

4.1 基類主要方法

方法JpaRepositoryMPP BaseMapper
插入一條記錄save(T entity)insert(T entity)
插入多條記錄saveAll(Iterable<T> entities)insertBatchSomeColumn(List<T> entityList)
根據(jù) ID 刪除deleteById(ID id)deleteById(Serializable id)
根據(jù)實(shí)體(ID)刪除delete(T entity)deleteById(T entity)
根據(jù)條件刪除記錄-delete(Wrapper<T> queryWrapper)
刪除(根據(jù)ID或?qū)嶓w 批量刪除)deleteAllById(Iterable<? extends ID> ids)deleteBatchIds(Collection<?> idList)
根據(jù) ID 修改save(T entity)updateById(T entity)
根據(jù)條件更新記錄-update(Wrapper<T> updateWrapper)
根據(jù) ID 查詢findById(ID id)selectById(Serializable id)
查詢(根據(jù)ID 批量查詢)findAllById(Iterable<ID> ids)selectBatchIds(Collection<? extends Serializable> idList)
根據(jù)條件查詢一條記錄-selectOne(Wrapper<T> queryWrapper)
根據(jù)條件判斷是否存在記錄exists(Example<T> example)exists(Wrapper<T> queryWrapper)
根據(jù)條件查詢總記錄數(shù)count(Example<T> example)selectCount(Wrapper<T> queryWrapper)
根據(jù)條件查詢?nèi)坑涗?/td>findAll(Example<T> example, Sort sort)selectList(Wrapper<T> queryWrapper)
根據(jù)條件查詢分頁(yè)記錄findAll(Example<T> example, Pageable pageable)selectPage(P page, Wrapper<T> queryWrapper)

4.2 Example、Specification VS Wrapper

JPA使用Example和Specification 類來實(shí)現(xiàn)范本數(shù)據(jù)的查詢,而MPP使用QueryWrapper來設(shè)置查詢條件

4.2.1 JPA Example

Dept dept = new Dept();
dept.setCode("100");
dept.setName("Dept1");

// select * from dept where code = '100' and name = 'Dept1';
List<Dept> deptList = deptRepository.findAll(Example.of(dept)); 

默認(rèn)是生成的條件都是 “=”,如果要設(shè)置其他比較符,需要使用ExampleMatcher

Dept dept = new Dept();
dept.setCode("100");
dept.setName("Dept1");

// select * from dept where code like '100%' and name like '%Dept1%';
List<Dept> deptList = deptRepository.findAll(Example.of(dept, ExampleMatcher.matching()
                .withMatcher("code", ExampleMatcher.GenericPropertyMatchers.startsWith())
                .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains()))); 

4.2.2 JPA Specification

Example僅能實(shí)現(xiàn)對(duì)字符串類型的匹配模式,如果要設(shè)置其他類型的字段,可以實(shí)現(xiàn)JpaSpecificationExecutor接口來完成:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface DeptRepository extends JpaRepository<Dept, Long>, JpaSpecificationExecutor<Dept>  {
}

增加以上接口后,會(huì)增加以下查詢方法:

  • findOne(Specification spec)
  • findAll(Specification spec)
  • findAll(Specification spec, Pageable pageable)
  • count(Specification spec)
  • exists(Specification spec)

使用示例:

Dept dept = new Dept();
dept.setCode("100");
dept.setName("Dept1");

// select * from dept where code like '100%' and name like '%Dept1%';
Specification<Dept> spec = new Specification<Dept>() {
   @Override
   public Predicate toPredicate(Root<Dept> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
       List<Predicate> predicates = new ArrayList<>();
       predicates.add(cb.like(root.get("code"), dept.getCode() + "%"));
       predicates.add(cb.like(root.get("code"), '%' + dept.getCode() + "%"));
       return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
    }
};
List<Dept> deptList = deptRepository.findAll(Example.of(dept)); 

除了equal、notEqual, 針對(duì)日期、數(shù)字類型,還有gtge、ltle等常用比較符。

4.2.3 MPP Wrpper

MPP Wrapper類似于JPA的CriteriaBuilder,不過用法上更加便捷:

Dept dept = new Dept();
dept.setCode("100");
dept.setName("Dept1");

// select * from dept where code = '100' and name = 'Dept';
Wrapper<Dept> wrapper = Wrappers.lambdaQueryWrapper(detp);
List<Dept> deptList = deptRepository.selectList(wrapper); 

默認(rèn)是生成的條件都是 “=”,如果要設(shè)置其他比較符,需要單獨(dú)設(shè)置Wrapper:

Dept dept = new Dept();
dept.setCode("100");
dept.setName("Dept1");

// select * from dept where code like '100%' and name like '%Dept1%';
Wrapper<Dept> wrapper = Wrappers.<Dept>lambdaQueryWrapper()
                        .likeRight(Dept::getCode, dept.getCode)
                        .like(Dept::getName, dept.getName);
List<Dept> deptList = deptRepository.selectList(wrapper); 

4.2.4 JPA Specification 與 MPP Wrpper的方法匯總

方法JPA SpecificationMPP Wrpper
等于 =equaleq
不等于 <>notEqualne
大于 >greaterThan, gtgt
大于等于 >=greaterThanOrEqualTo, gege
小于 <lessThan, ltlt
小于等于 <=lessThanOrEqualTo, lele
BETWEEN 值1 AND 值2betweenbetween
NOT BETWEEN 值1 AND 值2-notBetween
LIKE ‘%值%’likelike
NOT LIKE ‘%值%’notLikenotLike
LIKE ‘%值’likelikeLeft
LIKE ‘值%’likelikeRight
NOT LIKE ‘%值’notLikenotLikeLeft
NOT LIKE ‘值%’notLikenotLikeRight
字段 IS NULLisNullisNull
字段 IS NOT NULLisNotNullisNotNull
字段 = trueisTrue-
字段 = falseisFalse-
字段 IN (v0, v1, …)inin
字段 NOT IN (v0, v1, …)-notIn
排序:ORDER BY 字段, … ASCascorderByAsc
排序:ORDER BY 字段, … DESCdescorderByDesc
排序:ORDER BY 字段, …orderBy(CriteriaQuery)orderBy
拼接 ORoror
AND 嵌套andand
正常嵌套 不帶 AND 或者 OR-nested
拼接 sql-apply
無視優(yōu)化規(guī)則直接拼接到 sql 的最后-last
拼接 EXISTS ( sql語(yǔ)句 )existsexists
拼接 NOT EXISTS ( sql語(yǔ)句 )-notExists
去重distinct(CriteriaQuery)-
設(shè)置查詢字段select, multiselect(CriteriaQuery)select
分組:GROUP BY 字段, …groupBy(CriteriaQuery)groupBy
SQL SET 字段-set
設(shè)置 SET 部分 SQL-setSql
字段自增變量 val 值-setIncrBy
字段自減變量 val 值-setDecrBy
條件判斷selectCase-
平均值avg-
加和sum, sumAsLong, sumAsDouble-
計(jì)數(shù)count, countDistinct-
最大值max, greatest-
最小值min, least-
取反neg-
絕對(duì)值abs-
Productprod-
差值diff-
求商quot-
取模mod-
開根號(hào)sqrt-
轉(zhuǎn)換類型toLong, toInteger, toFloat, toDouble, toBigDecimal, toBigInteger, toString-
集合是否為空isEmpty, isNotEmpty-
集合大小size-
是否包含isMember, isNotMember-
鍵值對(duì)keys, values-
字符串拼接concat-
字符串分隔substring-
去空白trim-
大小寫轉(zhuǎn)換upper, lower-
字符串長(zhǎng)度length-
空處理nullif, coalesce-

5 DAO子類

5.1 JPA Repository方法命名規(guī)范

JPA支持接口規(guī)范方法名查詢,一般查詢方法以 find、findBy、read、readBy、get、getBy為前綴,JPA在進(jìn)行方法解析的時(shí)候會(huì)把前綴取掉,然后對(duì)剩下部分進(jìn)行解析。例如:

@Repository
public interface DeptRepository extends JpaRepository<Dept, Long> {
    
    // 調(diào)用此方法時(shí),會(huì)自動(dòng)生成 where code = ? 的條件
	Dept getByCode(String code);
}

常用的方法命名有:

關(guān)鍵字方法命名sql條件
DistinctfindDistinctByLastnameAndFirstnameselect distinct …? where x.lastname = ?1 and x.firstname = ?2
AndfindByNameAndPwdwhere name= ? and pwd =?
OrfindByNameOrSexwhere name= ? or sex=?
Is,EqualsfindById, findByIdIs, findByIdEqualswhere id= ?
BetweenfindByIdBetweenwhere id between ? and ?
LessThanfindByIdLessThanwhere id < ?
LessThanEqualsfindByIdLessThanEqualswhere id <= ?
GreaterThanfindByIdGreaterThanwhere id > ?
GreaterThanEqualsfindByIdGreaterThanEqualswhere id > = ?
AfterfindByIdAfterwhere id > ?
BeforefindByIdBeforewhere id < ?
IsNullfindByNameIsNullwhere name is null
isNotNull,NotNullfindByNameNotNullwhere name is not null
LikefindByNameLikewhere name like ?
NotLikefindByNameNotLikewhere name not like ?
StartingWithfindByNameStartingWithwhere name like ‘?%’
EndingWithfindByNameEndingWithwhere name like ‘%?’
ContainingfindByNameContainingwhere name like ‘%?%’
OrderByfindByIdOrderByXDescwhere id=? order by x desc
NotfindByNameNotwhere name <> ?
InfindByIdIn(Collection<?> c)where id in (?)
NotInfindByIdNotIn(Collection<?> c)where id not in (?)
TruefindByEnabledTuewhere enabled = true
FalsefindByEnabledFalsewhere enabled = false
IgnoreCasefindByNameIgnoreCasewhere UPPER(name)=UPPER(?)
First,TopfindFirstByOrderByLastnameAscorder by lastname limit 1
FirstN,TopNfindTop3ByOrderByLastnameAscorder by lastname limit 3

5.2 MPP自定義方法 + 接口默認(rèn)實(shí)現(xiàn)

MyBatisPlus沒有JPA那樣可以根據(jù)接口的方法名自動(dòng)組裝查詢條件,但是可以利用Java8的接口默認(rèn)實(shí)現(xiàn)來達(dá)到同樣的目的,只不過需要編寫少量的代碼:

import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
    default Dept getByCode(String code) {
		return selectOne(Wrappers.<Dept>lambdaWrapper().eq(Dept::getCode, code));
	}
}

6 自定義SQL

JPA支持通過@Query注解和XML的形式實(shí)現(xiàn)自定義SQL,而MyBatis支持通過@Select、@Delete、@Update、@Script注解和XML的形式實(shí)現(xiàn)自定義SQL。

6.1 JPA

JPA的自定義SQL分為JPQL(Java Persistence Query Language Java 持久化查詢語(yǔ)言)和原生SQL兩種。
JPQL:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

@Repository
public interface DeptRepository extends JpaRepository<Dept, Long> {
    @Query(value = "select d from Dept d where d.code = ?1")
	Dept getByCode(String code);

    @Modifying
    @Query(value = "delete from Dept d where d.code = :code")
    int deleteByCode(@Param("code") String code);
}

原生SQL

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

@Repository
public interface DeptRepository extends JpaRepository<Dept, Long> {
    @Query(value = "SELECT * FROM dept WHERE name = ?1", countQuery = "SELECT count(*) FROM dept WHERE name = ?1", nativeQuery = true)
    Page<Dept> findByName(@Param("name") String name, Pageable pageable);
}

XML形式:
/resource/META-INFO/orm.xml

<named-query name="Dept.getByCode">
  <query> select d from Dept d where d.code = ?1</query>
</named-query>
<named-native-query name="Dept.deleteByCode">
  <query> DELETE FROM dept WHERE code = ?1</query>
</named-native-query>

6.2 MyBatis

JPA的自定義SQL分為注解形式和XML形式
注解形式:

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
    @Select(value = "SELECT * FROM dept WHERE code = #[code]")
	Dept getByCode(@Param("code") String code);

    @Delete("DELETE FROM dept WHERE code = #[code]")
    int deleteByCode(@Param("code") String code);
    
    @Select(value = "SELECT * FROM dept WHERE name = #{name}")
    IPage<Dept> findByName(@Param("name") String name, IPage<Dept> page);
}

XML形式:
/resource/mapper/DeptMapper.xml

<mapper namespace="DeptMapper">
	<select id = "getByCode", resultType = "Dept">
		SELECT * FROM dept WHERE code = #[code]
	</select>
	<delete id = "deleteByCode">
		DELETE FROM dept WHERE code = #[code]
	</select>
	<select id = "findByName">
		SELECT * FROM dept WHERE name = #{name}
	</select>
</mapper>

7 表關(guān)聯(lián)

待補(bǔ)充

8 其他

對(duì)于簡(jiǎn)單的CRUD操作,JPA和MPP都提供了豐富的API簡(jiǎn)化開發(fā)人員的操作,但是有些差異化的地方需要總結(jié)下:

比較點(diǎn)JPAMPP
成熟度JPA畢竟是javax標(biāo)準(zhǔn),成熟度自然高MyBatis成熟度也很高,但是MPP畢竟是國(guó)內(nèi)個(gè)人維護(hù),質(zhì)量和成熟度相對(duì)還是比較低的,但是使用起來更加適配國(guó)內(nèi)開發(fā)者的習(xí)慣
自動(dòng)DDLJPA可以根據(jù)Entity的定義自動(dòng)更新實(shí)際數(shù)據(jù)庫(kù)的DDL, 使用起來比較便利利用MPP的腳本自動(dòng)維護(hù)Flyway進(jìn)行SQL腳本的自動(dòng)執(zhí)行
實(shí)體關(guān)系使用@OneToMany、@OneToOne、@ManyTo@Many注解描述表與表之間的關(guān)聯(lián),查詢時(shí)自動(dòng)進(jìn)行表的關(guān)聯(lián),并且支持更新和刪除時(shí)自動(dòng)級(jí)聯(lián)到關(guān)聯(lián)的實(shí)體使用<association><collection>標(biāo)簽以及@One、@Many注解來映射結(jié)果集和Java對(duì)象,只支持查詢,不支持更新和刪除, 另外還有一個(gè)MyBatis-Plus-Join項(xiàng)目, 可以實(shí)現(xiàn)Java中表Join的操作。
復(fù)雜SQL查詢不太方便使用xml結(jié)構(gòu)化語(yǔ)言 + 動(dòng)態(tài)SQL 標(biāo)簽 可以實(shí)現(xiàn)非常復(fù)雜的SQL場(chǎng)景
數(shù)據(jù)庫(kù)差異使用自帶的API和JPQL的話,是不用關(guān)心具體用什么數(shù)據(jù)庫(kù),但是用原生SQL的話無法解決數(shù)據(jù)庫(kù)的差異使用自帶API的話,基本上不需要關(guān)注數(shù)據(jù)庫(kù)的差異,如果切換了不同類型的數(shù)據(jù)庫(kù),通過配置databaseIdProvider 就可以根據(jù)當(dāng)前使用數(shù)據(jù)庫(kù)的不同選擇不同的SQL腳本
學(xué)習(xí)曲線較為難,主要是思路的轉(zhuǎn)變,使用JPA更加關(guān)注的是實(shí)體間的關(guān)系,表的結(jié)構(gòu)會(huì)根據(jù)實(shí)體關(guān)系自動(dòng)維護(hù)對(duì)于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的操作,MyBatisPlus可以與JQuery操作DOM元素那么順手

9 個(gè)人建議

目前對(duì)比下來整體的感覺是JPA側(cè)重?cái)?shù)據(jù)建模,關(guān)注數(shù)據(jù)一致性,屏蔽SQL操作,MyBatis側(cè)重構(gòu)建靈活的SQL,而MyBatisPlus在MyBatis的基礎(chǔ)上較少了日常的CRUD操作,JPA更適合事務(wù)性系統(tǒng),MyBatisPlus更適合做分析型系統(tǒng)。

個(gè)人是從SQL -> MyBatis -> MyBatisPlus的路線過來的,所以更習(xí)慣與用MPP解決數(shù)據(jù)的問題,在使用MPP的過程中,越來越發(fā)現(xiàn)自定義SQL用到越來越少,大部分場(chǎng)景下是可以用MPP的API組合來實(shí)現(xiàn)的,即便是MPP不支持多表關(guān)聯(lián),通過抽象視圖的形式,也能達(dá)到單表查詢的效果,只有在極限、特別復(fù)雜的情況下才會(huì)寫SQL。

這么看來,其實(shí)JPA也是能滿足日常的開發(fā)需求的。但是從傳統(tǒng)SQL向JPA的轉(zhuǎn)變是需要一個(gè)過程的,就跟面向過程開發(fā)到面向?qū)ο蟮拈_發(fā),是需要一個(gè)大的開發(fā)思維一個(gè)轉(zhuǎn)變,可能需要在項(xiàng)目的實(shí)踐中不斷體會(huì)和適應(yīng)。

到此這篇關(guān)于淺談Spring Data JPA與MyBatisPlus的比較的文章就介紹到這了,更多相關(guān)Spring Data JPA與MyBatisPlus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java根據(jù)模板導(dǎo)出Excel報(bào)表并復(fù)制模板生成多個(gè)Sheet頁(yè)

    Java根據(jù)模板導(dǎo)出Excel報(bào)表并復(fù)制模板生成多個(gè)Sheet頁(yè)

    本文主要介紹了Java根據(jù)模板導(dǎo)出Excel報(bào)表并復(fù)制模板生成多個(gè)Sheet頁(yè)的方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • Java構(gòu)建高效結(jié)果緩存方法示例

    Java構(gòu)建高效結(jié)果緩存方法示例

    這篇文章主要介紹了Java構(gòu)建高效結(jié)果緩存方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java類中static{}的具體使用

    Java類中static{}的具體使用

    static{}(即static塊),會(huì)在類被加載的時(shí)候執(zhí)行且僅會(huì)被執(zhí)行一次,一般用來初始化靜態(tài)變量和調(diào)用靜態(tài)方法,本文主要介紹了Java類中static{}的具體使用,感興趣的可以了解一下
    2024-07-07
  • 使用SpringCache加Redis做緩存

    使用SpringCache加Redis做緩存

    這篇文章主要介紹了使用SpringCache加Redis做緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • gRPC中interceptor攔截器的使用教程

    gRPC中interceptor攔截器的使用教程

    gRPC中的interceptor攔截器分為客戶端攔截器和服務(wù)端攔截器,分別是在客戶端和服務(wù)端的請(qǐng)求被發(fā)送出去之前進(jìn)行處理的邏輯,下面就跟隨小編一起學(xué)習(xí)一下interceptor攔截器的具體使用吧
    2023-08-08
  • Java中的ByteArrayInputStream詳解

    Java中的ByteArrayInputStream詳解

    Java中,ByteArrayInputStream類是實(shí)現(xiàn)內(nèi)存級(jí)別的字節(jié)流讀取的工具,可以從字節(jié)數(shù)組中讀取數(shù)據(jù),這個(gè)類位于java.io包中,繼承自InputStream,ByteArrayInputStream的主要特點(diǎn)有:在內(nèi)存中操作,不涉及磁盤IO,可以重用流讀取數(shù)據(jù)
    2024-09-09
  • 詳解Java去除json數(shù)據(jù)中的null空值問題

    詳解Java去除json數(shù)據(jù)中的null空值問題

    這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • kafka的消息存儲(chǔ)機(jī)制和原理分析

    kafka的消息存儲(chǔ)機(jī)制和原理分析

    這篇文章主要介紹了kafka的消息存儲(chǔ)機(jī)制和原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Spring循環(huán)依賴產(chǎn)生與解決

    Spring循環(huán)依賴產(chǎn)生與解決

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對(duì)象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進(jìn)行一下小小的回顧
    2022-12-12
  • springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論