服务端开发中,有很多知识是相通的,例如mysql,redis,http协议等。

基于这些基础,在编程语言上的转变并不困难。

本文主要从下面几点出发,讲述如何快速从php开发转为java开发:

  • 使用框架构建web项目 - 10min
  • 常用数据结构对应和概念转变 - 5min
  • 操作Mysql数据库和发送http请求 - 15min

使用框架构建项目

先看下PHP和JAVA对应的项目工具和框架:

PHP JAVA
项目管理工具 composer maven
框架 Laravel或Thinkphp SpringBoot

java中,maven是项目管理工具,实现安装依赖,打包等功能,是一个项目的起点,通过pom.xml配置文件管理依赖。SpringBoot本质上就是一个maven的依赖包。

相比php的框架,SpringBoot原生提供的功能并不多,但是可以通过maven很方便的加载其他功能的依赖

常用的java开发IDE是idea,社区版是免费的,可以直接在官网下载,基本能满足开发需求。

创建项目

需要的准备工作,下载idea。在系统中安装maven和jdk,可以直接通过idea安装,也可以去官网下载安装。

可以使用官方网站:https://start.spring.io/ ,来创建SpringBoot项目,如下图,这里我们选择Spring Web依赖。

下载解压后,可以看到里面已经有了pom.xml文件,并加入了SpringBoot的依赖,使用idea加载文件夹:

项目引入后,可以看到目录结构已经建好,接下来实现一个web api处理http请求,如下:

package com.abc.webtest.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "hello";
}
}
  • 新建一个controller文件夹,用来存放所有处理http请求的类
  • 在php的框架里通常会把url和处理方法的映射放在一个route.php文件里
  • 在SpringBoot中主要使用注解的方式指定url的处理方法

之后可以直接启动应用,默认的端口是:8080。启动后就可在浏览器中访问:http://localhost:8080/test,返回hello

  • 如果要修改启动的默认端口,可以在application.yml中添加如下配置。
server:
port: 9999

application.yml是SpringBoot中用来管理配置的文件,大部分自动配置的组件的配置可以写到这里。例如上面的服务启动端口。

常用数据结构对应和概念转变

如果要问php中最常用的数据结构是什么?相信大多数答案都是array

相对的在java开发中常用的数据结构是ArrayListHashMap,它们可以看成是array的拆分,一种简单的对应关系为:

