SSM框架整合
1.ssm把spring springmvc mybatis三个框架整合再一起。 spring和 mybatis框架。把mybatis配置文件的内容整合到spring配置文件中。
对象调用的顺序:JSP—Controller—Service—DAO—Mybatis
(0)建立数据库
-- 创建数据库语句编码为utf8的格式:
create database 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建表:
-- 表存在则删除
drop table if exists '表名'
-- 表不存在则创建
create table if not exists '表名' (
'id' int(11) not null auto_increment,
'name' varchar(10),
primary key('id')
)
-- 创建数据库
create database qy165 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建部门表
DROP TABLE IF EXISTS `tbl_dept`;
CREATE TABLE `tbl_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NULL DEFAULT NULL COMMENT '部门',
`loc` varchar(255) NULL DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
);
-- 插入数据
INSERT INTO `tbl_dept` VALUES (1, '研发部', '郑州');
INSERT INTO `tbl_dept` VALUES (2, '市场部', '北京');
INSERT INTO `tbl_dept` VALUES (3, '财务部', '上海');
INSERT INTO `tbl_dept` VALUES (4, '人事部', '杭州');
-- 创建员工表
DROP TABLE IF EXISTS `tbl_emp`;
CREATE TABLE `tbl_emp` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) NULL DEFAULT NULL COMMENT '姓名',
`salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪水',
`birthday` date NULL DEFAULT NULL COMMENT '出生日期',
`dept_id` int(11) NULL DEFAULT NULL COMMENT '部门id 关联部门表',
PRIMARY KEY (`id`)
);
-- 插入数据
INSERT INTO `tbl_emp` VALUES (1, '接口的卡莉法',5000.00, '2008-11-12',2);
INSERT INTO `tbl_emp` VALUES (2, '大幅度', 34.00, '2023-04-05', 1);
INSERT INTO `tbl_emp` VALUES (3, '值交换', 908.00, '2030-04-07', 2);
INSERT INTO `tbl_emp` VALUES (4, '地方', 5546.00, '2023-04-05', 3);
INSERT INTO `tbl_emp` VALUES (5, '地方个', 44.00, '2023-04-04', 3);
INSERT INTO `tbl_emp` VALUES (6, '文言一心', 446576.00, '2013-05-06',2);
INSERT INTO `tbl_emp` VALUES (7, '文言一心', 234.00, '2013-05-06', 2);
(1)创建maven的web工程
(2)引入相关依赖
pom.xml
<dependencies>
<!-- 核心依赖-->
<!--spring webmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<!--mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--spring和mybatis整合的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<!--其他依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!-- jstl标签库依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
(3)创建springmvc配置文件
<?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">
<!--1.包扫描 包扫描主要用于找到带有注解的类。-->
<context:component-scan base-package="com.zc.controller,com.zc.service"/>
<!--2.注解驱动-->
<mvc:annotation-driven/>
<!--3.静态资源放行-->
<mvc:default-servlet-handler/>
<!--4.视图解析器,定义跳转的文件的前后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--5.配置数据源-->
<!--
driverClassName:数据库驱动连接
url: Uniform Resource Identifier 统一资源标识符 它是可以在 web 应用中唯一定位一个资源的路径
username:数据库用户名(用于连接数据库)
password:用户密码(用于连接数据库)
-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/qy165"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--6. SqlSessionFactory:理解为mybatis文件-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--指定mybatis映射文件的路径-->
<property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>
<!--7.设置dao接口的代理实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
<!--dao接口所在的包-->
<property name="basePackage" value="com.zc.dao"/>
</bean>
</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">
<!--注册DispatchServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--如果没有指定参数默认解析WEB-INF/servletName-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--乱码处理过滤器,由SpringMVC提供-->
<!-- 处理post请求乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- name固定不变,value值根据需要设置 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 所有请求都设置utf-8的编码 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(5)编写pojo实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer id;
private String name;
private BigDecimal salary;//小数类型 不要使用double或float 因为它有精度丢失问题3.0 3.000000000001
private Date birthday;
private Integer deptId;
private Dept dept;//一对一
}
@Data//@Data注解是由Lombok库提供的,会生成getter、setter以及equals()、hashCode()、toString()等方法
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private Integer id;
private String name;
private String ioc;
}
(6)编写对应的controller层
EmpController.java 控制器
@Controller
public class EmpController {
@Autowired//按照类型匹配
private EmpService empService;//EmpService类对象必须再spring中创建好
@Autowired
private DeptService deptService;
//TODO 查询所有
@RequestMapping("list")//用于将任意HTTP 请求映射到控制器方法上。
public String list(HttpServletRequest request){
List<Emp> emps = empService.selectAll();
request.setAttribute("emps",emps);
return "list";
}
//TODO 删除
@RequestMapping("/delete")
public String delete(Integer id){
int row = empService.del(id);
System.out.println(row);
return "redirect:/list";//重定向到指定的路径redirect:表示不会经过视图解析器 forward:请求转发 也不会经过视图解析器
}
}
(7)编写Service接口和实现类
EmpService.java
public interface EmpService {
//TODO 查询所有
public List<Emp> selectAll();
//TODO 删除
public int del(Integer id);
}
EmpServiceImpl.java
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。
默认是根据属性类型,spring自动将匹配到的属性值进行注入,然后就可以使用这个属性(对Springboot02WebApplicationTests类来说)autoWiredBean对象的方法。
@Autowired//简单来说因为类成员的初始化顺序不同,静态成员 ——> 变量初始化为默认值——>构造器——>为变量赋值。如果标注在属性上,则在构造器中就不能使用这个属性(对象)的属性和方法。
@Service//spring扫描到该注解时,会创建该类对象,并注入相关的依赖属性。
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpDao empDao;
//TODO 查询所有
@Override
public List<Emp> selectAll() {
return empDao.findAll();
}
//TODO 删除
@Override
public int del(Integer id) {
int i = empDao.removeEmp(id);
return i;
}
}
(8)编写dao接口以及mapper.xml
EmpDao.java
public interface EmpDao {
//TODO 查询所有
public List<Emp> findAll();
//TODO 删除
public int removeEmp(Integer id);
}
EmpMapper.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">
<!--namespace的内容必须和对应的接口路径映射-->
<mapper namespace="com.zc.dao.EmpDao">
<!--自定义映射规则-->
<resultMap id="MyEmpMap" type="com.zc.pojo.Emp" autoMapping="true">
<id property="id" column="eid"/>
<result property="name" column="ename"/>
<result property="deptId" column="dept_id"/>
<association property="dept" javaType="com.zc.pojo.Dept" autoMapping="true">
<id property="id" column="did"/>
<result property="name" column="dname"/>
</association>
</resultMap>
<!-- 删-->
<delete id="removeEmp" >
delete from tbl_emp where id = #{id}
</delete>
<!-- 查询所有-->
<select id="findAll" resultMap="MyEmpMap">
select e.id eid,e.name ename, salary, birthday, dept_id,d.name dname,d.id did,d.loc
from tbl_emp e join tbl_dept d on e.dept_id = d.id
</select>
</mapper>
(9)新建jsp页面
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table width="600" border="1" cellpadding="0" cellspacing="0" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>薪水</th>
<th>日期</th>
<th>部门</th>
<th>操作</th>
</tr>
<%-- jstl 核心标签库${} 必须引入jstl标签库的依赖
forEach:遍历集合或数组
items: 要遍历的集合或数组数据
var: 每次遍历时集合中的元素赋值的变量名
--%>
<c:forEach items="${emps}" var="e">
<tr>
<td>${e.id}</td>
<td>${e.name}</td>
<td>${e.salary}</td>
<td>
<%--运用 jstl 标签库格式化日期--%>
<fmt:formatDate value="${e.birthday}" pattern="yyyy-MM-dd"/>
</td>
<td>${e.dept.name}</td>
<td>
<input type="button" value="删除" onclick="location.href='/delete?id=${e.id}' "/>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
(10)部署项目
输入地址: localhost:8080/ 项目名称 /list