Spring中SSM的简单项目构建

目录

1.第一步:构建一个maven工程。

2.第二步:将maven工程添加Web工程

3.第三步:导包

4. 构建项目结构

 5.在resources下编写数据库配置文件jdbc.properties

6.编写jdbc读取配置文件类jdbcConfig

6.第六步:mybatis整合spring的配置类:mybatisConfig

7.编写Spring父容器SpringConfig

8.编写SpringMVC子容器SpringMvcConfig

9.编写DispatcherServlet,拦截所有请求,并整合父容器和子容器。

10.如果有前端代码,需要将前端相关资源放行,需要编写SpringMvcSupport类,放行相关资源

11.编写三个实体类,Book:书籍信息实体,Code:与前端约定的状态码,Result:封装结果集返回给前端的JSON对象,如果没有前端,后面两个类可以不用写。


1.第一步:构建一个maven工程。

2.第二步:将maven工程添加Web工程

        这里我们可以用一个小的插件,

         就可以轻松通过右键,选项里面的将maven工程轻松添加web工程了。

3.第三步:导包

 <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <spring.version>5.2.10.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>//统一包的版本
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.22</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>

4. 构建项目结构

 5.在resources下编写数据库配置文件jdbc.properties

这是mysql版本是8.0的情况,5.0配置有一点点不一样。

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=root

6.编写jdbc读取配置文件类jdbcConfig

/**
 * 数据库配置类
 */
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {

    //注入简单类型,从属性文件中读取
    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

    /*
     创建数据源,放在容器中
     */
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }

    /**
     * 创建事务管理器
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

6.第六步:mybatis整合spring的配置类:mybatisConfig

/**
 * mybatis整合spring的配置类
 * 1.创建会话工厂对象
 * 2.生成dao包下所有接口的代理对象
 */
public class MybatisConfig {

    /**
     * 创建会话工厂对象
     * 数据源从容器中按类型匹配的方式传入
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        //设置数据源
        factoryBean.setDataSource(dataSource);
        //定义实体类别名所在的包
        factoryBean.setTypeAliasesPackage("com.itheima.domain");

        //创建一个mybatis的配置类,注:不要导错包
        Configuration configuration = new Configuration();
        //映射下划线为驼峰命名法
        configuration.setMapUnderscoreToCamelCase(true);
        //显示sql语句
        configuration.setLogImpl(StdOutImpl.class);
        //设置到工厂中
        factoryBean.setConfiguration(configuration);

        return factoryBean;
    }

    /**
     * 生成dao包下所有接口的代理对象
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        //指定dao接口所在包
        configurer.setBasePackage("com.itheima.dao");
        return configurer;
    }
}

7.编写Spring父容器SpringConfig

@Configuration//将此类设置为配置类
@ComponentScan("com.itheima.service")  //只扫描业务层
@Import({JdbcConfig.class, MybatisConfig.class})  //导入其它的配置类
@EnableTransactionManagement  //开启事务
public class SpringConfig {
}

8.编写SpringMVC子容器SpringMvcConfig

@ComponentScan({"com.itheima.controller","com.itheima.config","com.itheima.exception"})
@EnableWebMvc//此注解的作用是,开启对JSON对象的支持
public class SpringMvcConfig {
}

9.编写DispatcherServlet,拦截所有请求,并整合父容器和子容器。


/**
 * tomcat启动的时候加载的类,创建DispatcherServlet,拦截所有的请求
 */
public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    //读取Spring的配置类,创建父容器
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SpringConfig.class};
    }

    //读取SpringMvc的配置类,创建子容器
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    //拦截所有的地址
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //post请求汉字乱码
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {new CharacterEncodingFilter("utf-8")};
    }
}

