Java高级必备技能介绍
Java高级技能通常指的是在掌握Java基础知识之上,对Java语言的高级特性、设计模式、框架、性能优化、并发编程、系统架构等方面有深入理解和实践经验的能力。
- Java虚拟机(JVM):
- 深入理解JVM内存模型、垃圾回收机制、类加载机制等。
- 能够进行JVM调优,分析和解决内存泄漏和性能问题。
- 并发编程:
- 熟练使用
java.util.concurrent
包中的类和接口进行并发编程。 - 理解并应用线程池、同步器、原子变量等高级并发工具。
- 掌握锁、线程安全、并发集合等概念。
- 熟练使用
- 设计模式:
- 理解并能应用常见的23种设计模式,如单例、工厂、策略、观察者、装饰者等。
- 框架与技术栈:
- 熟悉Spring框架,包括依赖注入、面向切面编程(AOP)、事务管理等。
- 掌握Spring Boot快速开发的特性。
- 了解其他流行的Java框架,如Hibernate、JPA、Apache Maven、Gradle等。
- 微服务架构:
- 理解微服务的概念、优势和挑战。
- 掌握Docker、Kubernetes等容器化技术和服务编排工具。
- 性能优化:
- 能够分析和优化Java应用程序的性能瓶颈。
- 熟悉使用JProfiler、VisualVM、JMX等工具进行性能监控和分析。
- 安全:
- 理解Java安全的各个方面,包括加密、认证、授权等。
- 熟悉安全框架如Spring Security。
java sql 文章列表查询
需求背景: 1、在列表页展示20条文章列表的形式 2、每篇文章显示当前用户是否已经点赞了
希望的数据格式
代码语言:javascript复制list:[{
title:'文章标题',
//0|1用来区分是否当前用户点赞了该文章
isStar: 0|1
},
...]
我的表是3张表,一张文章表,一张用户表,以及一张点赞表(表中只有两个字段,文章id,和用户id 用来把用户和文章做绑定关系)
这是我关联查询文章和作者的sql,不知道怎么修改了 table1 为文章表 table2 为用户表
**
代码语言:javascript复制SELECT table1.id, table1.context,table1.star,table1.share,table2.name,table2.img from table1 inner join THEY_SAY_USER on table1.auther_id = table2.id ORDER BY star DESC limit 20
每次查询详情返回三条数据信息,当前对象,上一条与下一条的Id和标题
1、PreAndNextModel
代码语言:javascript复制 1 public class PreAndNextModel {
2 /**
3 * 上一篇或者下一篇的id
4 */
5 private Integer id;
6 /**
7 * 上一篇或者下一篇的标题
8 */
9 private String title;
10
11 public Integer getId() {
12 return id;
13 }
14
15 public void setId(Integer id) {
16 this.id = id;
17 }
18
19 public String getTitle() {
20 return title;
21 }
22
23 public void setTitle(String title) {
24 this.title = title;
25 }
26 }
2、获取上一篇
代码语言:javascript复制 1 @Override
2 public PreAndNextModel getPreModel(Integer productId, Integer proCategoryId) {
3
4 IProductDao iProductDao = new ProductDaoImpl();
5 //new model
6 PreAndNextModel pre = new PreAndNextModel();
7
8 Integer preId = null;
9 List<ProductDto> list;
10 //查询该分类下的集合
11 list = iProductDao.findAllByCategoryId(proCategoryId);
12 //获取集合长度
13 int count = list.size();
14 //将该分类下的Id放入数组当中
15 int[] intId = new int[count];
16 for (int i = 0; i < count; i ) {
17 intId[i] = list.get(i).getId();
18 }
19 //获取当前Id的上一个Id下标
20 for (int j = 0; j < count; j ) {
21 if (intId[j] == productId) {
22 if (j != 0) {
23 preId = intId[j - 1];
24 }
25 }
26 }
27 isPreAndNext(iProductDao, pre, preId);
28 return pre;
29 }
3、获取下一篇
代码语言:javascript复制 1 @Override
2 public PreAndNextModel getNextModel(Integer productId, Integer proCategoryId) {
3 IProductDao iProductDao = new ProductDaoImpl();
4 PreAndNextModel next = new PreAndNextModel();
5
6 Integer nextId = null;
7 List<ProductDto> list;
8 //查询该分类下的集合
9 list = iProductDao.findAllByCategoryId(proCategoryId);
10 //获取集合长度
11 int count = list.size();
12 //将该分类下的Id放入数组当中
13 int[] intId = new int[count];
14 for (int i = 0; i < count; i ) {
15 intId[i] = list.get(i).getId();
16 }
17 //获取当前Id的下一个Id下标
18 for (int j = 0; j < count; j ) {
19 if (intId[j] == productId) {
20 //判断是不是最后一个下标
21 if (j != (count - 1)) {
22 nextId = intId[j 1];
23 }
24 }
25 }
26 isPreAndNext(iProductDao, next, nextId);
27 return next;
28 }
4、判断上一篇或者下一篇是否存在
代码语言:javascript复制 1 private void isPreAndNext(IProductDao iProductDao,
2 PreAndNextModel pre, Integer preId) {
3 ProductDto productDto;
4 if (preId == null) {
5 pre.setId(null);
6 pre.setTitle("无");
7 } else {
8 //将上一页Id和标题赋值返回
9 productDto = iProductDao.findById(preId);
10 pre.setId(productDto.getId());
11 pre.setTitle(productDto.getName());
12 }
13 }
5、调用返回
代码语言:javascript复制1 //上一个
2 PreAndNextModel pre = iProductService.getPreModel(productId,
3 productModel.getProCategoryId());
4 //下一个
5 PreAndNextModel next = iProductService.getNextModel(productId,
6 productModel.getProCategoryId());