什么是SSM?
ssm全称Spring+SpringMVC+MyBatis,是目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统
SSM项目创建
打开idea 点击文件 鼠标右键 点击新建项目
选择maven项目 点击下一步
给项目取个名字 确定好项目要放到路径 点击完成
给项目添加框架支持添加(web网页)
选择web框架
部署tomcat 选择本地
部署项目 添加工件(把项目的war包部署上去)
web框架添加后 就开始配置web.xml中的相关配置
数据库表结构设计
SSM项目中所用到的相关配置文件
配置文件解析
spring的相关配置文件
连接数据库的相关配置文件
输出日志的相关配置
mybatis的相关配置文件
spring mvc的相关配置文件
配置文件的代码块展示
ApplicationContext.xml spring的配置文件
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1.引入properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 2.配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--3.创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!--name此处的name是指上面数据源的id-->
<property name="configLocation" value="classpath:mybatis-config.xml"/> <!--value表示引入mybatis配置文件的路径-->
</bean>
<!-- MapperScannerConfigurer-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper"></property>
</bean>
<!--注解实现依赖注入 下面标签是用于扫描包的注解-->
<context:component-scan base-package="mapper,service"/>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!--开启注解-->
</beans>
jdbc.properties 数据库连接配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ketai?serverTimezone=GMT-8&useUnicode=true&character=utf-8
jdbc.username=root
jdbc.password=root
log4j.properties 日志输出的配置文件
### 设置###
log4j.rootLogger = debug,stdout,logfile,error
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=log.log ###
log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
### 这里不写路径就是在当前目录下创建日志文件 ###
log4j.appender.logfile.File = logs/log.log
log4j.appender.logfile.Append = true
log4j.appender.logfile.Threshold = DEBUG
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
###单独保存ERROR级别以上的异常到=error.log ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
### 这里不写路径就是在当前目录下创建日志文件 ###
log4j.appender.error.File =error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
mybatis-config.xml mybatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--1.加载jdbc.properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--2.设置(日志 缓存 自动匹配(autoMappingBehavior))-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--自动扫描pojo包下的所有类 默认别名就是类名 -->
<typeAliases>
<package name="pojo"/>
</typeAliases>
<!--将mapper文件引入 每增加一个就引入一个-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
springmvc.xml spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包 会自动扫描到@Component-->
<context:component-scan base-package="controller"/>
<!--自动注册defaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter两个bean 自动注册controller类中的映射器 适配器-->
<mvc:annotation-driven/>
<!--2.配置视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="User/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
SSM项目实现增删改查
整体的项目结构
SSM增删改查代码展示(用户为例)
pojo 实体类
@Data
public class Users {
private Integer id;
private String name;
private String pwd;
}
mapper 文件映射类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.UserMapper">
<select id="searchAllUser" resultType="pojo.Users" parameterType="java.util.List">
select *from users
</select>
<select id="selectById" resultType="pojo.Users" parameterType="java.lang.Integer">
select *from users WHERE id=#{id}
</select>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from users where id=#{id}
</delete>
<insert id="insertUser" parameterType="pojo.Users">
INSERT INTO `users` (`id`, `name`, `pwd`) VALUES (#{id}, #{name}, #{pwd});
</insert>
<update id="updateUser" parameterType="pojo.Users">
<!-- UPDATE `users` SET `name` = #{name}, `pwd` = #{pwd} WHERE `pwd` = #{id};-->
update users
<trim prefix="set" suffixOverrides=",">
<if test="name != null">name=#{name},</if>
<if test="pwd != null">pwd=#{pwd},</if>
</trim>
where id=#{id}
</update>
</mapper>
mapper 接口
@Repository
public interface UserMapper {
/**
* 查询所有的学生信息
* @return
*/
List<Users>searchAllUser();
/**
* 删除学生信息
* @param id
* @return
*/
Integer deleteUser(@Param("id") Integer id);
/**
* 新增学生信息
* @param users
* @return
*/
Integer insertUser(Users users);
/**
* 根据id修改学生信息
* @param users
* @return
*/
Integer updateUser(Users users);
/**
* 根据id查询学生信息
* @param id
* @return
*/
Users selectById(@Param("id") Integer id);
}
service层
接口=========================================================================================
public interface UserService {
/**
* 查询所有的学生信息
* @return
*/
List<Users> searchAllUser();
/**
* 删除学生信息
* @param id
* @return
*/
Integer deleteUser(@Param("id") Integer id);
/**
* 新增学生信息
* @param users
* @return
*/
Integer insertUser(Users users);
/**
* 根据id修改学生信息
* @param users
* @return
*/
Integer updateUser(Users users);
/**
* 根据id查询学生信息
* @param id
* @return
*/
Users selectById(@Param("id") Integer id);
}
=-=====================================================================================
接口的实现类
@Service("User")
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<Users> searchAllUser() {
return userMapper.searchAllUser();
}
@Override
public Integer deleteUser(Integer id) {
return userMapper.deleteUser(id);
}
@Override
public Integer insertUser(Users users) {
return userMapper.insertUser(users);
}
@Override
public Integer updateUser(Users users) {
return userMapper.updateUser(users);
}
@Override
public Users selectById(Integer id) {
return userMapper.selectById(id);
}
}
controller 控制层
@Controller
public class UserController {
@Autowired
private UserService userService;
/**
* 查询所有用户信息
* @param modelAndView
* @return
*/
@RequestMapping("/searchAllUser")
public ModelAndView searchAllUser(ModelAndView modelAndView){
List<Users>list=userService.searchAllUser();
modelAndView.addObject("searchUser",list);
modelAndView.setViewName("selectAllUser");
return modelAndView;
}
/**
* 新增用户信息
* @param users
* @return
*/
@RequestMapping("/insertUser")
public String insertUser(Users users){
int count= userService.insertUser(users);
if(count>0){
System.out.println("新增成功!");
return "redirect:/searchAllUser";
}
return "redirect:/searchAllUser";
}
/**
* 删除用户信息
* @param id
* @return
*/
@RequestMapping("/deleteUser")
public String deleteUser(@Param("id") Integer id){
int count= userService.deleteUser(id);
if(count>0){
System.out.println("删除用户信息成功!");
return "redirect:/searchAllUser";
}
return "redirect:/searchAllUser";
}
/**
* 修改用户信息
* @param users
* @return
*/
@RequestMapping("/updateUser")
public String updateUser(@Param("users") Users users){
int count= userService.updateUser(users);
if(count>0){
System.out.println("修改成功!");
return "redirect:/searchAllUser";
}
return "redirect:/searchAllUser";
}
/**
* 根据id查询
* @param id
* @param modelAndView
* @return
*/
@RequestMapping("selectByIdUser")
public ModelAndView selectByIdUser(@Param("id") Integer id,ModelAndView modelAndView){
Users users= userService.selectById(id);
if(users!=null){
modelAndView.addObject("user",users);
modelAndView.setViewName("updateUser");
return modelAndView;
}
modelAndView.setViewName("404");
return modelAndView;
}
}
web 页面
全路径
全路径
==========================================================================================
<% String basePath =
request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%>
主页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% String basePath =
request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%>
<html>
<head>
<title>查询用户信息的主页面</title>
</head>
<body>
<table border="1px">
<tr>
<td>编号</td>
<td>姓名</td>
<td>密码</td>
<td>操作</td>
</tr>
<c:forEach items="${searchUser}" var="us">
<tr>
<td>${us.id}</td>
<td>${us.name}</td>
<td>${us.pwd}</td>
<td>
<a href="<%=basePath%>deleteUser?id=${us.id}">删除</a>
<a href="<%=basePath%>selectByIdUser?id=${us.id}">修改</a>
</td>
</tr>
</c:forEach>
</table>
<h3><a href="<%=basePath%>User/insertUser.jsp">新增用户</a></h3>
</body>
</html>
新增页面
<% String basePath =
request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%>
<html>
<head>
<title>新增用户信息的页面</title>
</head>
<body>
<form action="<%=basePath%>insertUser">
姓名:<input type="text" name="name">
密码:<input type="text" name="pwd">
<input type="submit" value="新增">
</form>
</body>
</html>
修改页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% String basePath =
request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%>
<html>
<head>
<title>修改用户信息的页面</title>
</head>
<body>
<form action="<%=basePath%>updateUser">
编号:<input type="text" name="id" value="${user.id}">
姓名:<input type="text" name="name" value="${user.name}">
密码:<input type="text" name="pwd" value="${user.pwd}">
<input type="submit" value="修改">
</form>
</body>
</html>
404页面
<html>
<head>
<title>404页面</title>
</head>
<body>
<h1>你的网络掉大海了</h1>
</body>
</html>
页面效果图