本文是《跑通一篇博客代码假装自己会Java》的父亲篇,如果直接头铁用Java代码写后端服务器,前后端的通信和数据库的管理都不方便。SpringBoot框架能快速搭建后端服务。
前文我们使用Socket和JDBC进行通信和数据库操作。本文我们使用http和mybatis进行通信和数据库操作。但在一切开始之前,需要安装Maven(apache-maven-3.8.2-bin.tar.gz),这玩意有点类似Python里面的pip,用来管理软件包的,mybatis就属于软件包的一种。
Maven解压之后:
如下图,在D:\maven\apache-maven-3.8.2\conf\settings.xml增加一行代码,并新建D:\maven\rep文件夹,这个文件夹是用来存放Maven管理的软件包的。
------------------搞定,开始新建SpringBoot项目-------------------
Finish之后,打开File->Settings,如下配置Maven环境。
配置完成后,配置项目的通信端口和数据库信息,打开src\main\resources\application.properties,填入信息(信息要用自己的,别照抄我的):
server.port = 8080
spring.datasource.url = jdbc:mysql://localhost:3306/caoyi
spring.datasource.username = root
spring.datasource.password = admin123
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
如果配置都正确的话,运行src\main\java\com\example\demo2\Demo2Application文件,结果如下,工程就没问题了。
-------------------------------实现http通信和数据库操作------------------------------
工程路径文件如上图,我们需要注意的是这5个文件:myController.java、myMapper.java、myServicer.java、application.properties、pom.xml。
myController.java、myServicer.java、myMapper.java对应的是MVC设计模式的三层架构,control提供前端操作接口,service是后端业务逻辑,mapper是后端数据库底层操作。
application.properties上面说过是用来配置项目的初始信息的。
pom.xml是Maven的软件包配置文件,每一个<dependency>XXX</dependency>就是一个依赖包。
代码如下:
myController.java
package com.example.demo.controller;
import com.example.demo.servicer.myServicer;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class myController {
@Autowired
private myServicer m_service;
@RequestMapping("function1")
public String print(@RequestParam("str") String param_str) {
System.out.println(param_str);
return param_str;
}
@RequestMapping("function2")
public List<JSONObject> func2(@RequestParam("sex") String param_sex) {
return m_service.getData(param_sex);
}
}
myServicer.java
package com.example.demo.servicer;
import com.example.demo.mapper.myMapper;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class myServicer {
@Autowired
private myMapper m_mapper;
public List<JSONObject> getData(String pSex) {
return m_mapper.getData(pSex);
}
}
myMapper.java
package com.example.demo.mapper;
import net.sf.json.JSONObject;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface myMapper {
@Select("select * from info where SEX=#{param_sex}")
List<JSONObject> getData(@Param("param_sex") String param_sex);
}
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.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo2</name>
<description>demo2</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
-------------------------------测试-------------------------------
1、在网页输入 http://localhost:8080/function1?str=12345:
前端会显示:
后端会显示:
2、在网页输入 http://localhost:8080/function2?sex=男:
后端无显示,前端显示:
稍微解释一下代码流程:我们在浏览器输入链接,相当于前端向后端发送了http请求,后端根据不同的请求映射函数(代码内是function1和function2),执行对应的业务代码,然后将结果返回给前端。部署的时候将localhost换成局域网IP,内网其他电脑都可以成为前端。
---------------------------------2021.9.25更新-----------------------------------------
补充线程池的代码样例,包括无线大的线程池,固定大小的线程池,定时执行的线程!
import java.util.concurrent.*;
class ThreadPoolTest {
public void cachedThreadPool() {
ExecutorService threadPool = Executors.newCachedThreadPool();
for(int i=0;i<10;i++) {
threadPool.execute(()->{
while(true){
System.out.println(Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
public void fixedThreadPool() {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for(int i=0;i<10;i++) {
int finalI = i;
threadPool.execute(()->{
int count = 5;
while(true){
System.out.println(Thread.currentThread().getId() + ":" + finalI);
if(0 == --count) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
public void scheduledThreadPool() {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(()->{
System.out.println(Thread.currentThread().getId() + ":one second pass");
}, 0, 1, TimeUnit.SECONDS);
}
}
public class Main {
public static void main(String[] args) {
ThreadPoolTest threadPoolTest = new ThreadPoolTest();
threadPoolTest.scheduledThreadPool();
}
}
---------------------------------2021.10.2更新-----------------------------------------
补充http协议get和post的代码,用来与SpringBoot的controller模块通信
import net.sf.json.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
public class http_test {
public JSONObject httpGet(){
RestTemplate rt = new RestTemplate();
String urlGet = "http://localhost:8886/Test/get";
ResponseEntity<JSONObject> response = rt.getForEntity(urlGet, JSONObject.class);
JSONObject body = response.getBody();
return body;
}
public JSONObject httpPost() {
JSONObject jobj = new JSONObject();
jobj.element("name","caoyi").element("password","123");
RestTemplate rt = new RestTemplate();
String urlGet = "http://localhost:8886/Test/set";
ResponseEntity<JSONObject> response = rt.postForEntity(urlGet, jobj, JSONObject.class);
JSONObject body = response.getBody();
return body;
}
public static void main(){
}
}