好久没写博客了,去年买了个阿里云的云服务器,三年两百多,后面学习了一下服务器的搭建,主要就是在服务器装软件什么的,具体后面有时间再写点详细的博客说明一下。
现在自己又想搞点东西,正好把后台程序开发的过程记录一下,东西很简单,只能算入门,毕竟我是一个搞安卓的,后台能大概使用就行了吧。
创建项目
首先在idea里面创建项目,这里选择springboot项目
信息什么的就自己填写了,下面选中Spring web库和MySql Driver就行,能选的还是选上吧,我第一次总弄漏了MySql Driver,后面在配置文件里面加总有问题,莫名其妙。
接下来等项目加载完吧,加载完在application左边会有运行符号。
可以运行试试,出现下面的东西应该问题不大了。
添加依赖
这里要用到MyBatis,需要添加几个依赖,左上角project展开,选择pom.xml。
在mysql下面加上这两个依赖,右下角import changes就可以了,版本如果不是最新的自己找找吧。
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
如果出现类似下面错误,把对应版本调低就好了
Failed to read artifact descriptor for org.springframework.boot:spring-boot-starter-jdbc:jar:2.4.5
配置数据库
左上角选择Packages,打开application.properties文件,加上如下代码:
mybatis.configuration.mapUnderscoreToCamelCase=true //MyBatis驼峰转换
server.port=8800
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=******
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db_students?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
当然数据库用户名和密码要换成你自己的,IP地址和数据库表也要换成你自己的。
至于数据库设置和数据库添加数据,我有时间加一篇博客详细说明吧,现在自行解决一下。
代码编写
下面是我之前按别人教程写的一个例子,可以参考一下,至少我这是能运行的,至于数据可能不太一样,还是需要自己动动手。
新建四个目录,分别对应数据类、map类、服务以及controller。
数据类
- JsonResult:这是一个通用json返回类,即把我们要返回的数据转换为json格式
public class JsonResult {
private String status=null;
private Object result=null;
public JsonResult status(String status) {
this.status = status;
return this;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
- 具体数据,类似下面
public class Task {
private int id;
private int state;
private int filter;
private int type;
private String startTime;
private int duration;
private String endTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getFilter() {
return filter;
}
public void setFilter(int filter) {
this.filter = filter;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
private String title;
private String content;
}
map类
这是要对数据库直接做操作的接口
import java.util.List;
// @Mapper 这里可以使用@Mapper注解,但是每个mapper都加注解比较麻烦,
// 所以统一配置@MapperScan在扫描路径在application类中
public interface TaskMapper {
//查
@Select("SELECT * FROM tb_task WHERE id = #{id}")
Task getTaskById(Integer id);
//查全部
@Select("SELECT * FROM tb_task")
public List<Task> getTaskList();
//增
@Insert("insert into tb_task(id,state,filter,type,start_time,duration,end_time,title,content) " +
"values(#{id},#{state},#{filter},#{type},#{startTime},#{duration},#{endTime},#{title},#{content})")
public int add(Task task);
//删
@Delete("delete from tb_task where id=#{id}")
public int delete(Integer id);
//改
@Update("update tb_task set " +
"id=#{task.id}," +
"state=#{task.state}," +
"filter=#{task.filter}," +
"type=#{task.type}," +
"start_time=#{task.startTime}," +
"duration=#{task.duration}," +
"end_time=#{task.endTime}," +
"title=#{task.title}," +
"content=#{task.content} " +
"where id=#{id}")
public int update(@Param("id") Integer id, @Param("task") Task task);
}
服务类
import java.util.List;
//如果有一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext里面定义bean了
@Service
public class TaskServiceImpl implements TaskService {
//Autowired:把配置好的Bean拿来用,完成属性、方法的组装
@Autowired
private TaskMapper taskMapper;
@Override
public Task getTaskById(Integer id) {
return taskMapper.getTaskById(id);
}
@Override
public List<Task> getTaskList() {
return taskMapper.getTaskList();
}
@Override
public int add(Task task) {
return taskMapper.add(task);
}
@Override
public int delete(Integer id) {
return taskMapper.delete(id);
}
@Override
public int update(Integer id, Task task) {
return taskMapper.update(id, task);
}
}
对应接口
import java.util.List;
public interface TaskService {
//通过id查询
Task getTaskById(Integer id);
//获取用户列表
public List<Task> getTaskList();
//增
public int add(Task task);
//删
public int delete(Integer id);
//改
public int update( Integer id, Task task);
}
controller类
import java.util.List;
@RestController
public class TaskController {
@Autowired
private TaskService taskService;
/**
* 根据ID查询任务
* @param id 查询ID
* @return 任务
*/
//@PathVariable:用于获取url中的数据
@GetMapping(value = "task/query/{id}")
public Task getTaskById(@PathVariable(value = "id") Integer id){
try {
Task task = taskService.getTaskById(id);
return task;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 查询任务列表
* @return 任务列表
*/
@RequestMapping(value = "tasks/query",method = RequestMethod.GET)
public List<Task> getTaskList(){
try {
List<Task> tasks = taskService.getTaskList();
return tasks;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 添加任务
* @param task 任务
* @return 结果
*/
@RequestMapping(value = "task/add",method = RequestMethod.POST)
public ResponseEntity<JsonResult> add(@RequestBody Task task){
JsonResult r = new JsonResult();
try {
int orderId = taskService.add(task);
if (orderId < 0){
r.setResult(orderId);
r.setStatus("failed");
}else {
r.setResult(orderId);
r.setStatus("ok");
}
}catch (Exception e){
r.setResult(e.getClass().getName()+":"+e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 根据id删除任务
* @param id 任务id
* @return 结果
*/
@RequestMapping(value = "task/delete/{id}",method = RequestMethod.DELETE)
public ResponseEntity<JsonResult> delete(@PathVariable(value = "id") Integer id){
JsonResult r=new JsonResult();
try {
int delId = taskService.delete(id);
if (delId < 0){
r.setResult(delId);
r.setStatus("failed");
}else {
r.setResult(delId);
r.setStatus("ok");
}
}catch (Exception e){
r.setResult(e.getClass().getName()+":"+e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
/**
* 根据id修改task信息
* @param task 任务
* @return 结果
*/
@RequestMapping(value = "task/update/{id}",method = RequestMethod.PUT)
public ResponseEntity<JsonResult> update(@PathVariable(value = "id") Integer id,
@RequestBody Task task){
JsonResult r=new JsonResult();
try {
int ret = taskService.update(id, task);
if (ret<0){
r.setResult(ret);
r.setStatus("fail");
}else {
r.setResult(ret);
r.setStatus("ok");
}
}catch (Exception e){
r.setResult(e.getClass().getName()+":"+e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
}
添加扫描
要使程序能够运行还需要在application中加上注解,然后就能运行了。
@SpringBootApplication
@MapperScan(basePackageClasses = TaskMapper.class)
public class PdcaApplication {
public static void main(String[] args) {
SpringApplication.run(PdcaApplication.class, args);
}
}
数据库
害,还是把接口也写一下吧,主要就是用Navicat 连数据库,间表和加点数据,很简单的,贴个图,也是不专业的瞎搞。
这个是设计表。
这个是加的数据
接口测试
如果按上面的例子写好,数据库弄好,到这里应该是可以测试了,使用Postman可以测试,注意一下请求方法,数据填在body的raw数据里面就行了。
根据id查询(GET):http://localhost:8800/task/query/{id}
查询所有(GET):http://localhost:8800/tasks/query
添加(POST):http://localhost:8800/task/add
根据id删除(DELETE):http://localhost:8800/task/delete/{id}
根据id修改(PUT):http://localhost:8800/task/update/{id}
先在idea上面运行软件,在浏览器输入个最简单的,应该就有数据了。
http://localhost:8800/tasks/query
下面这个是写博客同时写的程序,已经跑起来了,没什么问题,使用postman演示一个add方法,如下:
软件打包到服务器
Springboot 和普通web 应用程序不一样,其本质上是一个 Java 应用程序,Springboot 部署会采用两种方式:全部打包成一个jar,或者打包成一个war。现在讲一下打包成 jar 部署。
在idea右边点开mavan,先clean一下,再点package就好了,稍微等会,
根目录下会多一个target目录,里面就有要的jar包了。
把这个jar包拷贝到服务器里面运行就是了
java -jar target/pdca.jar //文件自己改名吧
要保持在后台运行,用nohub和&符号就行
nohup java -jar pdca.jar &
出现问题
有时候很奇怪啊,阿里云都设置好了安全组,但是就是没法访问数据库,可以查看已经开放的端口,看看3306端口是否被关了:
firewall-cmd --list-ports //开启端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
结束
这篇博客大概把简单的后台开发讲了下,到这应该是能用了,但是涉及到服务器配置、软件安装、域名、数据库安装和配置的东西都没仔细讲,有时候补上吧。