使用 SpringBoot 写增删改查

使用 SpringBoot 写增删改查

一、前言

1、之前使用 SSM(Spring+SpringMVC+MyBatis)+Maven 写后端的接口,创建了不少 Maven 工程。一开始还觉得 SSM+Maven 是十分简便的,但是后来审美疲劳,渐渐感觉这种固定化地创建 New Maven Project 是一件体力操作。

2、比如那些 web.xml(全局配置)、dispatch-Servlet.xml(SpringMVC配置)、applicationContext.xml(Spring配置)、mybatis-config.xml(MyBatis配置)等大同小异,一开始还会老老实实从0开始写,后来烦了直接复制粘贴之前的代码。

3、SpringBoot 就解决这个硬伤,很快建立工程,使用 SpringData 封装数据库访问层基本 CURD 接口(SSM还得使用逆向工程),一个简单的 application.yml 配置就搞定前面的所有配置,一手轻巧的注解取代了之前大量的代码。

这次根据 SpringBoot 官方API文档等,测试一下基于 SpringBoot 的 CURD,同时启用 Restful 风格,编写起代码来,十分具有美感~

RESTful API:

RESTful API 目前是前后端分离最佳实践

① 轻量,直接通过 http,不需要额外的协议

② 面向资源,一目了然,具有自解释性

③ 数据描述简单,一般通过 json 或 xml 做数据通信

二、依旧是简单的 CRUD,后台的基本

1、代码结构

总体来说,还是采用了标准的编程模式,建立 entity、dao、service、controller 包进行分类包装,部分接口采用 interface+implements。命名方面也有注意。

代码应该是很规范的。

2、Student.java

实体

package com.cun.entity;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Table;

import org.hibernate.validator.constraints.NotEmpty;

@Entity // 实体

@Table(name = "t_student") // 数据库表名

