搭建框架
快速搭建springboot项目的步骤如下:
(1)访问 http://start.spring.io/
(2)选择一些选项(一般不需要修改):使用maven,java,以及springboot的版本号。dependency先不添加,我们观察一下系统会默认生成什么依赖。
(3)点击GENERATE,把zip文件夹解压到某个文件夹并用idea打开。
(4)找到maven的pom文件,先进行一些依赖的处理问题。(自动添加依赖到仓库)
(5)在导入依赖的时候,我的系统进行了报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found,那么此时只要添加正确的version即可。
(6)我们发现必需依赖含有两个,一个是spring-boot-starter,一个是spring-boot-starter-test。
(7)运行程序,发现一运行项目就结束了,此时我们要添加一个web的依赖使项目成为一个网页项目,这样它就不会一启动就结束。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
再次运行,成功。
我们可以发现在最主要的包下面仅有一个DemoApplication.java文件用来启动项目。此时,我们需要在这个包下面再新建若干的包。
我们假设有一个user,它有属于自己的name和email。我们的任务是将其成功存入数据库。
Controller
这个包名为controller,位于控制层,作用是获取前端传来的参数,并且分配任务给业务层。
创建一个类名为UserController.java,并在其中写入如下代码:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/add/{name}/{email}")
public ResponceVO addUser(@PathVariable("name") String name,@PathVariable("email") String email) {
return userService.addUser(name,email);
}
}
@RestController的作用等同于@Controller + @ResponseBody。
@Controller注解,表明了这个类是一个控制器类。
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController。
@RequestMapping意味着想要访问这个controller,就必须要在路径中加上/user。
在这个类中,有一个userService,它连通控制层和业务层,是自动装配的(@Autowired)。
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到特定的处理方法上。也就是说要使用这个方法,就必须要在路径上加上/add/{name}/{email}。
@PathVariable表示上面花括号里面的参数会用到下面的代码中,并且将其当做了参数。
ResponceVO是一个返回类型,稍后会谈。
我们在方法中将工作分发给userService的addUser方法。
这就是一个简易的controller。
bl
这个包中会定义一些接口,这些接口一般都是自动装配的,用来连通业务层和控制层。
我们添加一个文件UserService.java,并加入如下代码:
public interface UserService {
ResponceVO addUser(String name,String email);
}
blImpl
这个包所在的位置的业务层,主要掌控业务的具体实现逻辑。
创建文件UserImpl.java,在其中加入如下代码:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public ResponceVO addUser(String name,String email) {
User user=new User(name,email);
userMapper.addUser(user);
return new ResponceVO(true,"id is "+user.getId());
}
}
@Service表示它位于业务层。
这个类实现了上面所说的接口,也有一个自动装配的userMapper,这是业务层和持久层之间的通道。
在具体实现中,我们创建了一个user对象,并通过userMapper的addUser方法加入了数据库,最后返回了responceVO对象。
po
这个包里面会包含很多实体类(譬如user)。
我们创建文件User.java,并加入如下代码:
@Data
public class User {
int id;
String name;
String email;
public User(String Name,String Email){
name=Name;
email=Email;
}
}
@Data是lombok注解,用来自动生成getter和setter方法。
它有一个id,name,email属性和一个构造方法。
vo
这是一个和前端交互数据的包。有时候前端会传来一个对象而不是一些简单的数据类型,此时就要用vo的类来接受;同样的,返回前端的类型一般也用vo来表示。
我们暂时只添加一个ResponceVO.java这个文件。
@Data
public class ResponceVO {
boolean success;
String message;
public ResponceVO(boolean s,String m){
success=s;
message=m;
}
}
success和message表示成功与否以及一些必要信息。
data
这个包位于持久层,也就是维持和数据库的交互,我们使用mybatis框架来进行交互。
首先在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
紧接着,我们在data包里面添加一个接口userMapper。
@Mapper
@Repository
public interface UserMapper {
void addUser(@Param("User") User user);
}
@Mapper是mybatis的注解,意味着此处需要映射文件。这个注解免除了原来mybatis框架中conf.xml的配置。
@Repository表示它位于持久层。
类中的具体内容和mybatis中一致。
紧接着,我们在resources文件夹中添加一个application.yml的配置,用来配置我们的数据库,以及映射文件的位置。
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:dataImpl/*/*Mapper.xml
同时在该文件夹下再新建一个文件夹名为dataImpl,在此文件夹中再加上一个文件夹User,User文件夹下增加一个UserMapper.xml文件,其中的内容和mybatis一致。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.data.UserMapper">
<insert id="addUser" keyProperty="id" useGeneratedKeys="true" >
<selectKey keyProperty="User.id" resultType="int" order="AFTER"> select LAST_INSERT_ID() </selectKey>
insert into mytable(name,email) VALUES (#{User.name},#{User.email})
</insert>
</mapper>
这个映射文件的作用是把User放进了数据库,并且让数据库自动生成了主键,并且将主键的值重新映射回了User的id属性中。
最后,只要把数据库中初始化mytable表,然后访问如下的url:
http://localhost:8080/user/add/myname/myemail
页面上返回一个responceVO的json文件,而且id也正确,这就成功完成了这么一个功能。