栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SSM8==纯注解SSM项目:实现单表CRUD、事务、自定义异常和统一异常处理、RESTFUL风格接口、统一返回值格式(状态码、内容、消息)、JSON传参、axios、vue.js、elementUI

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SSM8==纯注解SSM项目:实现单表CRUD、事务、自定义异常和统一异常处理、RESTFUL风格接口、统一返回值格式(状态码、内容、消息)、JSON传参、axios、vue.js、elementUI

环境:IDEA2021+JDK8+MAVEN3.8+TOMCAT7插件

前端:axios、vue.js、elementUI

后端:见POM.XML相关依赖,主要有数据库MySQL5.7 ,数据源Druid,持久层狂框架mybatis,mybatis-spring、spring核心容器、spring事务、spring MVC、测试junit和spring-test

web服务器:tomcat7插件

======================================================================

重点:

        前后端分离如何约定联调的协议?:其实就是约定好,什么操作传什么格式的结果给对方,我这根据约定传了个约定好的对象,对象中包含自定义的状态码、数据、简短的描述信息。

        项目统一异常处理的用处?利用@RestControllerAdvice和@ExceptionHandler(自定义异常名.class)告知spring容器,IOC容器中涉及的所有bean有关的异常都给我抛到被@RestControllerAdvice注解的类里面来,我写好了@ExceptionHandler注解的方法会去集中处理,并在该类中返回一个信息给前端,该信息同样遵守联调协议。那么不管我这程序怎么运行,前端始终都能看到经过我包装后的易懂的信息,而不是什么NoSuchXXX搭配一堆英文。而且这个类还能接到我们自定义的异常类型。

        还有config包中的6个配置类,注解简化了开发,但是简化了可读性,本来用XML配置能够一目了然的,简化成注解之后去哪找下一个类都不知道了。

//用AbstractAnnotationConfigDispatcherServletInitializer代替web.xml配置,tomcat启动时会首先调动该类,

@configration标注的就是主配置类,@EnableXXX代表通过这个配置类对应的IOC容器开放了什么功能,能做什么。过滤器、拦截器由MVC IOC容器管理。

 =======================================================================

效果:

 

========================================================================

接口设计:

访问地址:http://localhost/pages/books.html
模糊查询 GET http://localhost/books/getLike/凡人

其他:见BookController类

项目结构:

===================================================

建表


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tbl_book
-- ----------------------------
DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tbl_book
-- ----------------------------
INSERT INTO `tbl_book` VALUES ('2', '77', '77李世明999', '999');
INSERT INTO `tbl_book` VALUES ('3', '四川', '科学养猪', '养猪');
INSERT INTO `tbl_book` VALUES ('4', '成都', '凡人修仙传', '修仙');
INSERT INTO `tbl_book` VALUES ('5', '北京', '神墓', '传奇');
INSERT INTO `tbl_book` VALUES ('6', '科学', '天龙八部', '填了');
INSERT INTO `tbl_book` VALUES ('9', '1', '1', '1');
INSERT INTO `tbl_book` VALUES ('11', '2', '88凡人77', '9');

 pom.xml




    4.0.0

    com.ldj
    springmvc_11_page
    1.0-SNAPSHOT
    war

    
        
        
            mysql
            mysql-connector-java
            5.1.47
        
        
        
            com.alibaba
            druid
            1.1.16
        
        
        
            org.mybatis
            mybatis
            3.5.6
        
        
        
            org.mybatis
            mybatis-spring
            1.3.0
        

        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        
        
            org.springframework
            spring-webmvc
            5.2.10.RELEASE
        
        
        
            org.springframework
            spring-jdbc
            5.2.10.RELEASE
        
        
        
            com.fasterxml.jackson.core
            jackson-databind
            2.9.0
        
        
        
            junit
            junit
            4.12
            test
        
        
            org.springframework
            spring-test
            5.2.10.RELEASE
        
    

    
        
            
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.1
                
                    80
                    /
                
            
        
    


JdbcConfig
package com.ldj.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

