SSM(spring+springmvc+mybatis)完全注解开发整合

news2024/11/24 20:05:04

SSM(spring+springmvc+mybatis)完全注解开发整合
目录结构如图:
在这里插入图片描述

创建数据库

create database mydb;
use mydb;
create table tbl_users(
    id int primary  key auto_increment,
    username varchar(20),
    password varchar(20),
    age int,
    birthday date
);

insert tbl_users(username,password,age,birthday)values
        ("张三","123456",11,'2022-09-09'),
        ("李四","123456",12,'2022-09-10'),
        ("王五","123456",13,'2022-09-12'),
        ("赵六","123456",14,'2022-09-14')

持久类Users编写

package com.qwy.bean;

import java.util.Date;

public class Users {
    private Integer id;
    private String username;
    private String password;
    private int age;
    private Date birthday;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

Spring的配置类SpringConfig

package com.qwy.config;

import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration//标注该类为一个配置类,这里配置Spring的信息
@ComponentScan(value = {"com.qwy"},excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
))//配置Spring管理的bean所要扫描的包,需要将@Controller注解排除在外
@PropertySource({"classpath:db.properties"})//加载数据库的配置属性文件
@Import({JdbcConfig.class,MyBatisConfig.class})//加载数据源和mybatis的配置
@EnableTransactionManagement//开启注解的事务管理
public class SpringConfig {
}

SpringMVC的配置类SpringMvcConfig

package com.qwy.config;

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

@Configuration//标注该类为一个配置类,此类为SpringMVC的配置信息
@ComponentScan({"com.qwy.controller","com.qwy.exception"})
@EnableWebMvc//该注解可以自动开启JSON的自动转换
public class SpringMvcConfig {
}

WEB容器初始化类ServletContainerConfig

package com.qwy.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;

/**
 * 配置注解式的WEB容器(web.xml)
 */
public class ServletContainerConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * 加载Spring的配置
     * @return
     */
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    /**
     * 加载SpringMVC的配置
     * */
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
   /*
   * 配置SpringMVC核心处理的拦截路径
   * */
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    /**
     * 配置Post请求乱码处理的过滤器
     * */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter= new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[]{characterEncodingFilter};
    }
}

数据库属性配置文件db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC
jdbc.username=root
jdbc.password=admin

数据源配置类JdbcConfig

package com.qwy.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;

/**
 * 配置数据源
 * 这里使用阿里的数据源
 */
public class JdbcConfig {
    @Value("${jdbc.driver}")
    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;
    }

    /**
     * 平台事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager transactionManager= new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return  transactionManager;
    }
}

Mybatis配置类MybatisConfig

package com.qwy.config;

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

import javax.sql.DataSource;

public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean= new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.qwy.bean");
        return  sqlSessionFactoryBean;
    }
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer= new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.qwy.dao");
        return  mapperScannerConfigurer;
    }
}

持久化类UsersMapper

package com.qwy.dao;

import com.qwy.bean.Users;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UsersMapper {
    /**
     * 添加
     * @param users
     * @return
     */
    @Insert("insert into tbl_users(username,password,age,birthday)values(#{username},#{password},#{age},#{birthday})")
    int save(Users users);

    /**
     * 根据id删除
     * @param id
     * @return
     */
    @Delete("delete from tbl_users where id=#{id}")
    int delete(Integer id);

    /**
     * 根据id修改
     * @param users
     * @return
     */
    @Update("update tbl_users set username=#{username},password=#{password},age=#{age},birthday=#{birthday} where id =#{id}")
    int update(Users users);

    /**
     * 根据id查询
     * @param id
     * @return 返回单个用户
     */
    @Select("select * from tbl_users where id=#{id}")
    Users findById(Integer id);

    /**
     * 查询全部结果
     * @return
     */
    @Select("select * from tbl_users")
    List<Users> findAll();

}

业务接口

package com.qwy.service;

