SSM
一、初识SSM
1、SSM框架
- SSM是由
Spring
+SpringMVC
+Mybatis
1.1、Spring是一个轻量级的服务框架,两大重要部件:
- IOC(控制反转)
- AOP(切面编程)
IOC的控制反转主要是自动注入
- set方法注入
- constructor构造器注入
AOP的切面编程简单来说就是使用代理(即中间商)
spring
官网: https://spring.io/
1.2、Mybatis是数据化持久层
- 它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 - 中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html
1.3、SpringMVC是处理接口请求
-
Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制
-
简单项目整合开始!
二、Mybatis
1、先导入jar包
- 重中之重
- 先导入依赖
- junit、数据库驱动、连接池、servlet、jsp、Mybatis、Mybatis-spring、spring 等
pom.xml
<!-- junit、数据库驱动、连接池、servlet、jsp、Mybatis、Mybatis-spring、spring-->
<dependencies>
<!-- junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>${junit.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-webmvc.version}</version>
</dependency>
<!-- lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
2、创建数据库、表
-- auto-generated definition
create table ssm_users
(
id varchar(50) not null
primary key,
name varchar(50) not null comment '姓名',
age int null comment '年龄',
sex int default 1 null comment '性别,1代表男,0代表女默认男,'
)
charset = utf8;
3、根据数据库创建实体类
package com.bjwl.demoCrud.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HSP
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String id;
private String name;
private int age;
private int sex;
public User(String name, int age, int sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
4、创建mapper接口
package com.bjwl.demoCrud.dao;
import com.bjwl.demoCrud.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author:HSP
* @Date:2022/4/4 13:19
* @Description:
* @projectName:ssm_demo
*/
@Repository
@Mapper
public interface UserMapper {
// 增删改查
int add(User user);
int delete(String id);
int update(User user);
User queryById(String id);
List<User> queryAll();
}
5、编写mapper.xml文件
- 必须首先指明这个Mapper是哪个接口的
- 参数那,别名需要先设置
- id标签对应的是接口的方法名
UserMapper.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">
<mapper namespace="com.bjwl.demoCrud.dao.UserMapper">
<insert id="add" parameterType="user">
insert into ssm.ssm_users
values (#{id}, #{name}, #{age}, #{sex});
</insert>
<delete id="delete" parameterType="string">
delete
from ssm.ssm_users
where id = #{id};
</delete>
<update id="update" parameterType="user">
update ssm.ssm_users
set name =#{name},
age=#{age},
sex=#{sex}
where id = #{id}
</update>
<select id="queryById" resultType="user" parameterType="string">
select *
from ssm.ssm_users
where id = #{id}
</select>
<select id="queryAll" resultType="user">
select *
from ssm.ssm_users
</select>
</mapper>
6、将mapper.xml文件注册到mybatis中
- 由于spring接管了数据库的配置,故,可以不用在mybatis中配置数据库映射。
- 当前mybatis配置中只需要将mapper文件映射,还需要将别名设置即可
- 指定mapper文件可以使用resource(在resources中的目录文件)、url、class(当mapper文件和类名在一个包下,且同名是一般用)
- 数据库的配置可以直接配置在里面,也可以通过db.properties文件读取
db.properties
#这几个注释的配置是mybatis-config.xml里用的
#driver=com.mysql.cj.jdbc.Driver
#url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&useSSL=true&unicode=true&charsetEncoding=utf8
#username=admin
#password=he123456
druid.driverClassName=com.mysql.cj.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
druid.username=admin
druid.password=he123456
##初始连接数,默认0
druid.initialSize=10
#最大连接数,默认8
druid.maxActive=30
#最小闲置数
druid.minIdle=10
#获取连接的最大等待时间,单位毫秒
druid.maxWait=2000
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置顺序
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?-->
<!-- <properties resource="db.properties"/>-->
<!-- 别名-->
<typeAliases>
<package name="com.bjwl.demoCrud.entity"/>
</typeAliases>
<!-- <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>-->
<!-- 注入mappers-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
7、创建测试类测试
@Test
public void testMybatis() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// System.out.println(userMapper.queryAll());
System.out.println(userMapper.add(new User("4", "magic", 21, 1)));
// System.out.println(userMapper.update(new User("1", "magic", 21, 1)));
// System.out.println(userMapper.delete("1"));
// System.out.println(userMapper.queryById("1"));
sqlSession.commit();
sqlSession.commit();
重要的一步!!!
三、Spring
1、创建service层的UserService接口和实现类
package com.bjwl.demoCrud.service;
import com.bjwl.demoCrud.entity.User;
import java.util.List;
/**
* @author:HSP
* @Date:2022/4/4 14:20
* @Description:
* @projectName:ssm_demo
*/
public interface UserService {
int add(User user);
int delete(String id);
int update(User user);
User queryById(String id);
List<User> queryAll();
}
2、实现类
package com.bjwl.demoCrud.service.impl;
import com.bjwl.demoCrud.dao.UserMapper;
import com.bjwl.demoCrud.entity.User;
import com.bjwl.demoCrud.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
/**
* @author:HSP
* @Date:2022/4/4 14:21
* @Description:
* @projectName:ssm_demo
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
// 使用原始注入bean也行,使用注解也行
// public void setUserMapper(UserMapper userMapper) {
// this.userMapper = userMapper;
// }
@Override
public int add(User user) {
// 使用UUID随机生成id
String s = UUID.randomUUID().toString().toUpperCase().replaceAll("-", "");
user.setId(s);
return userMapper.add(user);
}
@Override
public int delete(String id) {
return userMapper.delete(id);
}
@Override
public int update(User user) {
return userMapper.update(user);
}
@Override
public User queryById(String id) {
return userMapper.queryById(id);
}
@Override
public List<User> queryAll() {
return userMapper.queryAll();
}
}
3、整合dao
层
-
使用
spring-dao.xml
接管mybatis-config.xml
中的数据库、数据源配置 -
spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描包-->
<!-- <context:component-scan base-package="com.bjwl.demo01.dao"/>-->
<!-- 读取数据-->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 注入数据源,使用druid数据源-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="url" value="${druid.url}" />
<property name="driverClassName" value="${druid.driverClassName}" />
<property name="username" value="${druid.username}" />
<property name="password" value="${druid.password}" />
<property name="initialSize" value="${druid.initialSize}"/>
<property name="maxActive" value="${druid.maxActive}" />
<property name="minIdle" value="${druid.minIdle}" />
<property name="maxWait" value="${druid.maxWait}" />
</bean>
<!-- 将数据源注入SqlSessionFactoryBean中-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<!-- 接管mybatis配置-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 自动注入mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 扫描当前包下的mapper接口-->
<property name="basePackage" value="com.bjwl.demoCrud.dao"/>
</bean>
</beans>
4、整合service
层
-
使用
spring-service.xml
注册bean跟数据库的事务 -
在服务层开启事务
-
spring-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.bjwl.demoCrud.service"/>
<!-- 同在serviceImpl中的注释相同,若只用原始bean注册则可以放开此注释-->
<!--<bean class="com.bjwl.demoCrud.service.impl.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
</bean>-->
<!-- 开启事务-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
5、创建测试类
-
在此处测试如果使用
spring-service.xml
肯定是不行的,他在这里肯定不够,会不认识mapper的 -
所以需要将其整合
- 将两个文件整合在另一个文件中
- 在
spring-service.xml
使用import导入spring-dao.xml
,这样使得他就可以识别了
-
以下只是方法1,后面还会用到这种形式的
@Test public void testService() { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); UserServiceImpl bean = context.getBean(UserServiceImpl.class); System.out.println(bean.queryAll()); // System.out.println(bean.add(new User("4", "magic", 21, 1))); // System.out.println(bean.update(new User("1", "magic", 21, 1))); // System.out.println(bean.delete("1")); // System.out.println(bean.queryById("1")); }
四、springMVC
1、整合controller
控制层
- 创建
UserController
类 - 因为没有写视图渲染所以使用
@ResponseBody
直接返回字符串到前端 - 解决返回前端字符串乱码问题
value = "/访问路径", produces ="application/json;charset=utf-8"
- 如:
@GetMapping(value = "/update", produces ="application/json;charset=utf-8")
package com.bjwl.demoCrud.controller;
import com.bjwl.demoCrud.entity.User;
import com.bjwl.demoCrud.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
/**
* @author:HSP
* @Date:2022/4/4 14:22
* @Description:
* @projectName:ssm_demo
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "<h1>Hello,你好呀!</h1>");
return "hello";
}
@GetMapping(value = "/add", produces ="application/json;charset=utf-8")
@ResponseBody
public String add(User user) {
int add = userService.add(user);
if (add > 0) {
return "<h1>succeed!</h1>";
}
return "fail!";
}
@GetMapping(value = "/delete/{id}", produces ="application/json;charset=utf-8")
@ResponseBody
public String delete(@PathVariable("id") String id) {
int delete = userService.delete(id);
if (delete > 0) {
return "<h1>succeed!</h1>";
}
return "fail!";
}
@GetMapping(value = "/update", produces ="application/json;charset=utf-8")
@ResponseBody
public String update(User user) {
int update = userService.update(user);
if (update > 0) {
return "<h1>succeed!</h1>";
}
return "fail!";
}
@GetMapping(value = "/query/{id}",produces ="application/json;charset=utf-8")
@ResponseBody
public String queryById(@PathVariable("id") String id) {
return userService.queryById(id).toString();
}
@GetMapping(value = "/list", produces ="application/json;charset=utf-8")
@ResponseBody
public String queryAll(){
System.out.println(userService.queryAll().toString());
return userService.queryAll().toString();
}
}
2、使用spring-mvc.xml
配置视图解析
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 扫描包-->
<context:component-scan base-package="com.bjwl.demoCrud.controller"/>
<!-- 开启注解驱动-->
<mvc:annotation-driven/>
<!-- 过滤静态资源-->
<mvc:default-servlet-handler/>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3、将前面整合的spring配置文件融合
spring-dao.xml
接管了数据库配置文件以及mybatis-config.xml
中的别名和映射配置,并且注入数据源。- ``spring-service.xml`服务层的bean注入及事务的处理
spring-mvc.xml
主要是视图解析的配置- 将三者集合到一块儿,在加载项目的时候扫描
applicationContext.xml
即把这三个spring配置全部扫描了。 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<import resource="classpath*:spring-dao.xml"/>
<import resource="classpath*:spring-service.xml"/>
<import resource="classpath*:spring-mvc.xml"/>
</beans>
4、配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 初始化字符编码为UTF-8-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 强制转码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 映射到所有路径都过滤-->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置DispatcherServlet-->
<servlet>
<servlet-name>ssmCrudDemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化配置文件所在地-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- resources文件下的applicationContext.xml-->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 设置启动级别 1 为最高级-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置映射路径-->
<servlet-mapping>
<servlet-name>ssmCrudDemo</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5、最后是一个简单的前端页面
- 启动访问的首页
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
- hello请求传输数据到到此页面
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
-
项目目录结构
-
类以及方法结构
一个基本简易的SSM项目完成,比较简陋