JdbcTemplate+PageImpl實現多表分頁查詢

一、基礎實體 

@MappedSuperclass
public abstract class AbsIdEntity implements Serializable {private static final long serialVersionUID = 7988377299341530426L;public final static int IS_DELETE_YES = 1;// 標記刪除public final static int IS_DELETE_NO = 0;// 未刪除,保留的
@Id@GenericGenerator(name="uuid", strategy="uuid")@GeneratedValue(generator="uuid")protected String id;@Column(name = "creationtime")protected Timestamp creationTimestamp = new Timestamp(System.currentTimeMillis());@Column(name = "lastmodifiedtime")protected Timestamp modificationTimestamp;@Column(name = "dr")protected int dr;// 是否刪除。0:未刪除;1:已刪除/*** 主鍵,對應id字段*/public String getId() { return id; }public void setId(String id) { this.id = id; }/*** 創建日期,對應ts_insert字段*/public Timestamp getCreationTimestamp() { return creationTimestamp; }public void setCreationTimestamp(Timestamp creationTimestamp) { this.creationTimestamp = creationTimestamp; }/*** 修改日期,對應ts_update字段*/public Timestamp getModificationTimestamp() { return modificationTimestamp; }public void setModificationTimestamp(Timestamp modificationTimestamp) { this.modificationTimestamp = modificationTimestamp; }/*** 是否刪除,對應dr字段* @return*/public int getDr() {return dr;}public void setDr(int dr) {this.dr = dr;}}
View Code

二、擴展VO

import java.io.Serializable;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;import xxx.entity.AbsIdEntity;public class StaffUnionVO extends AbsIdEntity implements Serializable, RowMapper<StaffUnionVO>{/*** */private static final long serialVersionUID = -5213225066818183479L;private String code;// 員工編碼private String name;// 員工姓名private int sex; // 性別private Date birthday;// 出生年月日private String deptId;// 人員所屬部門private String companyId;//人員所屬公司表private EnumStatus status;// 員工狀態,在職,離職private String nativePlace;// 籍貫private String education;// 學歷private EnumPoliticalStatus politicalStatus;// 政治面貌private String major;// 所學專業private String school;// 畢業學校private Date graduationTime;// 畢業時間private Date workTime;// 參加工作時間private String credentialCode;// 證件號碼private String mobile;// 移動電話private String signPic;// 簽名圖片private String landlineNum;// 座機號private String age;// 年齡private String post;// 職位  private String positionId;// 崗位Idprivate String dept;// 部門private String email;// 郵箱private String  userId;// 用戶關聯人員private int  isUser;// 是否關聯人員private int credentialType;//證件類型private String address;//地址private String staffTypeId;//人員idprivate String property;//直屬或隸屬public String getProperty() {return property;}public void setProperty(String property) {this.property = property;}public String getPositionId() {return positionId;}public void setPositionId(String positionId) {this.positionId = positionId;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getStaffTypeId() {return staffTypeId;}public void setStaffTypeId(String staffTypeId) {this.staffTypeId = staffTypeId;}public int getCredentialType() {return credentialType;}public void setCredentialType(int credentialType) {this.credentialType = credentialType;}public int getIsUser() {return isUser;}public void setIsUser(int isUser) {this.isUser = isUser;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getLandlineNum() {return landlineNum;}public void setLandlineNum(String landlineNum) {this.landlineNum = landlineNum;}public String getDeptId() {return deptId;}public void setDeptId(String deptId) {this.deptId = deptId;}public String getCompanyId() {return companyId;}public void setCompanyId(String companyId) {this.companyId = companyId;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getPost() {return post;}public void setPost(String post) {this.post = post;}public String getPosition() {return positionId;}public void setPosition(String position) {this.positionId = position;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public void setBirthday(Date birthday) {this.birthday = birthday;}public EnumStatus getStatus() {return status;}public void setStatus(EnumStatus status) {this.status = status;}public String getNativePlace() {return nativePlace;}public void setNativePlace(String nativePlace) {this.nativePlace = nativePlace;}public String getEducation() {return education;}public void setEducation(String education) {this.education = education;}public EnumPoliticalStatus getPoliticalStatus() {return politicalStatus;}public void setPoliticalStatus(EnumPoliticalStatus politicalStatus) {this.politicalStatus = politicalStatus;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}public Date getGraduationTime() {return graduationTime;}public void setGraduationTime(Date graduationTime) {this.graduationTime = graduationTime;}public Date getWorkTime() {return workTime;}public void setWorkTime(Date workTime) {this.workTime = workTime;}public String getCredentialCode() {return credentialCode;}public void setCredentialCode(String credentialCode) {this.credentialCode = credentialCode;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getSignPic() {return signPic;}public void setSignPic(String signPic) {this.signPic = signPic;}@Overridepublic StaffUnionVO mapRow(ResultSet rs, int row) throws SQLException {StaffUnionVO vo = new StaffUnionVO();vo.setAddress(rs.getString("address"));vo.setAge(rs.getString("age"));vo.setBirthday(rs.getDate("birthday"));vo.setCode(rs.getString("code"));vo.setCompanyId(rs.getString("companyId"));vo.setCreationTimestamp(rs.getTimestamp("creationtime"));vo.setCredentialCode(rs.getString("credentialCode"));vo.setCredentialType(rs.getInt("credentialType"));vo.setDept(rs.getString("dept"));vo.setDeptId(rs.getString("deptId"));vo.setDr(rs.getInt("dr"));vo.setEducation(rs.getString("education"));vo.setEmail(rs.getString("email"));vo.setGraduationTime(rs.getDate("graduationTime"));vo.setId(rs.getString("id"));vo.setIsUser(rs.getInt("isUser"));vo.setLandlineNum(rs.getString("landlineNum"));vo.setMajor(rs.getString("major"));vo.setMobile(rs.getString("mobile"));vo.setModificationTimestamp(rs.getTimestamp("lastmodifiedtime"));vo.setName(rs.getString("name"));vo.setNativePlace(rs.getString("nativePlace"));vo.setPoliticalStatus(rs.getString("politicalStatus") == null || "".equals(rs.getString("politicalStatus").trim()) ? null : EnumPoliticalStatus.valueOf(rs.getString("politicalStatus")));vo.setPositionId(rs.getString("positionId"));vo.setPost(rs.getString("post"));vo.setProperty(rs.getString("property"));vo.setSchool(rs.getString("school"));vo.setSex(rs.getInt("sex"));vo.setSignPic(rs.getString("signPic"));vo.setStaffTypeId(rs.getString("staffTypeId"));vo.setStatus(rs.getString("status") == null || "".equals(rs.getString("status").trim()) ? null : EnumStatus.valueOf(rs.getString("status")));vo.setUserId(rs.getString("userId"));vo.setWorkTime(rs.getDate("workTime"));return vo;}
}
View Code

三、使用JdbcTemplate 進行聯表查詢操作

@Repository
public class StaffUnionDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<StaffUnionVO> getStaffUnion(String deptId, String param) {
     //sql中聯表查詢,自定義列名String sql
= "select bs.id id, bs.creationtime creationtime, bs.lastmodifiedtime lastmodifiedtime, bs.dr dr, bs.code code, bs.name name, bs.sex sex, bs.birthday birthday, bsp.dept_id as deptId, bsp.company_id companyId,"+ "bs.status status, bs.native_place nativePlace, bs.education education, bs.political_status politicalStatus, bs.major major, bs.school school, bs.graduation_time graduationTime, bs.work_time workTime,"+ "bs.credential_code credentialCode, bs.mobilephone_num mobile, bs.sign_pic signPic, bs.landline_num landlineNum, bs.age age, bs.post post, bsp.position positionId, bs.dept dept, bs.is_user isUser,"+ "bs.email email, bs.userid userId, bs.credential_type credentialType, bs.address address, bs.staff_type_id staffTypeId, bsp.property property from bd_staff bs, bd_staff_partjob bsp where bs.id = bsp.staff_id and bsp.dr = 0";//String sqlx = "select bs.id id from bd_staff bs, bd_staff_partjob bsp where bs.id = bsp.staff_id and bsp.dr = 0";if(deptId != null) {sql += "and bsp.dept_id = " + deptId;}if(param != null) {sql += " and (bs.code like %" + param + "% or bs.name like %" + param + "%)";}
     (1)
//該方法無法實現類中變量是對象時的轉換,例如存在枚舉對象。//List<StaffUnionVO> result = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(StaffUnionVO.class));(2) // 可以自定義轉化 // @SuppressWarnings("unchecked") // List<StaffUnionVO> result = jdbcTemplate.query(sqlx, new RowMapper() { // @Override // public Object mapRow(ResultSet rs, int n) throws SQLException { // StaffUnionVO vo = new StaffUnionVO(); // vo.setId(rs.getString("id")); // return vo; // } // });(3)//自定義映射方式的實現寫在了 StaffUnionVO類中List<StaffUnionVO> result = jdbcTemplate.query(sql, new StaffUnionVO());return result;} }

四、使用PageImpl進行分頁