import com.qwy.bean.Users;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional//开启事务
public interface UsersService {
    /**
     * 添加
     * @param users
     * @return
     */
    boolean save(Users users);

    /**
     * 根据id删除
     * @param id
     * @return
     */
    boolean delete(Integer id);

    /**
     * 根据id修改
     * @param users
     * @return
     */
    boolean update(Users users);

    /**
     * 获取单个用户
     * @param id
     * @return
     */
    Users findById(Integer id);

    /**
     * 获取全部
     * @return
     */
    List<Users> findAll();

}

业务接口实现类

package com.qwy.service.impl;

import com.qwy.bean.Users;
import com.qwy.dao.UsersMapper;
import com.qwy.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class UsersServiceImpl implements UsersService {
    @Autowired
    private UsersMapper usersMapper;
    public boolean save(Users users) {
        int i=9/0;
        return usersMapper.save(users)>0?true:false;
    }

    public boolean delete(Integer id) {
        return usersMapper.delete(id)>0?true:false;
    }

    public boolean update(Users users) {
        return usersMapper.update(users)>0?true:false;
    }

    public Users findById(Integer id) {
        return usersMapper.findById(id);
    }

    public List<Users> findAll() {
        return usersMapper.findAll();
    }
}

自定义状态码类Code

package com.qwy.controller;

/**
 * 该类用来定义状态码
 */
public class Code {
    public static  final  Integer SAVE_OK=20021;
    public static  final  Integer DELETE_OK=20022;
    public static  final  Integer UPDATE_OK=20023;
    public static  final  Integer SELECT_OK=20024;

    public static  final  Integer SAVE_ERR=20011;
    public static  final  Integer DELETE_ERR=20012;
    public static  final  Integer UPDATE_ERR=20013;
    public static  final  Integer SELECT_ERR=20014;

    public static  final  Integer SYSTEM_ERR=20031;
    public static  final  Integer BUSINESS_ERR=20032;
}

自定义Controller返回结果类DataResult

package com.qwy.controller;

/**
 * 该类用来封装Controller返回json的数据
 */
public class DataResult {
    private Integer code;//封装状态码
    private Object data;//封装真实的数据,这里必须为Object类型
    private String message;//用来封装提示信息或异常信息等

    public DataResult() {
    }

    public DataResult(Integer code, Object data) {
        this.code = code;
        this.data = data;
    }

    public DataResult(Integer code, Object data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

自定义业务异常处理类BusinessException

package com.qwy.exception;

import org.springframework.stereotype.Component;

/**
 * 定义业务异常处理类
 */

public class BusinessException extends RuntimeException {
    private Integer code;

    public BusinessException(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code=code;
    }

    public BusinessException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code=code;
    }
}

自定义系统异常处理类SystemException

package com.qwy.exception;

import org.springframework.stereotype.Component;

/**
 * 定义系统异常处理类
 */

public class SystemException extends RuntimeException {
    private Integer code;

    public SystemException( Integer code) {

        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code=code;
    }