PHP JAVA
array('a','b','c') ArrayList
array(a'=>1,'b'=>2,'c'=>3) HashMap

了解对应关系有助于在开发中更好的使用对应的结构。

在开发中还有一些概念上的转变:

  • 变量定义

    • php是弱类型语言,定义变量时可以不指定类型,使用比较灵活,但也容易出问题。
    • java是强类型语言,每个变量都要指定类型,不能给变量赋值为别的类型。
  • 每次请求的变量遗留
    • 使用php-fpm方式提供服务时,每次请求结束时都会把创建的变量回收,包括静态变量。所以请求间不会有影响
    • SpringBoot提供服务时,是一直运行的,意味着上次请求创建或修改的变量可能会影响下一次请求,造成问题,这个需要特别注意。尤其是对静态变量的使用。

操作Mysql数据库

日常开发中,最常用的功能就是操作数据库和通过http请求调用接口了(微服务调用主要依赖服务框架,这里不涉及)。

代码中操作数据库,通常包括两大部分:

  • ORM持久层映射:负责代码和数据表的操作转换,把表映射为一个对象,通过对象来操作表

    • php中主要是各框架提供的,例如Laravel中的Eloquent Model
    • java中较受欢迎的是mybatis-plus,也是把每个表映射为一个实体类
  • 数据库连接层
    • php中是PDO + pdo_mysql扩展
    • java中可以使用druid + mysql-connector

下面就介绍下在java中使用mybatis-plus + druid + mysql-connector操作数据库中的一张表,主要分5步。

1.通过maven在pom.xml中加载这三个依赖

在使用SpringBoot框架时,会经常用到自动配置,在项目启动时自动创建需要的对象。

这里直接使用对应的starter包,可以在项目启动时,自动创建数据库连接池等对象。

	  <!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency> <!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency> <!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
2.创建表的实体和Mapper

现在库中有一张表,表名是:main_user

CREATE TABLE `main_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(100) NOT NULL,
`user_name` varchar(100) NOT NULL,
`user_phone` varchar(40) NOT NULL,
`score` int(11) DEFAULT '0',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

要操作这张表,首先需要创建一个类作为该表的映射,类名就是MainUser,类的成员就是表中的字段,每个字段的类型需要与数据库中的相对应,常用的类型可以很容看出来,其他字段可以百度一下JdbcType类型和Java类型的对应关系。

public class MainUser extends Model<MainUser> {
private static final long serialVersionUID = 1L;
@TableId(value = "user_id", type = IdType.AUTO)
private Integer userId;
private String password;
private String userName;
private String userPhone;
private Integer score;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

然后创建一个Mapper用于操作这个类,就叫做MainUserMapper

因为这里使用了mybatis-plus,Mapper可以直接使用很多底层方法,可以只定义一个空接口。

import com.abc.webtest.db.entity.MainUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface MainUserMapper extends BaseMapper<MainUser> {
}
3.在SpringBoot中设置Mapper的包名

SpringBoot的IOC可以直接生成可用的接口实现对象,只要在启动时指定要扫描的Mapper所在的包名。

@SpringBootApplication
@MapperScan("com.abc.webtest.db.mapper") //这个就是mapper包,一个库中表的mapper都放在这里
public class WebtestApplication {
public static void main(String[] args) {
SpringApplication.run(WebtestApplication.class, args);
}
}
4.在application.yml中设置mysql的配置

将连接mysql需要的地址,用户名,密码写入application.yml中:

spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/test_db?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
5.在controller中操作表

这里简单展示下对表的操作。

在SpringBoot中,底层的IOC会负责类之间的引用关系,即在A中引用B,不需要手动创建对象,而是使用Resource等注解。

下面两个请求实现了对表的插入和按id查询。

@RestController
public class TestController {
//这里会将要使用的对象加载到该类中
@Resource
MainUserMapper mainUserMapper; @GetMapping("/test")
public String test() {
return "hello";
} //定义post请求,这里框架底层会直接将body里面的json数据,按key名赋值给参数中的对象
@PostMapping("user/register")
public Boolean userRegister(@RequestBody MainUser mainUser) {
mainUserMapper.insert(mainUser);
return true;
} @GetMapping("user/info")
public MainUser userInfo(Integer userId) {
MainUser mainUser = new MainUser();
return mainUserMapper.selectById(userId);
}
}

发送HTTP请求

在开发中,系统的外部资源除了数据库,最多的就是其他的服务了,这里介绍下java中访问http接口的方法。

在php中,访问http的底层基本都是用curl扩展的相关功能。

在java中,一个比较基础的包是httpclient,首先在pom.xml中引入这个包。

    <!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
写一个HttpUtil类作Http的统一请求

这里使用@Componet注解,它的作用是告诉Spring框架将该类作为一个bean加载到IOC中,供其他类使用。

@Component
public class HttpUtil {
CloseableHttpClient client = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectTimeout(500) //连接超时时间,单位毫秒,按实际情况调整
.build())
.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(2 * 1000) //请求响应超时时间,单位毫秒,这里设为2秒,按实际情况调整
.build())
.build(); public String get(String url) throws IOException {
HttpGet httpGet = new HttpGet(url);
try (CloseableHttpResponse httpResponse = client.execute(httpGet)) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toString(httpEntity, "UTF-8");
}
} public String post(String url, Map<String, String> params) throws IOException {
HttpPost httpPost = new HttpPost(url);
CloseableHttpResponse httpResponse = null;
try {
//这里使用了Jackson作为json转换工具,在spring-web依赖中已经引入,可以直接使用
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(params);
StringEntity stringEntity = new StringEntity(json, "UTF-8");
httpPost.setEntity(stringEntity);
httpPost.addHeader(HTTP.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
httpResponse = client.execute(httpPost);
return EntityUtils.toString(httpResponse.getEntity());
} finally {
if (httpResponse != null) {
httpResponse.close();
}
}
}
}
在controller中使用

这里创建两个简单的接口,使用GET和POST方法分别调用了两个免费的api。

同样使用Resource加载HttpUtil类的对象到controller中。

@RestController
public class TestController {
@Resource
HttpUtil httpUtil; @GetMapping("inaword")
public String inAWord() throws IOException {
return httpUtil.get("http://api.lkblog.net/ws/api.php");
} @GetMapping("create/random")
public String createRandom(String name, String phone) throws IOException {
Map<String, String> params = new HashMap<>();
params.put("name", name);
params.put("job", phone);
return httpUtil.post("https://reqres.in/api/users", params);
}
}

通过上面的介绍,希望能帮助大家更快的上手java开发。

完整的pom.xml和application.xml

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.abc</groupId>
<artifactId>webtest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>webtest</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency> <!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency> <!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency> <!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 9999 spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/test_db?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456

文章中工程的源代码地址:https://gitee.com/dothetrick/webtest

以上内容属个人学习总结,如有不当之处,欢迎在评论中指正

PHP转JAVA开发30分钟实战攻略的更多相关文章

  1. Apple Watch程序开发30分钟秒懂

    苹果公司Apple Watch智能手表正在备受追捧,迅速掌握Apple Watch的APP架构,环境搭建,及实例开发将会让开发者占尽先机.我赢职场全国首发,30分钟玩转Apple Watch应用开发实 ...

  2. 简历编写技巧-java开发工程师简历实战

    看到一遍简历编写的文章 想到也快找工作了 早晚能够用上 现在摘录如下 640?wx_fmt=jpeg 工欲善其事,必先利其器,这是自古以来的道理.所以如果想找到一份好的工作,一定要先整理一份好的简历. ...

  3. android开发新浪微博客户端 完整攻略 [新手必读]

    开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...

  4. Log4j实现对Java日志的配置全攻略

    1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , ...

  5. Android 开发命令行完全攻略

    作为命令行的爱好者,我想写这个主题已经有好一段时间了.除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 TAB 健显然会快很多. ...

  6. Ubuntu下嵌入式Qt开发环境配置全攻略

    http://qpcwth.blog.163.com/blog/static/20993024620139151424822/ 在安装的过称中,出现一些问题,注意试想: 1.本次开发环境的配置,是基于 ...

  7. Java文档注释全攻略

    注释:注释起到对代码标注和解释的作用,如果你去看看JDK源码,会发现他们有许多的注释,而且注释是比代码还要多的,可见为代码添加注释是非常重要的,写好注释能让别人更加容易看懂你的代码,注释可以分为以下三 ...

  8. 别梦依稀咒逝川,Ruby二十八年前|M1芯片Mac os系统配置Ruby(3.0.0) on Rails(6.1.1)开发环境(2021最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_188 在每个开发者心里,都会有一门"最好"的语言,在这个世界的某个深处,在一些矫矫不群的人们心中,这门语言的名 ...

  9. 大数据时代变局与机遇,BI数字化转型的实战攻略!

    党的十九大报告提出,要推动互联网.大数据.人工智能和实体经济深度融合.更加高效地获取.运用信息,成为企业具有强大竞争力的重要标志.我国企业应牢牢把握历史性机遇,以更加开放的姿态,积极拥抱新经济,积极参 ...

随机推荐

  1. Squares UVA - 201

    A children's board game consists of a square array of dots that contains lines connecting some of th ...

  2. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本

    Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...

  3. 473. Matchsticks to Square

    Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...

  4. ASP封装DLL 直接上代码

    ASP转DLL 基本引用类库 OLE Automation Com+ services Type Library Microsoft Active Server Pages Object Micros ...

  5. 03- Linux目录与文件进阶操作

    第三课 目录与文件进阶操作cat (一次性全部输出文件内容)   cat -n 文件名 显示行号   cat -b 文件名 空行不显示行号less (分页显示,可以上下翻页,光标键上下键,PageUp ...

  6. 02- HTML网页基础知识与浏览器介绍

    1.认识网页 网页主要由文字,图像和超链接等元素构成.当然,除了这些元素,网页还可以包含音频,视频,以及flask等. 如图所示就是一个网页: 网页是如何形成的呢? 它是由前端人员写的代码,经过浏览器 ...

  7. 【Feign】Feign ,OpenFeign以及Ribbon之间的区别?

    Ribbon Ribbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件 Ribbon 可以用来做客户端负载均衡,调用注册中心的服务 Ribbon的使用需要代码里手动调用目标服务,请 ...

  8. Linux中的防火墙(Netfilter、Iptables、Firewalld)

    目录 Netfilter Iptables iptables做本地端口转发 Firewalld Netfilter Netfilter是Linux 2.4内核引入的全新的包过滤引擎,位于Linux内核 ...

  9. hdu5247找连续数(打表)

    题意(中问题直接粘题意吧)                                 找连续数 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否 ...

  10. windows-DLL注入

    DLL注入     刚刚整理的代码注入(远程线程注入)现在整理这个DLL注入,DLL注入比较常用,相比远程代码注入DLL注入没有什么太多的限制,而且实现起来比较简单,当然远程线程需要注意的问题DLL很 ...