超实用!!实战总结!!Java开发工程师常用的东西(持续更新.....) v1.0.0

0 前言

废话两句:这篇博客主要是总结记录工作中常用的东西,真正做到开箱即用、接地气。第一版记个流水帐吧,后面慢慢做性能比较。

1 工具篇

1.1 IDEA插件推荐

1.1.1 代码质量类

  • Alibaba Coding Guidelines
  • QAPlug
  • QAPlug-FindBugs
  • QAPlug-PMD
  • QAPlug-CheckStyle

1.1.2 代码生成

  • Gson Format
  • POJO To JSON
  • Lombok
  • GenerateAllSetter
  • Vue Component Creater

1.1.3 编程辅助

  • Spring Assistant
  • Maven helper
  • Restful Tookit
  • Free Mybatis Plugin
  • Translation

1.2 谷歌浏览器插件

1.2.1 谷歌上网助手

虽然不能访问Youtobe这些东西,但是谷歌搜索和wiki还是没有什么问题的。对我而言,谷歌搜搜bug解决方案简直不要太美好。

1.2.2 JSON viewer

格式化JSON数据:没装这个插件的话,JSON默认显示一大串字符串

1.2.3 划词翻译

外文官方文档必备佳品:遇到那么几个不认识的单词,鼠标选中就可以翻译,再也不用切网页。

1.3 视频充电网站

1.3.1 慕课网

原因很简单:慕课网的视频体验很好,既有PPT,又有清晰的代码展示,也有对应的资源下载。最重要的是,老师在认认真真讲课,而不是像某些视频课中一样东拉西扯,浪费时间。

1.3.2 Bilibili

B站上面的项目视频很多,质量还可以。缺点就是很多视频都是盗版,经常碰到缺一两集或者没有配套资源。有时候老师会瞎鸡巴扯,比较浪费时间,建议用来扩展知识面。

1.4 编程书籍

由于绝大部分新手或者工作一两年左右的开发都没有足够的耐心和能力去看完类似《Java编程思想》之类的经典书籍(如果工作游刃有余,看看这些经典肯定受益匪浅),下面我只推荐一些比较简单却很有必要认真看看的书:

  • 《深入理解Java虚拟机》
  • 《Effective Java》
  • 《Mysql必知必会》
  • 《算法图解》

2 后端编程

2.1 框架简介

2.1.1 Springboot框架

不推荐项目使用SSM框架,因为配置项目真的太浪费时间了,会让人有种错觉:学了半天,就学了配些xml文件。使用Springboot开发起来很爽,主要体现在:

  • 集成其他框架:不用反复考虑依赖冲突,大部分版本在parent中都有定义
  • 减少了大量配置:springboot提供了很多默认配置,当不满意的时候也可以自定义
  • Springboot是Springcloud的基础
  • Springboot集成了监控组件:actuator

2.1.2 Springcloud框架

Springcloud是一套微服务框架,基于Springboot开发.对于初级程序员而言,公司使用Springboot还是Springcloud其实区别并不大.而且微服务拆分合理的话,甚至会比springboot开发起来更爽快:因为面对需求变更,可能只需要去重新组合一下现有的微服务,而不用重新开发.
常用的组件如下(这里仅作简要介绍,后面在Springcloud项目中详细介绍):

  • Eureka:注册中心,分为服务端和客户端.服务端会对客户端做心跳检测,检查服务是否可用.试想没有注册中心,其他微服务将高度耦合.客户端启动类上加注解@EnableEurekaServer,而客户端加注解@EnableDisconveryClient
  • Zuul:服务网关,实际就是由路由和一串过滤器组成,理论上所有的微服务请求都应该经过zuul网关.作用也很强大,可以实现路由转发(配置文件),跨域(配置类),限流以及鉴权(过滤器)等功能.
  • Config:配置中心,实现配置统一管理.首先,需要动态更新配置的类需要加@RefreshScope注解;其次,Eureka注册的配置不可以放到远程仓库;最后,Config利用env可以实现开发配置与生产配置动态切换
  • Bus:消息总线,底层集成了Stream.目前,我只是把它用在自动更新配置.
  • Sleuth:链路跟踪,更多地会与Zipkin框架进行集成.使用起来十分简单,引入spring-cloud-starter-zipkin依赖(里面已经包含了sleuth组件和springboot的zipkin),然后配置一下spring.zipkin.base-url以及抽样比率即可
  • Feign:服务通信,微服务之间的互相调用.如果要使用的话,微服务最好构建成多模块的形式.多模块大致分为Common,Service和Client,其中Client就负责对外通信.对外通信的类上,增加@FeignClient注解即可.
  • Stream:消息队列,springcloud目前集成了kafka和Rabbit.针对消息队列而言,kafka不保证消息的可靠传递,一般是用来收集日志(比较普及的是ELK系统);其他需要可靠性的场景,需要使用Rabbitmq来实现.
  • Hystrix:容错机制,包含超时,融断和降级.具体使用:引入hystrix依赖,增加@SpringcloudApplication注解,controller类上加@HystrixCommand注解
  • Ribbon:负载均衡,客户端负载均衡.

2.2 Springboot项目

