演示代码地址:kuizuo/spring-boot-demo (github.com)
目录结构展示图
controller
controller 目录下对应的也就是控制器,用于接收用户的请求(get,post 等),如下面代码
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@GetMapping("list")
public List<User> list() {
return userService.findAll();
}
}
用户请求http://127.0.0.1:8080/user/list 将会调用 userService.findAll 方法,当然这个方法事先定义好,用于获取所有用户。
model(service)
这里数据库连接方式以 JPA(一个 ORM 框架)为例,可以安装一个 IDEA 插件 JPA Buddy 新建文件时可以直接创建 Entity(实体)或 Repository(仓库)
entity 类
在 domain 目录下创建实体类,大致如下(lombok 因人而异选择使用,相对不展示 get 与 set 会好一些)
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
@Table(name = "user")
public class User implements Serializable {
@Id
@GeneratedValue
@ApiModelProperty(value = "ID", hidden = true)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
}
User.java 用于定义 user 实体,在 ORM 中,数据库表中的字段都可以通过实体类中的属性来定义的,如果定义好 user 实体,并且在 resources/application.yml 中设置了spring.jpa.hibernate.ddl-auto: update
那么启动项目后,数据库将会自动创建 user 表且其表中字段自动为@Column
注解的字段。
repository 类
创建完实体后,还需要定义数据接口访问层 DAO,在 JPA 中则是在 repository 目录下创建。
public interface UserRepository extends JpaRepository<User, Long> , JpaSpecificationExecutor<User> {
User findByUsername(String username);
}
一般情况下该接口无需定义额外方法,如有需要还可以定义属于自己的查询语句,比如上面的 findByUsername,这时候就注入后的 userRepository 对象就可以使用userRepository.findByUsername("kuizuo");
,将会返回数据库中该用户名的数据。
UserService 类
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAll(){
return userRepository.findAll();
}
}
@Autowired 可能不建议使用字段注入,可以在类添加@RequiredArgsConstructor 注解,表明 userRepository 不为空,总之目的就是将 userRepository 注入,供服务可用。
import com.kuizuo.demo.domain.User;
import com.kuizuo.demo.repository.UserRepository;
import com.kuizuo.demo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
@Override
public List<User> findAll() {
return userRepository.findAll();
}
}
接着就可以使用 userRepository 下的方法,如 userRepository.findAll
命令相当于 select * from user
,返回所有的用户列表。
service 接口实现
此外 service 服务还可以有另一种写法,在 service 中添加一个 impl 目录,通过对 userService