    public SystemException(Integer code,String message, Throwable cause) {
        super(message, cause);
        this.code=code;
    }
}

异常统一处理类ExceptionResultAdvice

package com.qwy.exception;

import com.qwy.controller.Code;
import com.qwy.controller.DataResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice//该注解表明该类为异常处理类
public class ExceptionResultAdvice {
    @ExceptionHandler({SystemException.class})
    public DataResult doSystemException(SystemException sx){
        return  new DataResult(Code.SYSTEM_ERR,null,sx.getMessage());
    }
    @ExceptionHandler({BusinessException.class})
    public DataResult doBusinessException(BusinessException bx){
        return  new DataResult(Code.SYSTEM_ERR,null,bx.getMessage());
    }
    @ExceptionHandler({Exception.class})
    public DataResult doException(Exception e){
        return  new DataResult(Code.SYSTEM_ERR,null,e.getMessage());
    }
}

业务控制器处理类

package com.qwy.controller;

import com.qwy.bean.Users;
import com.qwy.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UsersController {
    @Autowired
    private UsersService usersService;
    @PostMapping
    public DataResult save(@RequestBody Users users){
        boolean save = usersService.save(users);
        return new DataResult(save?Code.SAVE_OK:Code.SAVE_ERR,save);
    }
    @DeleteMapping("/{id}")
    public DataResult delete(@PathVariable("id") Integer id){
        boolean delete = usersService.delete(id);
        return new DataResult(delete?Code.DELETE_OK:Code.DELETE_ERR,delete);
    }
    @PutMapping
    public DataResult update(@RequestBody Users users){
        boolean update = usersService.update(users);
        return  new DataResult(update?Code.UPDATE_OK:Code.UPDATE_ERR,update);
    }
    @GetMapping("/{id}")
    public DataResult findById(@PathVariable("id") Integer id){
        Users users = usersService.findById(id);
        Integer code = users != null ? Code.SELECT_OK : Code.SELECT_ERR;
        String message = users != null ? "" : "查询失败,请重新查询";
        return  new DataResult(code,users,message);
    }
    @GetMapping
    public DataResult findById(){
        List<Users> usersList = usersService.findAll();

        Integer code = usersList != null ? Code.SELECT_OK : Code.SELECT_ERR;
        String message = usersList != null ? "" : "查询失败,请重新查询";
        return  new DataResult(code,usersList,message);
    }
}

测试添加操作

在这里插入图片描述

修改操作

在这里插入图片描述

删除操作

在这里插入图片描述

查询单个用户

在这里插入图片描述

查询全部测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Cortex-M3]-4-如何在内嵌RAM中运行程序

[Cortex-M3]-1-启动流程-启动文件[Cortex-M3]-2-map文件解析[Cortex-M3]-3-分散加载文件解析&#xff08;.sct&#xff09;[Cortex-M3]-4-如何在内嵌RAM中运行程序 1 定义items 在进行项目开发时&#xff0c;可以在project items中创建debug和release,并确定。 平时调试下拉选…