  @Autowiredprivate StaffUnionDao newPageDao;@RequestMapping(path = "newpage", method = RequestMethod.GET)@ResponseBodypublic PageImpl<StaffUnionVO> getStaffInfoNew(@RequestParam(value = "deptId", required = false) String deptId,@RequestParam(value = "searchText", required = false) String param,@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {List<StaffUnionVO> content = newPageDao.getStaffUnion(deptId, param);PageRequest pageRequest = new PageRequest(pageNumber - 1, pageSize);PageImpl<StaffUnionVO> ans = new PageImpl<StaffUnionVO>(content, pageRequest, content == null ? 0 : content.size());return ans;}

?

五、補充一種場景

  進行分頁查詢的時候一般多是針對一個實體(對應一個表),通常使用的spring data jpa 的接口?JpaSpecificationExecutor<T>, 接口內容如下。

JpaSpecificationExecutor

public interface JpaSpecificationExecutor<T> {/*** Returns a single entity matching the given {@link Specification}.* * @param spec* @return*/T findOne(Specification<T> spec);/*** Returns all entities matching the given {@link Specification}.* * @param spec* @return*/List<T> findAll(Specification<T> spec);/*** Returns a {@link Page} of entities matching the given {@link Specification}.* * @param spec* @param pageable* @return*/Page<T> findAll(Specification<T> spec, Pageable pageable);/*** Returns all entities matching the given {@link Specification} and {@link Sort}.* * @param spec* @param sort* @return*/List<T> findAll(Specification<T> spec, Sort sort);/*** Returns the number of instances that the given {@link Specification} will return.* * @param spec the {@link Specification} to count instances for* @return the number of instances*/long count(Specification<T> spec);
}

  分頁查詢的結果是實體類的集合,通常在服務層完成。但是我們一般不讓業務層直接接觸我們的實體類,所以就是產生了VO類,也就是服務層不再返回實體類的集合,而是返回VO類的集合,業務層操作的其實是VO類。這樣就顯得層次清晰,方便控制。例如分頁查詢,具體實現如下。

  請參考: 后臺json格式設計?PagableResponse(分頁json格式)??,生成查詢Specification??QueryTool工具

?

Controller

  @Autowiredprivate RoleService roleService;@RequestMapping(path = "page")@ResponseBodypublic PagableResponse<RoleVO> getPageableRole(@RequestParam(value = "roleId", required = false) String roleId,@RequestParam(value = "searchText", required = false) String param,@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {PagableResponse<RoleVO> response = new PagableResponse<RoleVO>();response.setPageNumber(pageNumber);response.setPageSize(pageSize);PageRequest pageRequest = new PageRequest(pageNumber, pageSize);try {List<RoleVO> data = roleService.findPageableRoles(param, roleId, pageRequest);long count = roleService.count(param, roleId);response.setList(data);response.setCount(count);response.setCode(ReturnCode.SUCCESS);response.setMsg("獲取角色信息成功!");} catch(Exception e) {e.printStackTrace();response.setCode(ReturnCode.FAILURE);response.setMsg("獲取角色信息失敗!"); }return response;}

Service

  @Overridepublic List<RoleVO> findPageableRoles(String param, String relyCondition, PageRequest pageRequest) {List<RoleVO> list = new ArrayList<RoleVO>();Map<String, Object> map = QueryTool.parseCondition(relyCondition); //添加搜索添加if(StringUtils.isNotBlank(param)){map.put(Operator.LIKE+"_roleName", param);map.put(Operator.LIKE+"_roleCode", relyCondition);}if(StringUtils.isNotBlank(relyCondition)) {map.put(Operator.LIKE+"_id", relyCondition);}map.put(Operator.EQ+"_dr", "0");Specification<RoleEntity> spec = QueryTool.buildSpecification(map, RoleEntity.class);Page<RoleEntity> page = roleDao.findAll(spec, pageRequest);for (RoleEntity entity : page) {RoleVO roleVO = new RoleVO();BeanUtils.copyProperties(entity, roleVO);list.add(roleVO);}return list;}

六、自定義規范

  實體類

@Entity
@Table(name="sm_role")
public class RoleEntity extends AbsIdEntity implements Serializable{private static final long serialVersionUID = 3717832885014711347L;@Column(name="role_name")private String roleName;@Column(name="role_code")private String roleCode;@Column(name="role_type")private String roleType;@Column(name="isactive")private String isactive;@Column(name="tenant_id")private String tenantId;@Column(name="dtype")private String dtype;@Column(name="remark")private String remark;@Column(name="creator")private String creator;@Column(name="reviser")private String reviser;@Column(name="role_property")private String roleProperty;@Column(name="related_post_id")private String relatedPostId;@Column(name = "instruction")private String instruction;public String getInstruction() {return instruction;}public void setInstruction(String instruction) {this.instruction = instruction;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleCode() {return roleCode;}public void setRoleCode(String roleCode) {this.roleCode = roleCode;}public String getRoleType() {return roleType;}public void setRoleType(String roleType) {this.roleType = roleType;}public String getIsactive() {return isactive;}public void setIsactive(String isactive) {this.isactive = isactive;}public String getTenantId() {return tenantId;}public void setTenantId(String tenantId) {this.tenantId = tenantId;}public String getDtype() {return dtype;}public void setDtype(String dtype) {this.dtype = dtype;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}public String getReviser() {return reviser;}public void setReviser(String reviser) {this.reviser = reviser;}public String getRoleProperty() {return roleProperty;}public void setRoleProperty(String roleProperty) {this.roleProperty = roleProperty;}public String getRelatedPostId() {return relatedPostId;}public void setRelatedPostId(String relatedPostId) {this.relatedPostId = relatedPostId;}
}

  自定義Specification

public class RoleSpecification implements Specification<RoleEntity> {private Integer delete = new Integer(0);// 默認查詢未刪除的數據private String searchParam;private String roleId;public RoleSpecification(String searchParam, String roleId) {super();this.searchParam = searchParam;this.roleId = roleId;}@Overridepublic Predicate toPredicate(Root<RoleEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {List<Predicate> list = new ArrayList<Predicate>();list.add(cb.equal(root.get("dr").as(Integer.class), delete));if (StringUtils.isNotBlank(searchParam)) {list.add(cb.or(cb.like(root.get("roleName").as(String.class), cb.literal("%" + searchParam + "%")),cb.like(root.get("roleCode").as(String.class), cb.literal("%" + searchParam + "%")),cb.like(root.get("roleType").as(String.class), cb.literal("%" + searchParam + "%"))));}//角色idif(roleId != null && !("".equals(roleId.trim()))) {list.add(cb.equal(root.get("roleId").as(String.class), roleId));}Predicate[] predicates = new Predicate[list.size()];return cb.and(list.toArray(predicates));}public Integer getDelete() {return delete;}public void setDelete(Integer delete) {this.delete = delete;}public String getSearchParam() {return searchParam;}public void setSearchParam(String searchParam) {this.searchParam = searchParam;}public String getRoleId() {return roleId;}public void setRoleId(String roleId) {this.roleId = roleId;}
}

  注:規范中操作的 字段名稱 都是 實體類的字段名稱,不要寫成數據庫字段名稱。

  自定義規范可以自定義條件查詢,比如 or, and等等,使用QueryTool工具建立的規范默認條件都是and,所以很多情況下不能滿足我們的需求。總的來說,現在剛剛接觸,Spring Data JPA 的?Specification 還要進一步學習。

七、其他通過Specification實現分頁查詢,請參考

? ??springmvc+jpa實現分頁的兩種方式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

消息隊列選型手冊

前言 消息隊列中間件重要嗎&#xff1f;面試必問問題之一&#xff0c;你說重不重要。我有時會問同事&#xff0c;為啥你用 RabbitMQ&#xff0c;不用 Kafka&#xff0c;或者 RocketMQ 呢&#xff1f; 他給我的回答&#xff1a;“因為公司用的就是這個&#xff0c;大家都這么用…

Jenkins 持續集成國產嵌入式操作系統 RT-Thread 的CI

我們直接在Jenkins的鏡像基礎上進行集成RT-Thread 的編譯環境&#xff0c; 這樣直接使用Shell 命令 最直接了當&#xff0c; 通過 第三方docker等插件&#xff0c; 嘗試了計重方案&#xff0c; 沒有找到理想中的感覺&#xff0c; 如果其他人有想法可以告知一二。 我們有現成的鏡…

codevs原創抄襲題 5960 信使

題目描述 Description?戰爭時期&#xff0c;前線有n個哨所&#xff0c;每個哨所可能會與其他若干個哨所之間有通信聯系。信使負責在哨所之間傳遞信息&#xff0c;當然&#xff0c;這是要花費一定時間的&#xff08;以天為單位&#xff09;。指揮部設在第一個哨所。當指揮部下達…

VC解析XML--使用CMarkup類解析XML

經過今天嘗試MFC解析XML串&#xff0c;也算有了不少收獲&#xff0c;總結一下。 我是使用的CMarkup類對XML進行操作。 CMarkup好象都是先從一個xml文件里面把內容讀出來&#xff0c;再進行解析&#xff0c;搞得我恨不得要把我的CString寫到xml文件里面…

MongoDB精華總結

概述 MongoDB是屬于文檔型的NoSQL數據庫&#xff0c;也就是文檔數據庫。文檔數據庫區別于傳統的其它數據庫&#xff0c;它是用來管理文檔。在傳統的數據庫中&#xff0c;信息被分割成離散的數據段&#xff0c;而在文檔數據庫中&#xff0c;文檔是處理信息的基本單位&#xff0c…

認清性能問題

本文翻譯自 Thinking Clearly About Performance 這是我三年前讀到的一篇關于性能問題的好文&#xff0c;讀完后還覺不過癮&#xff0c;怕理解的不夠遂又翻譯了一遍&#xff0c;這也是當年我的第一次翻譯。 這幾年來每次碰到性能問題&#xff0c;我都會想起這篇文章&#xff0c…

字節也開始縮招了...

閱讀本文大概需要6分鐘。最近和一個字節技術總監聊天&#xff0c;得知他們公司居然也開始縮招了。這真讓人感到意外&#xff0c;畢竟頭條這些年是以極速擴張而聞名。搜了搜新聞還真是&#xff0c;這也意味著互聯網行業最后一個堅挺的大戶也在開源節流了。最近互聯網行業的情況真…

實現打字效果

摘自一個表白網站的效果。 方法&#xff1a; substr() 可在字符串中抽取從 第一個參數表示從指定的下標&#xff0c;第二個參數表示抽取指定數目的字符。 indexOf() 方法可返回某個指定的字符串值在字符串中首次出現的位置&#xff0c;兩個參數&#xff0c;第一位指定的字符串&…

php優化-》常用到的部分優化

1.循環內部盡可能不要聲明變量&#xff1b; 2.在可以用PHP內部字符串操作函數的情況下&#xff0c;盡量不要用正則表達式&#xff1b; 3.foreach效率更高&#xff0c;盡量用foreach代替while和for循環&#xff1b; 4.用單引號替代雙引號引用字符串&#xff1b; 5.盡量的少進行文…

簡述:分布式CAP理論和BASE理論

目錄 一、什么是CAP&#xff1f; Consistency (一致性)&#xff1a; Availability (可用性): Partition Tolerance (分區容錯性): 二、取舍策略 三、Base理論 1、基本可用 2、軟狀態 3、最終一致性 四、常見產品 Ereka Zookeeper 五、總結 一、什么是CAP&#xf…

WinForm(四)一種實現登錄的方式

首先聲明&#xff0c;這只是一種登錄方式&#xff0c;并不是最好的方式&#xff0c;用這個例子為了說明登錄窗體和Application的關系。在登錄前&#xff0c;定義了用戶實體&#xff0c;然后是一個通用的類&#xff0c;存放進程中當前登錄的用戶&#xff0c;所以CurrentUser是靜…

Java多線程4:synchronized鎖機制

臟讀 一個常見的概念。在多線程中&#xff0c;難免會出現在多個線程中對同一個對象的實例變量進行并發訪問的情況&#xff0c;如果不做正確的同步處理&#xff0c;那么產生的后果就是"臟讀"&#xff0c;也就是取到的數據其實是被更改過的。 按照正常來看應該打印&quo…

mysql 日期時間類型 自動轉型 及 運算

日期時間類型自動轉型 -- now()、字符串、數字轉datetime類型 create table t(dt datetime);insert into t values(now());insert into t values(2007-9-3 12:10:10);insert into t values(2007/9/3 121010);insert into t values(2007#9#3 121010);insert into t values(20079…

.NET Community Toolkit 8.0.0 版本發布

.NET 社區工具包&#xff08;.NET Community Toolkit &#xff09;現已發布 8.0.0 版&#xff01;.NET 社區工具包是一組適用于所有 .NET 開發人員&#xff0c;且與任何特定 UI 平臺無關的幫助程序和 API。該工具包由 Microsoft 維護和發布&#xff0c;是 .NET 基金會的一部分&…

SpringData JPA、Hibernate、Mybatis三者的區別

目錄 1.ORM 考慮 SpringData JPA Hibernate MyBatis 2.業務查詢的區別 Spring Data JPA Hibernate Mybatis 3.可拓展性 Spring Data JPA Hibernate Mybatis 4.對緩存 Spring Data JPA Hibernate Mybatis 5.難度性 Spring Data JPA Hibernate Mybatis 總述…

1、內存

程序為什么需要內存 程序運行的目的&#xff1a;程序運行是為了得到一定的結果&#xff0c;程序運行其實是在做一系列的數據計算&#xff0c;所以&#xff1a;程序代碼數據&#xff1b;程序運行的目的不外乎2個&#xff1a;過程、結果&#xff1b; 用函數來類比&#xff1a;…

Map 遍歷取值及jstl的取值

Map 遍歷取值及jstl的取值 學習了&#xff1a;http://blog.csdn.net/yanjiaye520/article/details/17354239 1、Java map的便利取值 Java代碼 收藏代碼 Map<String,String> map new HashMap<String,String>(); map.put("key1", "value1");…

基于CAP組件實現補償事務與冪等性保障

【.NET Core】| 總結/Edison Zhou1補償事務和冪等性在微服務架構下&#xff0c;我們會采用異步通信來對各個微服務進行解耦&#xff0c;從而我們會用到消息中間件來傳遞各個消息。 補償事務某些情況下&#xff0c;消費者需要返回值以告訴發布者執行結果&#xff0c;以便于發布者…

Docker與k8s

前言 隨著k8s 作為容器編排解決方案變得越來越流行&#xff0c;有些人開始拿 Docker 和 k8s進行對比&#xff0c;不禁問道&#xff1a;Docker 不香嗎&#xff1f; k8s 是kubernets的縮寫&#xff0c;’8‘代表中間的八個字符。 其實 Docker 和 k8s 并非直接的競爭對手&#xff…

Linux下啟動tomcat報java.lang.OutOfMemoryError: PermGen space

2019獨角獸企業重金招聘Python工程師標準>>> 一、錯誤信息 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav…