文章目录
- 前言
- IDEA搭建SpringBoot
- 新建项目
- 配置及启动
- 配置
- 启动
- 简单功能的实现
- 页面输出文本或返回JSON
- 跳转模板(templates文件夹下的HTML)
- 实现JPA增删查改
- 数据库表创建
- 实体类
- Dao查询接口
- 控制器方法
- HTML模板页面
- 效果展示
- 坑和知识点
前言
此文章讲解使用IDEA搭建SpringBoot项目,并实现简单的增删查改功能,在搭建过程中遇到了很多坑。
SpringBoot真的是非常的简单,相比于之前搭建SSM或者SSH,几乎是0配置,基本无需繁杂的XML,所有配置操作通通由注解来完成,这个特性知道SpringBoot的应该也早有耳闻。
目前的微服务很火,SpringBoot和SpringCloud都属于微服务框架,具体什么是微服务框架?戳这里,如果有机会,后续会研究研究。
IDEA搭建SpringBoot
新建项目
两种方式,第一种,使用IDEA直接创建,第二种,SpringBoot官网填好配置,直接生成,生成之后导入到IDEA中。
直接来看第一种。首先打开IDEA,选择新建project,在新建时选择Spring Initializr项,可以看到右边JDK和选择初始化服务连接的选项,默认选第一个,其实就是IDEA帮我们从start.spring.io去下载SpringBoot的初始化项目。
在此页面选择要导入的包,可以记得刚才在新建第二步的时候,项目类型是Maven,因此项目的包管理是由Maven来完成的,所以这里选择导入的包其实就是将选择的包加入到Maven的pom文件中。
首先导入Web中的Web,SQL中的Mysql,JPA(Java持久层API)和JDBC,选择JPA是因为要使用JPA来操作数据库,这里的JPA实现貌似是由Hibernate来完成的,具体为什么后续有描述。
在SpringBoot中呢,引入了一个模板引擎的概念,也就是使用原生的HTML来代替JSP,因此呢我们需要将Template Engines中的Thymeleaf也选上,才能使用模板,此处需要注意了,要引入的包分别为:
- Web中的Web
- SQL中的MySql、JDBC和JPA
- Template Engines中的Thymeleaf
也可以根据你的需要进行添加或更改。添加完成之后,选择存放位置,完成即可。
配置及启动
创建完成后,可以看到如上所示的SpringBoot项目的结构,这里需要说一下的是,SpringBoot配置有两种:
- application.properties
- application.yml
项目创建完成之后,可以看到默认的是第一种,其实在日常开发中,yml要比properties来的方便的多,yml其实也是一种交互式编程语言,联想到xml,只不过yml拥有自己特有的语法结构。这里我们选择重命名为application.yml。
这两种配置文件可以到官方文档中查看,后续有时间我也会做一下关于这两种文件的用法。
配置
现在的项目虽然已经新建好了,但是呢还无法运行起来,因为在选择了JDBC和JPA操作数据库之后,SpringBoot的启动默认是需要将这两项的信息告知SpringBoot的,因此呢在运行启动之前呢,需要先在yml里面进行相应的配置。顺便值得一提的是,idea对yml的提示效果真的很棒。
- 数据源的配置
数据源配置如下:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
#为了防止中文乱码,在URL中默认添加了?useUnicode=true&characterEncoding=UTF-8来使用UTF8编码,
#&allowMultiQueries=true表示支持批量更新,因为我的电脑时区紊乱,无法启动项目,因此需要加&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
千万要注意缩进,同样缩进表示在同一级,结构层次是由缩进来决定的,一定要注意!!!!
- JPA(Java持久层API)的配置
jpa:
hibernate:
ddl-auto: update
show-sql: true
注意这里的jpa是和datasource同一级的,因为都是spring中提供的功能。这里可以看到,配置jpa时看到了hibernate字样,基本证实了此处JPA实现是由Hibernate来完成的
ddl-auto用来指定项目启动时对数据库结构包括数据库、数据库表的创建、更新、删除等操作,具体取值如下:
- create 启动时删数据库中的表,然后创建,退出时不删除数据表
- create-drop 启动时删数据库中的表,然后创建,退出时删除数据表 如果表不存在报错
- update 如果启动时表格式不一致则更新表,原有数据保留
- validate 项目启动表结构进行校验 如果不一致则报错
一般情况下选择update就好
- 启动端口配置
server:
port: 8080
最后完成配置之后的全貌:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
#为了防止中文乱码,在URL中默认添加了?useUnicode=true&characterEncoding=UTF-8来使用UTF8编码,
#&allowMultiQueries=true表示支持批量更新,因为我的电脑时区紊乱,无法启动项目,因此需要加&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
server:
port: 8080
千万要注意缩进对齐!!
启动
配置完成之后就可以启动项目了,SpringBoot默认是以JAR的形式打包的,SpringBoot打包后内置Tomcat容器,因此无需自行配置Tomcat,而在启动方式上,和传统的Web项目是由区别的,SpringBoot启动,只需打开主类,运行启动主类即可,打开主类后,右击直接运行,不过在启动之前要保证maven已经下载并安装好了所需的依赖jar包:
如果配置没错的话,启动后输出结果如下:
要注意,在yml中任何一处的配置错误,比如url中的端口、数据库名、用户名密码等错误的话,都会导致启动不成功。访问localhost:8080,如果你配置了端口,这里的端口就要和你配置的一致
得到如上图就表示你的SpringBoot创建成功了
简单功能的实现
页面输出文本或返回JSON
可以在上图中看到,当前是错误页,是404的状态,因为启动后,没有定义要访问的页面或者是要显示的文本,接下来就先看一下在页面中输出一段文本
在主类的同级目录下新建controller包,存放所有的Controller控制器类,然后创建一个控制器,起名为IndexController
SpringBoot会自动加载和处理主类同级目录下的所有类,所以一定要在主类的同级或低于主类所在包的位置放置要编写的java类,无论是Controller还是Service还是Dao
在刚才创建的Controller类上使用@Controller注解,然后新建一个控制器方法,代码如下:
@Controller
public class IndexController {
@RequestMapping("/index")
@ResponseBody
public String index(){
return "JavaFeng";
}
}
当使用 @ResponseBody时,返回的是字符串,因此在需要返回Json时,使用 @ResponseBody即可
跳转模板(templates文件夹下的HTML)
当需要跳转到一个页面的时候,则不使用 @ResponseBody,返回值中的字符串则表示要跳转的模板页面的名称,不加后缀名,首先在templates下新建一个页面,比如index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这里是Javafeng的博客
</body>
</html>
然后修改控制器方法,将返回值字符串更改为要跳转的html的名称index,尝试访问
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(){
return "index";
}
}
实现JPA增删查改
数据库表创建
创建一个数据库表,叫user,表结构如下
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
实体类
controller同级创建model包,存放实体类,新建实体类User,并用注解配置一下
@Entity(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
String name;
Integer age;
//省略getter和setter
}
Dao查询接口
controller同级创建daol包,存放数据库操作接口,新建接口UserDao,继承JpaRepository,JpaRepository格式为JpaRepository<要操作的实体类,实体类主键类型>,代码如下
public interface UserDao extends JpaRepository<User,Integer> {
}
控制器方法
在控制器类中注入一个UserDao对象用来操作数据库,并新建控制器方法get_all_user()查询所有用户并返回到后台,此处可以使用ModelAndView
//注入UserDao
@Autowired
private UserDao userDao;
@RequestMapping("/users")
public ModelAndView get_all_user() {
List<User> userlist = userDao.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("users");
modelAndView.addObject("userList", userlist);
return modelAndView;
}
JPA操作数据库常用方法,以UserDao为例:
查询全部
userDao.findAll()
//返回List<User>
查询单条
userDao.getOne(Integer id)
//参数为主键id,返回User对象
删除单条
userDao. deleteById (Integer id)
//参数为主键id
保存或更新单条
userDao. save(User user)
//参数为User对象
HTML模板页面
创建users.html来显示用户信息
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
layout:decorator="base/layout.html">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>编号(id)</td>
<td>姓名(name)</td>
<td>年龄(age)</td>
</tr>
<tbody th:each="user : ${userList}">
<tr >
<td th:text="${user.getId()}"></td>
<td th:text="${user.getName()}"></td>
<td th:text="${user.getAge()}"></td>
</tr>
</tbody>
</table>
</body>
</html>
注意在html标签内添加xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" layout:decorator="base/layout.html"
,这是thymeleaf对Html的支持。模板内常用的几个标签及用法后续进行总结,这里列举几个:
-
th:each="user : ${userList}"
:遍历,格式为th:each="遍历出的对象 : ${被遍历的集合}"
-
th:text="${user.getId()}"
:在标签内放置文本 -
th:href="@{/getuser(id=1)}"
:格式th:href="@{/路径(参数名=参数值)}"
,为a标签添加href属性,参数值可使用${对象或属性}
的格式,例如:th:href="@{/getuser(id=${user.getId()})}"
-
th:value="${user.getId()}"
:为input填充值 - if判断等等等用法自行谷歌吧!
效果展示
访问localhost:8080/users,最后效果:
坑和知识点
- 如果无法访问到模板,一直报404,一定千万看是否导入了Thymeleaf包,没有导入的话是无法访问的
- 一定会有人问我后台怎么样跳转到@RequestMapping定义的链接?使用
return "redirect: /index"
就可以访问刚才新建的第一个控制器方法
有疑问请留言评论,有不足请留言指正!
下载源码 提取码:34mn