web结课作业的源码——HTML+CSS+JavaScript仿oppo官网手机商城(1页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

15、简单了解Vue

1、vue概述 Vue是一套前端框架&#xff0c;可以免除原生JavaScript中的DOM操作&#xff0c;简化书写。 基于MVVM&#xff08;Model-View-View Model&#xff09;思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上 vue的官网&#xff1a;https://cn.v…

电脑数据转移到新电脑?换新电脑如何转移软件

电脑数据转移到新电脑&#xff1f;许多用户在下载游戏的时候&#xff0c;没有更改默认安装位置&#xff0c;直接把游戏安装到了C盘里&#xff0c;结果导致C盘空间不足&#xff0c;于是希望将游戏移动到其他驱动器以释放空间。也有的用户是更换了电脑&#xff0c;不想重新安装游…

常用数据库之sqlite的使用

2.1 介绍 sqlite为关系型数据库&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&#xff0c;在嵌…

反序列化__wakeup

简介 __wakeup()&#xff0c;执行unserialize()时&#xff0c;先会调用这个函数。 <?php class c1 {private $argv;private $method;function __construct($argv,$method){$this->argv$argv;$this->method$method;}public function f1(){ech…

BUG系列路径规划算法原理介绍(六)——BugFlood算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

KubeSphere开启DevOps 功能教程

基于 Jenkins 的 KubeSphere DevOps 系统是专为 Kubernetes 中的 CI/CD 工作流设计的&#xff0c;它提供了一站式的解决方案&#xff0c;帮助开发和运维团队用非常简单的方式构建、测试和发布应用到 Kubernetes。它还具有插件管理、Binary-to-Image (B2I)、Source-to-Image (S2…

MySQL遵循最左前缀匹配原则!面试官:回去等通知吧

我们都知道&#xff0c;MySQL的Innodb引擎中&#xff0c;索引是通过B树来实现的。不管是普通索引还是联合索引&#xff0c;都需要构造一个B树的索引结构。 那么&#xff0c;我们都知道普通索引的存储结构中在B树的每个非节点上记录的索引的值&#xff0c;而这棵B树的叶子节点上…

Markdown官方教程(六)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Spring Boot 创建项目 / 目录介绍 / 配置文件

目录 Spring Boot项目创建 一、通过IDEA来创建Spring Boot项目 二、通过网页版创建Spring Boot项目 Spring Boot项目目录介绍 Spring Boot项目创建 一、通过IDEA来创建Spring Boot项目 社区版IDEA需要先安装 Spring Assistant 插件。 1. 创建新项目&#xff0c;选择Sprin…

2022最后一个月,我们该如何学Java​?

2022最后一个月&#xff0c;我们该如何学Java&#xff1f; 互联网的快速发展和激烈竞争&#xff0c;在世界编程语言排行榜中&#xff0c;Java位列前三&#xff0c;占全球编程市场份额的12%左右,各大公司对Java工程师的需求量都很大&#xff0c;要求也越来越高&#xff0c;优秀…

Gradle学习第一篇——自定义Gradle插件

纸上得来终觉浅&#xff0c;绝知此事要躬行。 自定义Gradle插件有三种方法&#xff0c;各有优劣处&#xff0c;同类博客文章很多但是有的语法已经过时了&#xff0c;笔者运行环境 Android Studio Dolphin && gradle-7.4-bin 文章目录第一种 build script (单文件生效)第…

Linux目录操作

一、常用权限操作 权限操作实战 1、创建文件&#xff0c;设置其用户组 root用户创建新文件love.txt 命令&#xff1a;echo I Love you > love.txt 查看文件love.txt的用户及用户组 将其用户组改为lzy用户组 命令&#xff1a;chgrp lzy love.txt 查看文件love.txt的用…

System Verilog断言

简介 断言通常被称为序列监视器或者序列检验器&#xff0c;是对设计应当如何执行特定行为的描述&#xff0c;是一种嵌入设计检查。如果检查的属性&#xff08;property&#xff09;不是我们期望的表现&#xff0c;那么在我们期望事件序列的故障上会产生警告或者错误提示。 断言…

SpringMVC:整合SSM框架

一、大致框架 1.建立数据库&#xff0c;并导入数据 create database cjgl; create table books( bookID int(10) not null auto_increment comment 书id, bookName varchar(100) not null comment 书名, bookCounts int(11) not null comment 数量, detail varchar(200) no…

C. Planar Reflections

题目如下&#xff1a; 思路 or 题解 我们可以通过图解发现&#xff1a;可以递推找到答案了 我们约定&#xff1a;dp[i][j]dp[i][j]dp[i][j] 第 iii 个板, 衰变年龄为jjj 的答案是 dp[i][j]dp[i][j]dp[i][j] 我们通过图解找到转移方程&#xff1a; dp[i][j]dp[i−1][j]dp[n−i]…

[附源码]Python计算机毕业设计Django时间管理软件app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数据结构【红黑树模拟实现】

目录 红黑树&#xff1a;基于AVL树改进 红黑树的性质 红黑树基本结构 insert基本结构 新增节点的默认颜色为红色 节点性质总结 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红 情况二: cur为红&#xff0c;p为红&#xff0c;g为黑&#xf…

基于web的电子图书管理系统

目  录 中文摘要&#xff08;关键词&#xff09; 1 英文摘要&#xff08;关键词&#xff09; 1 前 言 2 1概述 3 1.1系统研究背景 3 1.2系统研究意义 3 2 需求分析 4 2.1可行性分析 4 2.2功能需求分析 4 2.3非功能需求分析 5 3系统分析 6 3.1系统业务流程分析 6 3.2系统数据…