本文全面介绍了SSM框架,包括Spring、Spring MVC与MyBatis的整合框架及其架构原理,探讨了SSM框架的优势与应用场景,并详细讲解了各部分的基础知识和整合步骤。
SSM框架是指Spring、Spring MVC与MyBatis的整合框架,是一种经典的后端开发框架组合。Spring是一个全面的企业级应用开发框架,提供了丰富的功能,如依赖注入、事务管理、AOP等。Spring MVC是Spring框架的一部分,专注于Web应用开发,提供了Model-View-Controller模式的支持。MyBatis是一个持久层框架,简化了数据库操作,提供了动态SQL、自定义查询等多种功能。
SSM架构由三部分组成:Spring、Spring MVC和MyBatis。
Spring和MyBatis通过Spring的依赖注入来协调工作,Spring MVC作为Web层的入口,与Spring和MyBatis进行整合,共同构建Web应用。
SSM框架具有以下优势:
应用场景:
Spring是一个开源框架,用于构建企业级Java应用。它提供了一系列的工具类和接口,用于简化企业级开发中的常见任务,如依赖注入、事务管理、AOP等。
Spring的核心是Spring容器,它负责创建、配置和管理Bean。
<bean id="exampleBean" class="com.example.ExampleBean"> <property name="property1" value="propertyValue1"/> <property name="property2" ref="otherBean"/> </bean>
Spring配置文件是XML文件,用于定义Bean及其依赖关系。以下是一个简单的Spring配置文件示例:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="exampleBean" class="com.example.ExampleBean"/> </beans>
依赖注入(DI)是Spring的核心机制之一,它通过容器在运行时自动注入对象的依赖关系。控制反转(IoC)是指对象依赖关系的创建和管理的控制权从应用代码转移到框架,从而解耦应用组件。
public class ExampleBean { private String property1; private OtherBean property2; public void setProperty1(String property1) { this.property1 = property1; } public void setProperty2(OtherBean property2) { this.property2 = property2; } }
public class OtherBean { // Implementation details }
Spring MVC是Spring框架的一部分,用于构建Web应用,实现了Model-View-Controller(MVC)模式。Spring MVC处理Web请求,并将请求分发到Controller,Controller负责处理请求并返回Model数据,再由View生成视图响应给客户端。
Spring MVC的工作流程如下:
Spring MVC的配置主要包括DispatcherServlet的配置和Controller的配置。
<bean class="org.springframework.web.servlet.DispatcherServlet" id="dispatcherServlet"> <property name="contextConfigLocation" value="/WEB-INF/spring/appServlet/servlet-context.xml"/> </bean>
@Controller public class ExampleController { @RequestMapping("/example") public String handleRequest() { return "example"; } }
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 执行预处理逻辑 return true; } }
MyBatis是一个持久层框架,它简化了数据库操作,提供了动态SQL、自定义查询等多种功能。MyBatis通过配置文件或注解方式,将SQL映射到Java对象,实现数据库操作。
MyBatis的工作原理如下:
MyBatis的环境配置主要通过mybatis-config.xml文件实现。
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration>
MyBatis提供了多种标签用于SQL映射。
<mapper namespace="com.example.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
动态SQL可以通过if、choose、when、otherwise等标签实现。
<select id="selectUsers" resultType="com.example.User"> SELECT * FROM users <if test="age != null"> WHERE age = #{age} </if> </select>
<bean class="org.springframework.web.servlet.DispatcherServlet" id="dispatcherServlet"> <property name="contextConfigLocation" value="/WEB-INF/spring/appServlet/servlet-context.xml"/> </bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
<bean id="sqlSessionFactory" class="org.apache.ibatis.session.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="dataSource" ref="dataSource"/> </bean>
public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectUser(int id); }
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean>
搭建SSM项目需要以下步骤:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> </dependencies>
用户登录功能包括用户表的创建、登录接口的实现和视图的渲染。
用户表创建:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(100) );
登录接口实现:
@Controller public class LoginController { @Autowired private UserService userService; @RequestMapping("/login") public String login(String username, String password, Model model) { User user = userService.login(username, password); if (user != null) { return "success"; } else { model.addAttribute("error", "Invalid username or password"); return "login"; } } }
<form action="/login" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username"/><br/> <label for="password">Password:</label> <input type="password" id="password" name="password"/><br/> <input type="submit" value="Login"/> </form>
连接数据库并进行CRUD操作需要以下步骤:
配置数据源:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean>
定义Mapper接口:
public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectUser(int id); @Insert("INSERT INTO users (username, password) VALUES (#{username}, #{password})") void insertUser(User user); @Update("UPDATE users SET username=#{username}, password=#{password} WHERE id=#{id}") void updateUser(User user); @Delete("DELETE FROM users WHERE id=#{id}") void deleteUser(int id); }
实现Service:
@Service public class UserService { @Autowired private UserMapper userMapper; public User selectUser(int id) { return userMapper.selectUser(id); } public void insertUser(User user) { userMapper.insertUser(user); } public void updateUser(User user) { userMapper.updateUser(user); } public void deleteUser(int id) { userMapper.deleteUser(id); } }
编写Controller:
@Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/users") public String listUsers(Model model) { List<User> users = userService.selectAllUsers(); model.addAttribute("users", users); return "users"; } @RequestMapping("/user/{id}") public String showUser(@PathVariable int id, Model model) { User user = userService.selectUser(id); model.addAttribute("user", user); return "user"; } @RequestMapping("/user/new") public String newUserForm() { return "newUser"; } @RequestMapping("/user/save") public String saveUser(User user) { userService.insertUser(user); return "redirect:/users"; } @RequestMapping("/user/edit/{id}") public String editUserForm(@PathVariable int id, Model model) { User user = userService.selectUser(id); model.addAttribute("user", user); return "editUser"; } @RequestMapping("/user/update/{id}") public String updateUser(@PathVariable int id, User user) { userService.updateUser(user); return "redirect:/users"; } @RequestMapping("/user/delete/{id}") public String deleteUser(@PathVariable int id) { userService.deleteUser(id); return "redirect:/users"; } }
通过以上步骤,可以实现SSM框架的完整整合,完成用户登录功能和数据库的CRUD操作。