//SpringConfig配置类的一部分,作用是配置数据源,并配置依赖于JDBC的事务管理器
public class JdbcConfig {
    @Value("${jdbc.driver}")    //@Value("${key}")从SpringConfig类上注解PropertySource对应的文件根据key读取value
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    //    事务2、配置事务管理器PlatformTransactionManager
    //1.事务三大接口
    //PlatformTransactionManager 事务管理器
    //TransactionDefinition 事务的一些基础信息,如超时时间、隔离级别、传播属性等
    //TransactionStatus 事务的一些状态信息,如是否一个新的事务、是否已被标记为回滚
    @Bean
    //IOC容器再生成bean之前会先确认参数对应的bean是否已经生成了,没生成就先去生成参数对应的bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        DataSourceTransactionManager ds = new DataSourceTransactionManager();
        ds.setDataSource(dataSource);
        return ds;
    }
}

MyBatisConfig
package com.ldj.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

//SpringConfig配置类的一部分,作用是配置mybatis,并指定ORM中的M O R
public class MyBatisConfig {

    //配置数据源中字段对应的O
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.ldj.domain");
        return factoryBean;
    }

    //配置O和M之间的R
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setbasePackage("com.ldj.dao");
        return msc;
    }

}
SpringConfig
package com.ldj.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration  //表名这是一个IOC容器的配置类
@ComponentScan({"com.ldj.service"}) //只扫描service中定义的bean,因为其他的的已经在JdbcConfig和MyBatisConfig中指定了
@PropertySource("classpath:jdbc.properties")    //指定数据源信息存放的文件地址
@import({JdbcConfig.class, MyBatisConfig.class})    //指向子配置类,子配置类的所有东西都属于SpringConfig
@EnableTransactionManagement        //事务1开启注解式事务
public class SpringConfig {
}
SpringMvcConfig
package com.ldj.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration   //表明这是一个IOC容器的配置类
@ComponentScan({"com.ldj.controller", "com.ldj.config"})  //扫描controller中定义的bean?"com.ldj.config"
@EnableWebMvc   //!!!

public class SpringMvcConfig {
}
SpringMvcSupport
package com.ldj.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

//MVC容器的另一个配置类,不写在SpringMvcConfig中是为了解耦。


//WebMvcConfigurationSupport可以再此类中配置过滤器(静态资源)和拦截器(controller类中的方法)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //    过滤器 指定静态资源的存放路径
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages
//    @Override
//    public void addCorsMappings(CorsRegistry registry) {
//        registry.addMapping("
    public boolean save(Book book);

    
    public boolean update(Book book);

    
    public boolean delete(Integer id);

    
    public Book getById(Integer id);

    
    public List getAll();

    List getByName(String bookName);
}
BookServiceImpl
package com.ldj.service.impl;

import com.ldj.controller.Code;
import com.ldj.dao.BookDao;
import com.ldj.domain.Book;
import com.ldj.exception.BusinessException;
import com.ldj.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

    public boolean save(Book book) {
        return bookDao.save(book) > 0;
    }

    public boolean update(Book book) {
        return bookDao.update(book) > 0;
    }

    public boolean delete(Integer id) {
        return bookDao.delete(id) > 0;
    }

    public Book getById(Integer id) {
        if (id == 1) {
            System.out.println("id=1不能编辑");
            throw new BusinessException(Code.BUSINESS_ERR, "请不要使用你的技术挑战我的耐性!");
        }
//        //将可能出现的异常进行包装,转换成自定义异常
//        try{
//            int i = 1/0;
//        }catch (Exception e){
//            throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
//        }
        return bookDao.getById(id);
    }

    public List getAll() {
        return bookDao.getAll();
    }

    public List getByName(String bookName) {
        bookName = "%" + bookName + "%";
        return bookDao.getByName(bookName);
    }
}

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=1234

books.html







    

    

    

    单表CRUD

    

    

    

    

    







    

        图书管理

    

    

        

            

                

                查询

                新建

            

            

                

                

                

                

                

                    

                

            

            

            

                

                    

                        

                            

                                

                                    

                                

                            

                            

                                

                                    

                                

                            

                        


                        

                            

                                

                                    

                                

                            

                        

                    

                    

                        取消

                        确定

                    

                

            

            

            

                

                    

                        

                            

                                

                                    

                                

                            

                            

                                

                                    

                                

                            

                        

                        

                            

                                

                                    

                                

                            

                        

                    

                    

                        取消

                        确定

                    

                

            

        

    

















前端代码过长只贴了页面。而且前后端是通过JSON交互,只需要使用POSTMAN直接测试controller接口即可验证成功,然后上elementUI官网拷贝一个表格改改就行了。获知直接利用axios发送请求consle.log一下即可。

=====================================================================

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462222.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号