当前位置: 首页 > news >正文

整合SSM——(SpringMVC+Spring+Mybatis)

  

目录

SSM整合 

创建项目

导入依赖

配置文件

SpringConfig

MyBatisConfig

JdbcConfig

ServletConfig

SpringMvcConfig

功能模块

测试

业务层接口测试

控制层测试


    SSM是Java Web开发中常用的三个主流框架组合的缩写,分别对应SpringSpring MVCMyBatis。这三个框架协同工作,能够完成企业级应用开发中的业务逻辑、Web层交互及数据持久化任务。

  1. Spring:作为SSM的基础框架,主要负责依赖注入(DI)和面向切面编程(AOP)。它简化了Java程序对数据库的访问,提高了数据库的访问效率和稳定性。
  2. Spring MVC:实际上是Spring框架的扩展,属于Spring框架的一部分。它主要负责Web层的交互,使得开发Web应用变得更加简单和高效。
  3. MyBatis:是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,使得开发者可以更加专注于业务逻辑的实现。

SSM整合 

创建项目

    首先新建一个项目,详情请见:SpringMVC概述以及入门案例-CSDN博客,新建项目后再main下方新建test目录用作测试:

     

导入依赖

 ssm整合需要导入一些依赖包,具体如下:

  • spring-webmvc
  • spring-jdbc
  • spring-contest
  • mybatis
  • mybatis-spring
  • mysql-connector-java
  • druid
  • junit
  • javax.servlet-api
  • jackson-databind
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.18</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.20</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.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

配置文件

    接下来在java包下面新建软件包config,用于存放各种配置来,分别是:SpringConfig、MyBatisConfig、JdbcConfig、ServletConfig、SpringMvcConfig。以及resources目录下的db.properities。

SpringConfig

    该配置类的作用是:作为Spring配置文件,扫描指定的包,并且导入加载其他需要的配置文件:

@Configuration
@ComponentScan({"com.cc.service"})
@PropertySource(("db.properties"))  //加载外部属性文件
@Import({JdbcConfig.class, MyBatisConfig.class})  //导入其他配置类
public class SpringConfig {
}
MyBatisConfig

MyBatis的XML方式:

@Configuration
public class MyBatisXmlConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 关键配置:显式指定XML映射文件位置factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 关键配置:要求接口与XML文件关联(默认行为)msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}

 

注解配置方式:

@Configuration
public class MyBatisAnnotationConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 关键配置:启用注解扫描模式msc.setAnnotationClass(Mapper.class);msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {//配置了一个MyBatis的SqlSessionFactory,指定了使用的数据源和类型别名包路径。@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.cc.domain");return factoryBean;}//通过Spring配置了一个MapperScannerConfigurer,指定了需要扫描的Mapper接口所在的包路径。//这样,MyBatis就可以根据这些配置自动地找到并注册Mapper接口@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");return msc;}
}

使用注解方式的关键代码是setAnnotationClass(Mapper.class),但是只要在Mapper接口的方法上使用了@Select等注解,即时未配置也会隐式支持注解

JdbcConfig

配置数据源,并且交给spring容器管理。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;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;@Beanpublic DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}
ServletConfig
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
SpringMvcConfig
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.cc.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

功能模块

首先依据准备的表结构创建对应的POJO类:

public class User {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

接下来就是关于数据库操作的Dao:

public interface UserDao {@Insert("insert into user(name,age) values(#{name},#{age})")public void save(User user);@Update("update user set name=#{name} where id = #{id}")public void update(User user);@Delete("delete from user where id =#{id}")public void delete(Integer id);@Select("select * from user where id =#{id}")public User getById(Integer id);@Select("select * from user")public List<User> getAll();
}

以及Dao对应的Service接口和实现类

public interface UserService {/*** 保存* @param user* @return*/public boolean save(User user);/*** 修改* @param user* @return*/public boolean update(User user);/**\* 根据id删除* @param id* @return*/public boolean delete(Integer id);/*** 根据id查询* @param id* @return*/public User getById(Integer id);/*** 查询所有* @return*/public List<User> getAll();
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean save(User user) {userDao.save(user);return true;}@Overridepublic boolean update(User user) {userDao.update(user);return true;}@Overridepublic boolean delete(Integer id) {userDao.delete(id);return true;}@Overridepublic User getById(Integer id) {return userDao.getById(id);}@Overridepublic List<User> getAll() {return userDao.getAll();}
}

剩下就是REST风格的Controller控制类:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean update(@RequestBody User user) {return userService.update(user);}@DeleteMapping("/{id}")public boolean delete(@PathVariable Integer id) {return userService.delete(id);}@GetMapping("/{id}")public User getById(@PathVariable Integer id) {return userService.getById(id);}@GetMappingpublic List<User> getAll() {return userService.getAll();}
}

测试

   在开发中通常要进行两种测试,分别是业务接口测试,第二个是表现层的接口测试。

业务层接口测试

在test目录下新建测试包:

@RunWith(SpringJUnit4ClassRunner.class)  //使用Spring的测试运行器来运行测试。
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetById(){User user = userService.getById(2);System.out.println(user);}@Testpublic void testGetAll(){List<User> user = userService.getAll();System.out.println(user);}}

能够查询到数据,说明业务层没问题,接下来测试控制层,启动Tomcat:

控制层测试

在postman进行测试:

查询所有:

 

 新增:

相关文章:

  • 蓝桥杯 蜗牛 动态规划
  • 面向对象程序设计(双语)|| 实验六:文件(Java版)
  • FFmpeg+Nginx+VLC打造M3U8直播
  • Win 11 重装 Ubuntu 双系统方法
  • 基于Fabric.js的选座布局系统开发笔记
  • 【Linux】43.网络基础(2.5)
  • FPGA IO引脚 K7-认知4
  • 基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告
  • vmare识别不到共享文件夹,报错:fuse: bad mount point `/mnt/hgfs‘: No such file or directory
  • 2563.统计公平数对的数目 是否顺序无关?
  • 利用 Deepseek 和 Mermaid 画流程图
  • 软件开发指南——GUI 开发方案推荐
  • LeetCode --- 154双周赛
  • 当算力遇上马拉松:一场科技与肉身的极限碰撞
  • JSAPI2.1-DOM基础
  • 【网络技术_域名解析DNS】三、DNS 中间件实践应用与优化策略
  • Linux系统中的网络传输、网络管理以及软件仓库的构建
  • CSS层叠
  • 【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • CasualLanguage Model和Seq2Seq模型的区别
  • 耐克领跑女性运动市场:持续加码、创新,更多新增长点有望涌现
  • 世界读书日丨“好书最美”,国家图书馆举办读书日特别活动
  • 蔚来第三品牌萤火虫上市:对标宝马MINI,预期贡献10%销量
  • “HPV男女共防计划”北半马主题活动新闻发布会在京举办
  • 中国在建结构第一高楼“天津117大厦”将复工,预计2027年完工
  • 王东杰:重审康有为的“大同世界”