文章目录
引言:一个好的项目必须有一个好的框架支持,今天我们来讲一下Java中一个很重要的框架——SSM框架。所谓SSM框架就是Spring+SpringMVC+MyBatis的整合。
1.基本概念
1.1、Spring概念
- Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
- 它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
- 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2、SpringMVC概念
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
1.3、MyBatis概念
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
2.开发步骤
2.1、maven项目创建
maven项目的创建是基础,一个好的maven项目直接决定了项目开发的效率。
- File——>New——>Mave Project
- 选择项目的路径,并Next
- 以下配置,点击Finis
- 完成后pom.xml会有错误,下面方法去除错误
- 配置项目的Tomcat,右键项目->Properties
此时我们的maven项目已经创建好。
2.2、SSM框架的配置
众所周知,Java的后期学习基本上是重配置,轻代码。所以一个好的项目,首先要从配置出发,并且要把配置做好,才能有利于后面的代码编写。
2.2.1 配置前准备工作
- pom.xml导入需要用的jar包或者引入依赖。我采用依赖方式。
<properties>
<project.spring.version>5.2.12.RELEASE</project.spring.version>
<project.slf4j.version>1.7.5</project.slf4j.version>
<project.druid.version>1.2.4</project.druid.version>
<project.lombok.version>1.18.16</project.lombok.version>
<project.mysql.version>8.0.22</project.mysql.version>
<project.mybatis.version>3.5.6</project.mybatis.version>
<project.mybatis-spring.version>2.0.6</project.mybatis-spring.version>
<project.junit.version>4.12</project.junit.version>
<project.json.version>2.12.1</project.json.version>
<project.pageHelper.version>5.1.2</project.pageHelper.version>
</properties>
<dependencies>
<!-- 减少我们写实体类的get,set方法以及构造方法的依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${project.lombok.version}</version>
</dependency>
<!-- 数据源依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${project.druid.version}</version>
</dependency>
<!-- spring-mvc的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${project.spring.version}</version>
</dependency>
<!-- spring的测试依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${project.spring.version}</version>
</dependency>
<!-- orm依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${project.spring.version}</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${project.slf4j.version}</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${project.mysql.version}</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${project.mybatis.version}</version>
</dependency>
<!-- spring依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${project.mybatis-spring.version}</version>
</dependency>
<!-- Junit测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${project.junit.version}</version>
</dependency>
<!-- json数据依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${project.json.version}</version>
</dependency>
<!-- 后期分页依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${project.pageHelper.version}</version>
</dependency>
</dependencies>
- 创建备用文件夹
同样的方法在mybatis文件夹下创建spring-mybatis,这两个文件夹至关重要,千万不能出错
注意mybatis添加namespace的不一样
- 在mybatis文件夹下创建config文件夹,并放入druid.properties文件
druid.properties文件
druid.url=jdbc:mysql://192.168.47.129:3306/ssm_db?useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=true
druid.username=root
druid.password=123
- 在根目录下放日志文件
日志文件
log4j.rootLogger=debug,Console,Logfile
#Console output
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} [%t] %rms (%-5p) [%c] -%l-- {%m}%n
log4j.appender.Logfile=org.apache.log4j.FileAppender
log4j.appender.Logfile.File=D:/logs/mybatis.log
log4j.appender.Logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.Logfile.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} [%t] %rms (%-5p) [%c] -%l-- {%m}%n
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
- 完整的文件目录
2.2.2 开始配置
- 在web.xml配置容器启动
代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>ssm-student</display-name>
<!-- 启动mybatis容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mybatis/spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 启动springmvc容器 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc/springmvc-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
- 配置springmvc-servlet.xml文件
- 前提先把各种包建好
- 配置springmvc-servlet包
- 前提先把各种包建好
<!-- 扫描注解 -->
<context:component-scan
base-package="com.ithouke.ssm.controller"></context:component-scan>
<!-- 资源 -->
<mvc:resources location="static/" mapping="static/**"></mvc:resources>
<!-- 注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
- 配置spring-mybatis.xml文件
- 首先创建映射文件
在根目录下创建mapper文件夹以及映射文件
- 配置spring-mybatis.xml文件
- 首先创建映射文件
<!-- 扫描注解驱动 -->
<context:component-scan
base-package="com.ithouke.ssm">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 读取数据源配置信息 -->
<context:property-placeholder
location="classpath:spring/mybatis/config/druid.properties" />
<!-- 数据源对象 -->
<bean id="druidDataSource"
class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${druid.url}"></property>
<property name="username" value="${druid.username}"></property>
<property name="password" value="${druid.password}"></property>
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property>
<property name="typeAliasesPackage"
value="com.ithouke.ssm.entity"></property>
<property name="mapperLocations"
value="classpath:mapper/*.mapper.xml"></property>
</bean>
<!-- 绑定mybatis的操作接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ithouke.ssm.mapper"></property>
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"></property>
</bean>
<!-- 管理事务方式 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
<!-- 基于注解管理事务 -->
<tx:annotation-driven
transaction-manager="txManager" />
做到这里,基本上的配置已经完成。
2.3、代码编写
这次我们来做一个学生信息管理系统的一个小模块——对学生信息进行增删改查
编写代码之前我们要创建数据库以及表,博主用的是linux里面的数据库,以前的文章里面有写在linux中安装docker,以及在docker安装mysql,感兴趣的可以看一下。
-
创建建数据库(已经创建好一个,不重复创建了)
-
创建Student表
2.3.1 编写实体类
- Student.java
import java.util.Date;
import org.apache.ibatis.type.Alias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Alias("Student") //别名
@Data //get,set方法
@AllArgsConstructor //全参构造方法
@NoArgsConstructor //无参构造方法
public class Student {
private Integer id;
private String name ;
private Integer age;
private Date birth;
}
2.3.2 编写mapper接口
- IStudentMapper.java
import java.util.List;
import com.ithouke.ssm.entity.Student;
public interface IStudentMapper {
void save(Student student);
void delete(int id);
void update(Student student);
List<Student> findAll();
}
2.3.3 编写增删改查语句
- Student.mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 命名空间,指向IStudentMapper-->
<mapper namespace="com.ithouke.ssm.mapper.IStudentMapper">
<!-- 定义映射规则 -->
<resultMap type="Student" id="studentMap">
<id property="id" column="stu_id" />
<result property="name" column="stu_name" />
<result property="age" column="stu_age" />
<result property="birth" column="stu_birth" />
</resultMap>
<!-- 添加SQL语句 -->
<insert id="save">
INSERT INTO student_tab(stu_name,stu_age,stu_birth)
VALUES(#{name},#{age},#{birth})
</insert>
<!-- 删除SQL语句 -->
<delete id="delete">
DELETE FROM student_tab WHERE stu_id = #{id}
</delete>
<!-- 更新SQL语句 -->
<update id="update">
<!-- -->
UPDATE student_tab
<set>
<if test="name != null">
stu_name=#{name},
</if>
<if test="age != null">
stu_age=#{age},
</if>
<if test="birth != null">
car_birth=#{birth},
</if>
</set>
WHERE stu_id = #{id}
<!-- 普通写法 -->
<!-- UPDATE car_tab SET car_brand =#{brand},car_color=#{color},car_price=#{price}
WHERE car_id = #{id} -->
</update>
<!-- 查询SQL语句 -->
<select id="findAll" resultMap="studentMap">
SELECT * FROM student_tab
</select>
</mapper>
此时mybatis的部分已经完成(重点就是接口的编写和xml文件的配置)
2.3.4 编写service层
- 编写接口IStudentService.java
import java.util.List;
import com.ithouke.ssm.entity.Student;
public interface IStudentService {
void addStu(Student student);
void deleteStu(int id);
void updateStu(Student student);
List<Student> findAll();
}
- 编写接口实现类StudentServiceImpl
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ithouke.ssm.entity.Student;
import com.ithouke.ssm.mapper.IStudentMapper;
import com.ithouke.ssm.service.IStudentService;
@Service
@Transactional
public class StudentServiceImpl implements IStudentService {
@Autowired
private IStudentMapper mapper;
@Override
public void addStu(Student student) {
mapper.save(student);
}
@Override
public void deleteStu(int id) {
mapper.delete(id);
}
@Override
public void updateStu(Student student) {
mapper.update(student);
}
@Override
public List<Student> findAll() {
return mapper.findAll();
}
}
2.3.5 编写controller层
- 编写StudentController.java
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ithouke.ssm.dto.HttpResp;
import com.ithouke.ssm.entity.Student;
import com.ithouke.ssm.service.IStudentService;
@Controller
@RequestMapping("/api")
public class StudentController {
@Autowired
private IStudentService iss;
@PostMapping("/addStu")
@ResponseBody
public HttpResp addStu(Student student) {
iss.addStu(student);
return new HttpResp(20001, "学生信息添加成功", null, new Date());
}
@DeleteMapping("/deleteStu")
@ResponseBody
public HttpResp deleteStu(int id) {
iss.deleteStu(id);
return new HttpResp(20002, "学生信息删除成功", null, new Date());
}
@PutMapping("/updateStu")
@ResponseBody
public HttpResp updateStu(Student student) {
iss.updateStu(student);
return new HttpResp(20003, "学生信息修改成功", null, new Date());
}
@GetMapping("/findAllStu")
@ResponseBody
public HttpResp findAllStu() {
List<Student> list = iss.findAll();
return new HttpResp(20004, "学生信息查询成功", list, new Date());
}
}
2.4、测试代码
博主用的是postman进行测试后端。
2.4.1 测试添加数据
-
启动Tomcat(第一次启动后,后续不再启动)
-
postman中输入地址,以及数据
-
查看返回数据
-
后端控制台查看日志
-
数据库中查看记录
2.4.2 测试删除数据
-
postman中输入地址,以及数据
-
查看返回数据
-
后端控制台查看日志
-
数据库中查看记录
2.4.1 测试修改数据
-
postman中输入地址,以及数据
-
查看返回数据
-
后端控制台查看日志
-
数据库中查看记录
2.4.1 测试查询数据
-
postman中输入地址,以及数据
-
查看返回数据
-
后端控制台查看日志
-
数据库中查看记录
到此时,我们的SSM框架基本成功,项目还不完善,之后博主会在进行完善前端部分以及后续的项目。文章中有任何问题,请在评论区进行留言,博主会一一解答。码字不易,请一键三连哟
关于文章中的注解,之后会有一个详细的文章进行介绍。欢迎阅读