10.如果有前端代码,需要将前端相关资源放行,需要编写SpringMvcSupport类,放行相关资源

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {

    /**
     静态资源放行
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //地址是/css目录,访问/css/下面资源
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

做好以上这些配置后,就可以编写下面的:控制器,实体类,业务层,异常拦截相关类了

11.编写三个实体类,Book:书籍信息实体,Code:与前端约定的状态码,Result:封装结果集返回给前端的JSON对象,如果没有前端,后面两个类可以不用写。

Book类:导入小辣椒后,@Data就是生成相应的get,set以及构造器。这样使用注解,可以让代码编写方便,看着清爽,可读性更好。

@Data
public class Book {
    private Integer id;
    private String type;  //书籍类型
    private String name;  //书名
    private String description;  //描述
}

Code类:具体来说是一个接口,接口里面定义的变量都为静态变量,调用起来不用创建对象,使用方便。这个状态码只是用来与前端约定的。

public interface Code {
    Integer SAVE_OK = 20011;
    Integer DELETE_OK = 20021;
    Integer UPDATE_OK = 20031;
    Integer GET_OK = 20041;

    Integer SAVE_ERR = 20010;
    Integer DELETE_ERR = 20020;
    Integer UPDATE_ERR = 20030;
    Integer GET_ERR = 20040;

    //异常编码
    Integer SYSTEM_ERR = 50001;
    Integer SYSTEM_TIMEOUT_ERR = 50002;
    Integer SYSTEM_UNKNOWN_ERR = 59999;
    Integer BUSINESS_ERR = 60002;
}

Result类:封装结果集,返回给前端用的。

/**
 * 封装结果对象
 */
@Data
public class Result {

    private Integer code; //操作编码
    private Object data;  //返回数据
    private String msg;  //返回的信息

    public Result() {
    }

    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Result(Object data, String msg) {
        this.data = data;
        this.msg = msg;
    }

    public Result(Integer code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }
}

12.编写dao层,实现因为使用纯注解模式开发,使用只需要编写dao层接口即可。在方法上编写SQL语句:

/**
 * 数据层
 */
public interface BookDao {

    /**
     * 查询所有的书籍
     */
    @Select("select * from tbl_book")
    List<Book> findAll();

    /**
     * 添加书籍
     */
    @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
    int save(Book book);

    /**
     * 修改
     */
    @Update("update tbl_book set type=#{type},name=#{name},description=#{description} where id=#{id}")
    int update(Book book);

    /**
     * 删除
     */
    @Delete("delete from tbl_book where id=#{id}")
    int delete(Integer id);

    /**
     * 通过id查询1本书
     */
    @Select("select * from tbl_book where id=#{id}")
    Book findById(Integer id);
}

13.然后编写其service层的接口和实现类

/**
 * 业务层
 */
public interface BookService {

    /**
     * 查询所有书籍
     */
    List<Book> findAll();

    /**
     * 添加书籍
     * @param book
     * @return
     */
    boolean save(Book book);

    /**
     * 修改书籍
     */
    boolean update(Book book);

    /**
     * 删除书籍
     * @param id
     * @return
     */
    boolean delete(Integer id);


    /**
     * 通过id查询一本书籍
     * @param id
     * @return
     */
    Book findById(Integer id);
}

实现类:

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;

    /**
     * 查询所有书籍
     */
    @Override
    public List<Book> findAll() {
        return bookDao.findAll();
    }

    /**
     * 添加书籍
     * @param book
     * @return
     */
    @Override
    public boolean save(Book book) {
        //大于0则表示添加成功
        return bookDao.save(book) > 0;
    }

    /**
     * 修改书籍
     * @param book
     */
    @Override
    public boolean update(Book book) {
        return bookDao.update(book) > 0;
    }

    /**
     * 删除书籍
     * @param id
     * @return
     */
    @Override
    public boolean delete(Integer id) {
        return bookDao.delete(id) > 0;
    }

    @Override
    public Book findById(Integer id) {
        if (id < 1) {
            throw new BusinessException(Code.BUSINESS_ERR, "请不要使用你的技术挑战我的耐性");
        }
        return bookDao.findById(id);
    }
}

13.完成上面步骤后,就可以编写控制层了(与前端交互)。

@RestController
@RequestMapping("books")
public class BookController {

    @Autowired
    private BookService bookService;

    //查询
    @GetMapping
    public Result find() {
        System.out.println("查询书籍");
        //System.out.println(1 / 0);
        List<Book> books = bookService.findAll();
        if (books == null) {
            return new Result(Code.GET_ERR, "查询失败");
        } else {
            return new Result(Code.GET_OK, books, "查询成功");
        }
    }

    //添加
    @PostMapping
    public Result save(@RequestBody Book book) {
        boolean success = bookService.save(book);
        String msg = success ? "添加成功" : "添加失败";
        Integer code = success ? Code.SAVE_OK : Code.SAVE_ERR;
        return new Result(code, success, msg);
    }

    //修改
    @PutMapping
    public Result update(@RequestBody Book book) {
        boolean success = bookService.update(book);
        String msg = success ? "修改成功" : "修改失败";
        Integer code = success ? Code.UPDATE_OK : Code.UPDATE_ERR;
        return new Result(code, success, msg);
    }

    //删除
    @DeleteMapping("{id}")
    public Result delete(@PathVariable Integer id) {
        boolean success = bookService.delete(id);
        String msg = success ? "删除成功" : "删除失败";
        Integer code = success ? Code.DELETE_OK : Code.DELETE_ERR;
        return new Result(code, success, msg);
    }

    //通过id查询1本书
    @GetMapping("{id}")
    public Result findById(@PathVariable Integer id) {
        Book book = bookService.findById(id);
        String msg = book != null ? "查询成功" : "查询失败";
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        return new Result(code, book, msg);
    }
}

14.前端代码:不做要求,可以拷贝在day35资料里面。不需要学习前端的,可以使用postmen测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值