整体用法和SSM框架一致,常规使用MVC模式进行开发。
springboot

JSON
JSON
直接调用
直接调用
JPA
JPA
RestTemplate
RestTemplate
前端/网关
Controller
Service
Dao
Other

2.2.1 Dao层开发

2.2.1.1 常用框架一:JPA框架

国外常用的框架:只是一个持久化规范,底层的实现基本是Hibernate。优点有如下几条:

  • 数据库无关性
  • 自动建表
  • 单表操作功能十分强大,改个方法名就支持任意字段查询,也支持排序、分页
  • 比较完整地践行了OOP思想,不用在xml配置和实体类切换

缺点也很明显:

  • 多表操作十分复杂:目前支持使用原生sql,但是体验仍然很差
  • 动态sql实现也比较复杂:一连串的if判断嵌入到代码里面,就问你帕不怕

基于以上缺点,不少公司是JdbcTemplate和JPA混搭使用。废话不再多说,下面开始介绍JPA的基本用法,以及常用实现。

JPA使用步骤

  1. 建立实体类:启动项目就可以在配置的数据库中建立对应的数据表,是不是很方便?
    常用的注解总结如下表所示
注解 作用
@Entity 表明这是一个实体类
@Table 当表名与类名不一致时,必须配置
@Id 主键标识
@Column 列名映射
@GenaratedValue 主键自增
@UpdateTimestamp 更新操作:自动更新时间
@OneToOne 一对一映射
@OneToMany 一对多映射
@ManyToOne 多对一映射
@ManyToMany 多对多映射
@JoinColumn 主控方标明关联表的字段
@JoinTable 标明此表为多对多关联表
@Transient 不会映射到数据库
@Temporal 调整时间精度

JPA实体类代码示例如下,特别注意要实现序列化接口

@Data
@Entity(name= SystemTable.CMVS_TURNING_CHNNAL_DETAIL)
public class TurningChannelDetail implements Serializable {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @Column(name = "\"order\"")
    private Integer order;
    
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name = "id",insertable = false,updatable = false)
    private TurningInfo TurningInfo;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "domain_channelId", insertable = false, updatable = false)
    @Where(clause = "IS_DELETE = 0")
    private DeviceChannel DeviceChannel;
    
    @Column(name = "update_time")
    @org.hibernate.annotations.UpdateTimestamp  
    private Timestamp updateTime;
}
  • 自动建表
    1. 引入jpa和mysql的依赖
    2. 按以上格式建立实体类
    3. 配置JPA自动建表
    4. 启动工程即可自动创建数据表

注意,失败原因可能如下:

  1. 包导的不对: import javax.persistence.*;

  2. 配置文件不对: spring.jpa.hibernate.ddl-auto=update或者yml缩进错误(jpa属于spring下一级,而不是datasource下一级)

  3. 注解写的不对:不要忘记@Entity

  4. 启动类位置不对:实体类和启动类应位于同一根目录

    spring:
      	datasource:
    		url: jdbc:mysql://localhost:3306/jsonDemo
    	 	username: root
    	    password: root
    		driver-class-name: com.mysql.cj.jdbc.Driver
     jpa:
      	hibernate:
          #支持自动建表
        	ddl-auto: update
     	show-sql: true
      	open-in-view: true
     	database: mysql
    
  5. 编写DAO层代码:继承JpaRepository

    • Repository接口概述:
      • Repository:基础接口
      • CrudRepository:增删改查接口
      • PageAndSortingRepository:分页和排序接口
      • JpaRepository:完整接口

2.2.2 Service层开发

2.2.2.1 JSON格式转化
  1. JSON---->Java对象
    • JSON ---->JSONArray
      字符:[{"id":"1","name":"yq","sex":"man"},{"id":"2","name":"yy","sex":"woman"}]
      实体:List< Object >或Object[]
      代码:JSONArray objectArray=JSONArray.parseArray(jsonStr)/JSONArray objectArray=jsonObject.getJSONArray("属性")
    • JSON---->JSONObject
      字符:{"id":"1","name":"yq","sex":"man"}
      实体:Object
      代码:JSONObject obj=JSONObject.parseObject(jsonStr)/JSONObject obj=jsonArray.getJSONObject(i)

综合测试:前端发送一个含有ID数组的对象,后台需要ID的list,其代码实现如下:

//前端需要发送json格式,使用jsonStringfy方法;后端需要使用@RequestBody注解接收json字符串
//使用postman发送如下json字符串:
{
	"alarmInfoIdList": [{
		"id": 1
	}, {
		"id": 2
	}]
}

//后端代码如下:
@Controller
@RequestMapping("/json")
@Slf4j
public class JsonController {

    @ResponseBody
    @RequestMapping(value = "/jsontoobject",method = {RequestMethod.POST})
    public String jsonToObject(@RequestBody String jsonStr){
       //字符串外面是{},故为json对象,使用JSONObject接收
        JSONObject jsonObject=JSONObject.parseObject(jsonStr);
        //而alarmInfoIdList属性外面是[],故为json数组,使用JSONArray接收
        JSONArray jsonArray=jsonObject.getJSONArray("alarmInfoIdList");
        List<String> list=new ArrayList<>();
        for(int i=0;i<jsonArray.size();i++){
            JSONObject object=  jsonArray.getJSONObject(i);
            list.add(object.getString("id"));
        }
        list.stream().forEach(System.out::println);
        return "true";
    }
}

