在Spring和Spring Boot项目中,项目结构通常遵循一定的分层设计原则,以保持代码的清晰和可维护性。常见的项目结构如下:
src ├── main │ ├── java │ │ └── com │ │ └── example │ │ ├── controller // 控制层,处理HTTP请求 │ │ ├── service // 服务层,处理业务逻辑 │ │ ├── mapper // MyBatis Mapper接口 │ │ ├── entity // 实体类,对应数据库表 │ │ ├── config // 配置类,如Spring配置、MyBatis配置等 │ │ ├── interceptor // 拦截器 │ │ ├── filter // 过滤器 │ │ └── Application.java // 程序入口 │ └── resources │ ├── application.yml // 配置文件 │ ├── mapper // MyBatis XML映射文件 │ └── static // 静态资源 └── test └── java └── com └── example └── test // 测试类
Spring Boot使用application.yml
或application.properties
作为主要的配置文件。常见的配置项包括:
示例:
yamlserver:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: root
logging:
level:
com.example: DEBUG
Spring Boot项目的入口通常是一个带有@SpringBootApplication
注解的类,该类会启动Spring Boot应用。
javapackage com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在Spring Boot中,路由通常由控制器(Controller)类来处理。使用@RequestMapping
、@GetMapping
、@PostMapping
等注解来定义路由。
javapackage com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public String getUsers() {
return "List of users";
}
}
Spring Boot支持多种传参方式:
@PathVariable
注解。@RequestParam
注解。@RequestBody
注解。示例:
java@GetMapping("/users/{id}")
public String getUserById(@PathVariable Long id) {
return "User ID: " + id;
}
@GetMapping("/users")
public String getUsers(@RequestParam String name) {
return "User name: " + name;
}
@PostMapping("/users")
public String createUser(@RequestBody User user) {
return "Created user: " + user.getName();
}
拦截器(Interceptor)用于在请求处理前后执行一些操作,如权限验证、日志记录等。通过实现HandlerInterceptor
接口来创建拦截器。
javapackage com.example.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 请求处理前的逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理后的逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求完成后的逻辑
}
}
在配置类中注册拦截器:
javapackage com.example.config;
import com.example.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**");
}
}
过滤器(Filter)用于在请求到达Servlet之前或之后执行一些操作。通过实现Filter
接口来创建过滤器。
javapackage com.example.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 请求处理前的逻辑
chain.doFilter(request, response);
// 请求处理后的逻辑
}
}
在配置类中注册过滤器:
javapackage com.example.config;
import com.example.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/api/*");
return registrationBean;
}
}
MyBatis-Plus提供了非常便捷的CRUD操作,通过继承BaseMapper
接口即可实现。
javapackage com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
在Service层中使用:
javapackage com.example.service;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectById(id);
}
public void createUser(User user) {
userMapper.insert(user);
}
public void updateUser(User user) {
userMapper.updateById(user);
}
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
}
MyBatis-Plus提供了强大的条件构造器QueryWrapper
,用于构建复杂的查询条件。
javapackage com.example.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsersByName(String name) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name);
return userMapper.selectList(queryWrapper);
}
}
Spring提供了声明式事务管理,通过@Transactional
注解来实现。
javapackage com.example.service;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void createUserWithTransaction(User user) {
userMapper.insert(user);
// 如果发生异常,事务会回滚
if (true) {
throw new RuntimeException("Transaction will rollback");
}
}
}
MyBatis-Plus提供了一些钩子方法,如@TableField
注解中的fill
属性,用于在插入或更新时自动填充字段。
javapackage com.example.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
Spring Boot提供了对Redis的集成支持,通过spring-boot-starter-data-redis
依赖即可实现。
在application.yml
中配置Redis:
yamlspring:
redis:
host: localhost
port: 6379
使用RedisTemplate进行操作:
javapackage com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void setValue(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
public String getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
}
通过以上配置和代码示例,你可以快速搭建一个基于Spring Boot和MyBatis-Plus的项目,并集成Redis等中间件。
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!