public class Student {

@Id // 主键

@GeneratedValue // 自增

private Integer id;

@NotEmpty(message = "学生姓名不能为空") // 表单验证

@Column(length = 20) // 字段长度

private String t_name;

@Column(length = 20) // 字段长度

private String major;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getT_name() {

return t_name;

}

public void setT_name(String t_name) {

this.t_name = t_name;

}

public String getMajor() {

return major;

}

public void setMajor(String major) {

this.major = major;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

3、StudentDao.java

dao 接口

实现类都不用写了,SpringData-JPA 自动帮你实现,里边虽然空空,但是单表基本CRUD接口都写好了

package com.cun.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.cun.entity.Student;

/**

* 简单的dao层只需要继承JpaRepository接口,即可,

* 两个参数,分别表示 —— 实体类型、主键类型

* 复杂sql语句再自己增加接口

* @author linhongcun

*

*/

public interface StudentDao extends JpaRepository<Student, Integer>{

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

4、StudentService.java

事务处接口

package com.cun.service;

import java.util.List;

import com.cun.entity.Student;

public interface StudentService {

public void addStudent(Student student);

public void deleteStudent(Integer id);

public void updateStudent(Student student);

public Student findStudent(Integer id);

public List<Student> findAllStudent();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

5、StudentServiceImpl.java

事务处接口实现类

package com.cun.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import com.cun.dao.StudentDao;

import com.cun.entity.Student;

import com.cun.service.StudentService;

@Service

public class StudentServiceImpl implements StudentService {

@Autowired 

private StudentDao studentDao;

@Override

public void addStudent(Student student) {

// TODO Auto-generated method stub

studentDao.save(student);

}

@Override

public void deleteStudent(Integer id) {

// TODO Auto-generated method stub

studentDao.delete(id);

}

@Override

public void updateStudent(Student student) {

// TODO Auto-generated method stub

studentDao.save(student);

}

@Override

public Student findStudent(Integer id) {

// TODO Auto-generated method stub

return studentDao.findOne(id);

}

@Override

public List<Student> findAllStudent() {

// TODO Auto-generated method stub

return studentDao.findAll();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

6、StudentController.java

控制层

package com.cun.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.DeleteMapping;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.PutMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import com.cun.entity.Student;

import com.cun.service.StudentService;

//@RestController 代替 @Controller,省略以后的 @ResponseBody

@RestController

@RequestMapping("/student")

public class StudentController {

@Autowired

private StudentService studentservice;

/**

* 显示所有

* url:"http://localhost/student/findall"

*

* @return

*/

@RequestMapping(value = "/findall")

public List<Student> findAllStudent() {

return studentservice.findAllStudent();

}

/**

* 查找 restful 风格

* url:"http://localhost/student/findone/1"

*

* @param id

* @return

*/

// == @RequestMapping(value = "/findone/{id}", method = RequestMethod.GET)

@GetMapping("/findone/{id}")

public Student findStudentRestful(@PathVariable("id") Integer id) {

return studentservice.findStudent(id);

}

/**

* 删除 restful 风格

* url:"http://localhost/student/deleteone/4"

* 注意无法通过浏览器的链接来模拟检验,可以通过 jquery的 $.ajax方法,并type="delete"

*

* @param id

*/

// == @RequestMapping(value = "/deleteone/{id}", method = RequestMethod.DELETE)

@DeleteMapping("/deleteone/{id}")

public void deleteStudentRestful(@PathVariable("id") Integer id) {

studentservice.deleteStudent(id);

}

/**

* 增加 restful 风格

* url:"http://localhost/student/addone"

* 通过<form>表单模拟验证

*

* @param student

*/

// == @RequestMapping(value="/addone",method=RequestMethod.POST)

@PostMapping("/addone")

public void addStudentRestful(Student student) {

studentservice.addStudent(student);

}

/**

* 修改 restful 风格

* url:"http://localhost/student/updateone"

* 验证:可以通过 jquery的 $.ajax方法,并type="put",同时注意data形式——A=a&B=b&C=c

*

* @param student

*/

// == @RequestMapping(value="/addone",method=RequestMethod.PUT)

@PutMapping("/updateone")

public void updateStudentRestful(Student student) {

studentservice.updateStudent(student);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

7、index.html

接口测试,这里写得有点简陋,不过还是可以正确测试接口写得是否有问题

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<script src="js/jquery-1.7.2.js"></script>

<script type="text/javascript">

/**

* 实际应用时,里边的参数应根据实际而改变,而不是写死的,

* 这里仅仅①简单地模拟前后端,②简单测试接口

*

*/

function del() {

$.ajax({

type : "delete",

url : "http://localhost/student/deleteone/4",

async : true

});

}

function upd() {

$.ajax({

type : "put",

data:"id=6&t_name=cun&major=计科",

url : "http://localhost/student/updateone",

async : true

});

}

</script>

</head>

<body>

<!-- 删除 -->

<button id="btn" onclick="del()">delete request</button>

<!-- 更新 -->

<button id="btn2" onclick="upd()">update request</button>

<!-- 增加 -->

<form action="http://localhost/student/addone" method="post">

major<input type="text" name="major" />

t_name<input type="text" name="t_name" />

<input type="submit" value="submit" />

</form>

<!-- 查询 -->

<a href="http://localhost/student/findone/6">select request</a>

</body>

</html>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

8、application.yml

配置,算是很简单了,下面几个配置是最常用的

server:

  port: 80 #为了以后访问项目不用写端口号

  context-path: / #为了以后访问项目不用写项目名

spring:

  datasource:

    driver-class-name: com.mysql.jdbc.Driver

    url: jdbc:mysql://localhost:3306/testspring

    username: root

    password: 123

  jpa:

    hibernate:

      ddl-auto: update  #数据库同步代码

    show-sql: true      #dao操作时,显示sql语句

1

2

3

4

5

6

7

8

9

10

11

12

13

9、pom.xml

在 eclipse 创建 SpringBoot 工程时加入

以后再加入 mysql、jpa、web 就好了,并且可以通过 Alt+/ => Edit Starter 加入

三、小结

SpringBoot官方中文参考文档

【思考:SpringBoot 自动配置】

首先,这是基于 Spring4+ 版本的

①采用注解 bean 的方式进行配置

②习惯优于配置,自动加载了大量的常用的配置方式,如 SpringMVC+Spring,视图解析器、控制器等

③又可更改,如修改 SpringMVC,@Configuration+@Bean,修改上述自动配置。

————————————————

版权声明:本文为CSDN博主「larger5」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/larger5/article/details/79325999

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容