文章目录
添加依赖
ClassNotFound直接类名addMavenDependency
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version></version>
</parent>
<!--启动类要有这个依赖才能启动-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--打成jar包时能直接启动项目-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
启动类
@SpringBootApplication
//@SpringBootConfiguration //配置类
//@EnableAutoConfiguration //自动配置
//@ComponentScan //包扫描,路径为启动类包名
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args); //创建spring容器
}
//把实例存入容器
@Bean
public Object object(){ return new Object(); }
}
InitializingBean
@Component
public class ComponentName implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
//启动完成属性注入后会执行
}
jar包目录
System.getProperty(“user.dir”);
静态资源目录
ResourceProperties.java
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };
SpringMvc配置
@Configuration
public class CustomMvcConfiguration implements WebMvcConfigurer {
//添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");
}
}
CustomHandlerInterceptor
public class CustomHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//前置方法
return true;//true继续执行,false不进入@Controller
}
@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 {
//最终方法
}
}
整合Mybatis
pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.2.0.jre8</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version></version>
</dependency>
<!-- 通用Mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version></version>
</dependency>
application.yml
#数据源对象
spring:
datasource:
driver-class-name: driverClassName #输数据库名有提示
url: jdbc:mysql://url
username: username
password: password
mybatis:
# 别名
type-aliases-package: 包
# 映射文件路径
mapper-locations:
- classpath:/*.xml
# 下划转驼峰
configuration:
map-underscore-to-camel-case: true
#日期解析
jackson:
date-format: yyyy-MM-dd HH:mm:ss
timeZone: GMT+8
#自动处理关键字
mapper:
wrap-keyword: "`{0}`" #mssql用"[{0}]"
启动类
//用通用Mapper要这个包的MapperScan
import tk.mybatis.spring.annotation.MapperScan;
@MapperScan(basePackages = {"mapper包路径"})
public class Application {...}
Pojo
mssql只能用包装类
@Table(name = "`table`") //绑定数据库中的表,mssql [],dbo不用加
public class Pojo{
@Id //主键
@KeySql(useGeneratedKeys = true) // 自增主键返回
@Column(name = "别名")
@JsonIgnore //不需要返回的属性或方法
@JsonProperty("json返回key别名") //controller要接收json @RequestBody才能反序列化
@Transient //插入时忽略的字段
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")//日期格式转换
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;
}
Mapper
//包含通用方法
public interface Mapper extends Mapper<Pojo> {}
//通用Mapper查询方法
//Example查询
Example example = new Example(Pojo.class);
Example.Criteria criteria = example.createCriteria();
criteria.条件方法();
Mapper.selectByExample(example);
//实体类查询
Mapper.select(new Pojo());
//集合查询,Mapper要继承IdListMapper<Pojo,集合内数据类型>
Mapper.selectByIdList(List<集合内数据类型>)
//集合插入,Mapper要继承InsertListMapper<集合内数据类型>
Mapper.insertList(集合内数据类型);
Service
@Service
@Transactional //类中所有方法添加事务
public class Service {
@Autowired
private Mapper mapper;
@Transactional //方法添加事务
public Object function(){
return null;
}
}
Controller
@RestController //=@Controller+@ResponseBoduy
public class Controller {
@Autowired
private Service service;
//返回实体类自动转换JSON(需要实体类有getter)
@GetMapping("/")
public Object function(){
return service.function();
}
//需要返回状态码用ResponseEntity<>
@GetMapping("/")
private ResponseEntity<DO> exceptionHandler(DO do){
return ResponseEntity.status(int status/HttpStatus status).body(do);
}
}
整合Junit
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class Test {
@Test
public void testFuntion(){}
}
整合Redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
redis:
host: host
port: 6379
@Autowired
private RedisTemplate redisTemplate;
SpringBootServletInitializer
打包成war包时要继承SpringBootServletInitializer指定启动类
public class CustomServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
builder.sources(Application.class);
return builder;
}
}
@ControllerAdvice
自定义异常
@ControllerAdvice //全局生效
public class AdviceController {
@ExceptionHandler(ConsumerException.class) //拦截的Exception
private ResponseEntity<ConsumerException> exceptionHandler(ConsumerException e){
return ResponseEntity.status(e.getStatus()).body(e);
}
}
@Getter
public class ConsumerException extends RuntimeException {
public int status;
public ConsumerException(int status,String message) {
super(message);
this.status=status;
}
}