前言:
许多初学者在配置相关环境后便相快速搭建“实体-持久-业务-控制层”示例项目。但由于经验不足可能在某些地方埋下隐患而导致搭建失败。本文将一些容易出错的地方标注,并附上相关依赖和配置清单,来帮助初学者快速入手。本文环境如下:
- Java 1.8
- MySQL 8.0
- IDEA 2019
- Maven 3.6.3
Java编码:
项目工程结构如下图所示。分为controller
-entity
-reponsitory
-service
-service.impl
这几个层次。
其中controller
是存放控制类的代码,entity
存放实体Java Bean,reponsitory
存放与实体Java Bean相关的持久层代码,service
存放与业务相关的接口,service.impl
存放与service
相关的具体实现。
示例工程中具体存放如下所示类:
1:entity
层中的BusinessBean.java
:
(注意@Id
这个注解导入的是 javax.persistence.Id
)
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table
public class BusinessBean {
// Note this package ought to be javax.
@Id
private String id;
@Column
private String name;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public BusinessBean(){
}
public BusinessBean(String id, String name){
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "BusinessBean{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
2:reponsitory层的BusinessBeanRepository.java:
(JpaRepository<>
这个泛型参数第一个为实体Bean,第二个实体Bean的主键数据类型)
import com.example.demo.entity.BusinessBean;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BusinessBeanRepository extends JpaRepository<BusinessBean, String> {
}
3:service层的FindService.java:
import com.example.demo.entity.BusinessBean;
import java.util.Optional;
public interface FindService {
public Optional<BusinessBean> findById(String id);
}
4:service.impl层的FindServiceImpl.java:
import com.example.demo.entity.BusinessBean;
import com.example.demo.repository.BusinessBeanRepository;
import com.example.demo.service.FindService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Optional;
@Service
public class FindServiceImpl implements FindService {
@Resource
BusinessBeanRepository businessBeanRepository;
@Override
public Optional<BusinessBean> findById(String id) {
Optional<BusinessBean> businessBeanList = businessBeanRepository.findById(id);
return businessBeanList;
}
}
5:controller层的FindController.java:
(注意在controller层注入的是XXXService而不是XXXServiceImpl)
import com.example.demo.service.FindService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@RestController
public class FindController {
@Resource
FindService findService;
@RequestMapping(value = "/find/{id}", method = RequestMethod.GET)
public List<Optional> findController(@PathVariable String id){
List<Optional> optionalList = Collections.singletonList(findService.findById(id));
return optionalList;
}
}
7:测试使用的数据库与数据表:
说明:本示例使用了名为csdn_test
的数据库,其存在一数据表名为business_bean
。读者在数据库创建方面仅需创建数据库即可,数据表及其结构为JPA自动创建的,无需手动配置。
pom.xml配置:
读者容易出错的地方就是依赖配置选项。这里罗列出的几个依赖包括如下内容:
- spring jdbc
- druid
- log4j
- mysql驱动
以上内容对于测试示例而言足矣,故不再过多添加依赖。使用时直接粘贴复制即可。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CSDN_Test1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties配置:
数据库连接地方也是出错的重点。读者可直接把如下内容直接粘贴复制即可(账号、密码、数据库换成自己的)。
spring.datasource.url=jdbc:mysql://localhost:3306/csdn_test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
jpa.hibernate.show-sql=true
jpa.hibernate.format-sql=true
测试:
我们先在数据表里面放入几个测试数据并select:
使用GET请求,发送id并返回数据(使用@RestController会默认把数据序列化为JSON格式):