【Java】SSM入门开发流程总结

1.1 SSM整合流程
  1. 创建工程
  2. SSM整合
    • Spring
      • SpringConfig
    • MyBatis
      • MybatisConfig
      • JdbcConfig
      • jdbc.properties
    • SpringMVC
      • ServletConfig
      • SpringMvcConfig
  3. 功能模块
    • 表与实体类
    • dao(接口+自动代理)
    • service(接口+实现类)
      • 业务层接口测试(整合JUnit)
    • controller
      • 表现层接口测试(PostMan)
SpringConfig

对于Spring需要配置SpringConfig,需要配置的内容如下:

  • 设置为配置类:@Configuration
  • 扫描Bean的路径:@ComponentScan
  • 是否导入其他类,并加载其Bean:@Import
  • 导入其他类的配置项:@PropertySource("classpath:XXXXXX")
MybatisConfig

对于Mybatis需要配置MybatisConfig、JdbConfig以及引入Jdbc.properties数据库配置文件。

1.JdbcConfig:

  • 用@Value加载数据库连接信息,比如driver、username、password、url
  • 设置DataSource类,把信息载入jdbc
java 复制代码
public DataSource dataSouce(){
	DruidDataSource dataSource = new DruidDataSource();
	dataSource.setDriverClassName(driver);
	dataSource.setUrl(url);
	dataSource.setUsername(username);
	dataSource.setPassword(password);
	return dataSource;
}
  • 判断是否要添加事务管理器
java 复制代码
public  PlateformTransactionManager plateformtransactionManager(DataSource dataSource){
	DataSourceTransactionManager ds=new DataSourceTransactionManager();
	ds.setDataSource(datasource);
	return ds;
}

2.MybatisConfig

  • 设置工厂Bean用于创建数据库会话:SqlSessionFactoryBean
java 复制代码
@Bean
public SqlSessionFactoryBean sqlsessionFactoryBean(DataSource dataSource){
	SqlsessionFactoryBean factory = new SqlsessionFactoryBean();
	factory.setDataSource(datasource);
	return factory;
}
  • 配置映射器:MapperScannerConfigurer
java 复制代码
public MapperScannerConfigurer mapperScannerConfigurer(){
	MapperScannerConfigurer msc = new MapperScannerConfigurer();
	msc.setBasePackage("Hayaizo.dao");
	return msc;
}
SpringMVCConfig

SpringMVC需要配置SpringMVCConfig、ServletConfig

1.SpringMVCConfig

  • 设置为配置类:@Configuration
  • 设置Bean的扫描路径:@ComponentScan
  • 启动Spring MVC框架:@EnableWebMvc
  • 开启事务管理:@EnableTransationManagement

2.ServletConfig

  • 设置为配置类:@Configuration
  • 继承AbstractAnnotationConfigDispatcherServletInitilizer并实现方法
java 复制代码
package Hayaizo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;

@Configuration
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    //拦截请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //配置过滤器,处理中文乱码问题
    protected Filter[] getServletFilters(){
        CharacterEncodingFilter filter=new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}
Controller层
  • Restful控制器:@RestController
  • 浏览器中访问资源路径:@RequestMapping("/books")
  • 自动装配:@Autowired
  • @PostMapping:处理HTTP POST请求的路径映射
    • @RequestParam:获取请求参数的值,不一定要填写参数
    • @PathVariable:获取URL路径中的变量值,一定要写参数
    • @RequestBody:用于接收Post请求体中的数据,可以把前端的json数据转换为对象
    • @RequestParam:用于接收Get请求URL上的参数
java 复制代码
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;

    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag=bookService.save(book);
        return new Result(flag?Code.SAVE_OK:Code.SAVE_ERR,flag);
    }
    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean flag=bookService.update(book);
        return new Result(flag?Code.UPDATE_OK:Code.UPDATE_ERR,flag);
    }
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        boolean flag=bookService.delete(id);
        return new Result(flag?Code.DELETE_OK:Code.DELETE_ERR,flag);
    }
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){
        Book book=bookService.selectById(id);
        Integer code=book!=null?Code.GET_OK:Code.GET_ERR;
        String msg=book!=null? "":"数据查询失败";
        return new Result(code,book,msg);
    }
    @GetMapping
    public Result selectAll() {
        List<Book> book=bookService.selectAll();
        Integer code=book!=null?Code.GET_OK:Code.GET_ERR;
        String msg=book!=null? "":"数据查询失败";
        return new Result(code,book,msg);
    }
}
SpringMvc中的异常处理

常用的注解:@RestControllerAdvice、@ExceptionHandler

@RestControllerAdvice:用于标识当前类为REST风格对应的异常处理器

@ExceptionHandler:标识用于处理哪种异常

java 复制代码
@RestControllerAdvice
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}
相关推荐
Zane19941 分钟前
遍历时删元素为什么报错:modCount 这个"计数器"在背后盯着你
java·后端
编码浪子23 分钟前
Rust 智能指针深度实战:Box/Rc/Arc/RefCell 选型决策与内存管理避坑
开发语言·后端·rust
yichudu34 分钟前
Python 装饰器 decorator
开发语言·python
电商API_1800790524743 分钟前
速卖通商品采集API技术文章
java·开发语言·c++·api·跨境电商·商品详情
一晌小贪欢1 小时前
Python办公14:批量解压文件夹内的所有 ZIP/RAR 并自动分类
开发语言·python·excel·数据可视化·python办公
郑州光合科技余经理1 小时前
海外版外卖系统架构:订单怎么流转、权限怎么分
java·开发语言·前端·系统架构·uni-app·php·ai编程
Python 实战手记1 小时前
企业微信主体变更公证书办理全解析:适用场景、材料规范、踩坑点与Python信息校验脚本
开发语言·python·企业微信
longxiaozhang61 小时前
C#异常处理:程序出错了怎么办?
开发语言·数据库·c#
郝学胜-神的一滴1 小时前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
一木 之林1 小时前
五、C++新特性、关键字与编译原理
java·jvm·算法