//结果:
1
2


2.2.2.2 Service层代码示例

@Service
public class DeviceModelService {
    @Autowired
    private DeviceModelRepository deviceModelRepository;

    @Transactional
    public void saveAndFlush(String msg) throws Exception{
        deviceModelRepository.deleteAll();
        //注意使用JSONArray,则其JSON必须为数组形式,诸如:
        //JSONArray:      [{"id":"1","name":"yq","devType":"car"},{"id":"2","name":"yy","devType":"bike"}]
        //JSONObject:   {"id":"1","name":"yq","devType":"car"}
        JSONArray arr = JSONArray.fromObject(msg);
        for(int i=0; i<arr.size(); i++) {
            JSONObject obj = arr.getJSONObject(i);
            DeviceModel model = new DDeviceModel();
            model.setId(obj.getInt("ID"));
            model.setName(obj.getString("Name"));
            model.setTypeId(obj.getInt("DevTypeID"));
            model.setTypeName(obj.getString("DevTypeName"));
            model.setVendorId(obj.getInt("DevVendorID"));
            model.setVendorName(obj.getString("DevVendorName"));
            model.setStreamAgent(obj.getInt("DevStreamAgent"));
            deviceModelRepository.saveAndFlush(model);
        }
    }
    }

2.2.3 Controller层开发

3 前端编程

3.1 Vue.js框架

在这里,我将不会赘述如何去搭建框架。原因非常简单:项目框架搭建只需要做一次,而且网上非常多的教程。最重要的是:企业开发时,直接给你设定好框架,你只是负责其中一个模块。

3.1.1 基本命令

  • 安装vue/cli: npm install -g @vue/cli
  • 创建vue项目: vue create hello-world
  • 依赖安装: npm install
  • 启动项目: npm run dev

3.1.2 基本概念和API

  • 项目结构
根结点
build
config
src
components
js
css
images
route
store
static

开发Vue项目之前,需要对下表概念有所理解

  • vue项目概念
概念 理解
template 模板:即视图部分
data 实例中的数据部分,需要数据时应在此处注册
vue实例 实例就是数据和模板的整合者
componet 实际就是vue实例
  • vue实例概念
概念 理解
components 子组件需要在父组件注册才能使用
computed 计算属性:计算比较复杂的逻辑,自带缓存
watch 侦听器
methods 实例方法,可以在此操作data以及computed的数据
created 实例创建时:初始化方法
mounted 钩子函数:数据挂载时初始化参数
  • vue指令以及绑定
概念 理解
v-text 文本绑定,会自动转义
v-html html绑定,不会自动转义
v-model:select 双向绑定/表单输入绑定:主要用在input,textarea,select元素上
v-bind:id 简写:id=’’ ‘’,属性/参数绑定,单向:data–>template
v-on:click 简写@click,事件绑定:绑定到特定方法,触发对应方法
v-if 根据if条件判断是否实际渲染,当变化不频繁时使用
v-show 更改display属性为none
v-for 遍历list中的元素,可以实现轮播图和动态表单等
事件修饰符 .stop ,.prevent,.capture,.self,.once,.passive等等
  • vue组件通信
概念 理解
props 子组件可以直接获取父组件中data对应的值
$emit 子组件调用父组件的事件@click,将子组件的数据动态传递到父组件的方法中
$refs 通过$refs可以直接调用子组件的方法和属性,但必须在mounted之后才能获取值

3.1.3 前后端交互

3.1.4 组件应用

对于Vue组件而言,选择有很多,我这里优先选择iView或者Element.具体使用完全参考官方的API,重点关注组件的属性以及提供的事件(通常会有回调的数据,特别关注此类数据的流向: 组件 -->data/props).

  • 常规处理
    • 组件属性:data,computed,props
    • 组件事件:methods(直接调用;通过 e m i t 传 递 到 父 类 方 法 ) , w a t c h ( 直 接 调 用 ; 通 过 emit传递到父类方法),watch(直接调用;通过 emit),watch(;emit传递到父类方法)

3.1.5 数据流向总结

前面其实已经有介绍各种数据的流向,这里做一个总结,让大家更直观的感受到数据的走向.

数据流向

callBack
callBack
props
$refs
ajax
ajax
子组件事件
子组件函数
子组件data
$emit
父组件data
父组件函数
后端

4 数据库扩展

4.1 数据库多表关联

4.1.1 多表关联分类

  • 内连接:只显示多表共同存在的行;隐式内连接(where…=…)和显式内连接(join…on…)
  • 外连接
    • 左外连接:左表所有的行都显示;右表有则显示,没有则为null
    • 右外连接:右表所有的行都显示;左表有则显示,没有则为null
    • 全连接:左表和右表所有的行
  • 交叉连接:笛卡尔连接
  • 自连接:只有一张表,通过别名实现连接检索

你可能感兴趣的:(Java,Springboot)