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.mzph.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…