前言
-
之前学ssm整合没学太懂,再来复习一下框架的整合
-
整合springmvc与mybatis(没用maven)
-
软件是idea
-
只写了简单的登录,增删改查
-
注释很详细噢,很适合新手
一、配置文件
1.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">
<display-name>springmvc_mybatis</display-name>
<!--Spring核心监听器 -->
<!--在服务器启动时加载Spring容器,且只会加载一次 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 此处contextConfigLocation的值是你spring配置文件的名称,我的是applicationContext.xml-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置Springmvc核心控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 此处contextConfigLocation的值是你springmvc配置文件的名称,我的是springmvc.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--让DispatcherServlet拦截所有URL,这里也可以拦截.do请求-->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--解决中文乱码的过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2.application.xml(spring配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--加载配置文件 读取db.properties-->
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"></context:property-placeholder>
<!--spring整合mybatis的配置-->
<!--配置数据源 数据库连接信息,单独写在db.properties,修改很方便,也可以直接写在value里-->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
<!--配置SqlSessionFactory-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean"
id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.entity"></property>
<!--配置Mapper映射文件的位置,我这里没放在文件夹下面,如果放在某个文件夹下面不要忘了写上-->
<property name="mapperLocations" value="classpath:*Mapper.xml"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!--配置Mapper接口的扫描器 还可以使用mybatis scan -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
id="scannerConfigurer">
<!-- 配置mapper接口所在的包 -->
<property name="basePackage" value="com.mapper"></property>
<!--注入会话工厂-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!--spring中基于XML的声明式事务控制的配置-->
<!--事务配置-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 启用注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3.mybatis-config.xml(mybatis配置文件)
其实整合以后mybatis配置文件里没什么基本东西了
先来看一下单独用mybatis时的配置文件:
但整合后,数据库连接信息和事务管理,数据源这些基本都整合到了spring的配置文件里。所以简单点的整合是可以不写这个配置文件的。但是我这里,数据库是这样的:
所以我在mybatis-config里开启了驼峰命名(就是把user_id换成userId这样的形式); 或者写sql语句的时候起个别名。
整合以后的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>
<settings>
<!--开启驼峰命名规则-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
4.springmvc.xml(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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--指定需要扫描的包-->
<context:component-scan base-package="com"></context:component-scan>
<!--2. 开启注解 springmvc注解支持-->
<mvc:annotation-driven />
<!--3.配置视图解析器 加前缀后缀 最终解析出的jsp文件路径是:前缀+逻辑视图名+后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--4.文件上传解析器-->
</beans>
5.db.properties(数据库配置文件)
#数据库连接信息文件:连接数据库的4个信息
#驱动类
driver=com.mysql.jdbc.Driver
#url地址
url=jdbc:mysql://localhost:3306/mybatis
#用户名
username=root
#密码
password=sasa
6.log4j.properties(log4j日志)
log4j.rootLogger=DEBUG,TEST,FILE
log4j.appender.TEST=org.apache.log4j.ConsoleAppender
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=[%d] [%p] [%l] [%m] %n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=d:/log.txt
log4j.appender.FILE.MaxFileSize=100KB
log4j.appender.FILE.MaxBackupIndex=2
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d] [%p] [%l] [%m] %n
加入这个控制台可以看到超详细日志,就像这样
二、数据库,jar包
1.数据库
主键id自动增长,不为空
2.jar包
除了基础的spring包以外,还要导入jstl包
maven仓库搜索,挑一个最多人下的下载 ,
如果用maven更简单,直接复制到pom文件里
三、java文件
他们之间的关系参考(5)
1.bean(实体类)
package com.entity;
import java.io.Serializable;
//实现序列化接口
public class Userinfo implements Serializable {
//属性
private Integer userId;
private String userName;
private String userPassword;
private Integer userAge;
private String userSex;
//构造函数
public Userinfo() {
}
public Userinfo(Integer userId, String userName, String userPassword, Integer userAge, String userSex) {
this.userId = userId;
this.userName = userName;
this.userPassword = userPassword;
this.userAge = userAge;
this.userSex = userSex;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
@Override
public String toString() {
return "Userinfo{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", userAge=" + userAge +
", userSex='" + userSex + '\'' +
'}';
}
}
2.mapper(对象持久化映射层)
(1) mapper接口
package com.mapper;
import com.entity.Userinfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
//mapper对应的注解是@Repository
@Repository
public interface UserinfoMapper {
//添加
public void addUserinfo(Userinfo userinfo);
//修改
public void updateUserinfo(Userinfo userinfo);
//删除
public void deleteUserByUserid(Integer userId);
//查询所有
public List<Userinfo> selectAll();
//登录
public Userinfo login(Userinfo userinfo);
}
(2) mapper.xml
在mapper.xml写sql语句
<?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接口-->
<mapper namespace="com.mapper.UserinfoMapper">
<!--登录-->
<!--parameterType是传入的类型,resultType是返回的类型 这个id要和-->
<select id="login" parameterType="com.entity.Userinfo" resultType="com.entity.Userinfo">
select user_id, user_name, user_age,user_sex from userinfo where user_name=#{userName} and user_password=#{userPassword}
</select>
<!--查询所有-->
<select id="selectAll" resultType="com.entity.Userinfo" >
select user_id, user_name, user_age,user_sex from userinfo
</select>
<!--删除-->
<delete id="deleteUserByUserid" parameterType="int" >
delete from userinfo where user_id=#{userId}
</delete>
<!--添加-->
<insert id="addUserinfo" parameterType="com.entity.Userinfo">
insert into userinfo values(null,#{userName},#{userPassword},#{userAge},#{userSex})
</insert>
<!--修改-->
<update id="updateUserinfo" parameterType="com.entity.Userinfo">
update userinfo set user_name=#{userName},user_password=#{userPassword},
user_age=#{userAge},user_sex=#{userSex} where user_id=#{userId}
</update>
</mapper>
3.service(业务层:业务逻辑处理)
(1) service接口
package com.service;
import com.entity.Userinfo;
import java.util.List;
public interface UserinfoService {
//登录
public Userinfo login(Userinfo userinfo);
//查询所有
public List<Userinfo> selectAll();
//删除
public void deleteUserByUserid(int userId);
//添加
public void adduserinfo(Userinfo userinfo);
//修改
public void updateuserinfo(Userinfo userinfo);
}
(2) service实现类
package com.service.impl;
import com.entity.Userinfo;
import com.mapper.UserinfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.service.UserinfoService;
import java.util.List;
//Service对应的注解是@Service
@Service
public class UserinfoServiceImpl implements UserinfoService {
//要把mapper注入service 自动注入
@Autowired
private UserinfoMapper userinfoMapper;
//登录
@Override
public Userinfo login(Userinfo userinfo) {
return userinfoMapper.login(userinfo);
}
//查询所有 是集合形式
@Override
public List<Userinfo> selectAll() {
List<Userinfo> userinfo=userinfoMapper.selectAll();
return userinfo;
}
//删除
@Override
public void deleteUserByUserid(int userId) {
userinfoMapper.deleteUserByUserid(userId);
}
//添加
@Override
public void adduserinfo(Userinfo userinfo) {
userinfoMapper.addUserinfo(userinfo);
}
//修改
@Override
public void updateuserinfo(Userinfo userinfo) {
userinfoMapper.updateUserinfo(userinfo);
}
}
4.controller(控制层)
package com.controller;
import com.entity.Userinfo;
import com.sun.deploy.net.HttpResponse;
import org.omg.CORBA.Request;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.service.UserinfoService;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.Response;
import java.io.IOException;
import java.util.List;
//Controller对应的注解是@Controller
@Controller
@RequestMapping("user")
public class FirstController {
//要把service注入到controller中 自动注入
@Autowired
private UserinfoService userinfoService;
@RequestMapping("/login")
public ModelAndView login(Userinfo userinfo, ModelAndView modelAndView, HttpSession httpSession) throws IOException {
Userinfo u=userinfoService.login(userinfo);
System.out.println("用户登录:");
if(u!=null){//如果用户不为空,说明此用户在数据库中存在,登陆成功
//msg success都是要传递的信息,在index.jsp页面中用${msg}来获取
modelAndView.addObject("msg", u.getUserName());
modelAndView.addObject("success", "您好,登陆成功,欢迎来到查询界面");
//用户对象存入session
httpSession.setAttribute("nowuser", u);
//我这里是登录就立马查询所有信息,也可以搞一个超链接,href="/user/select"来访问
List users=userinfoService.selectAll();
//把数据users传到selectpage.jsp
modelAndView.addObject("users",users);
modelAndView.setViewName("selectpage");
}else{
//response.sendRedirect("../login.jsp?islogin="+false);
//如果有重定向,那么视图解析器不再起作用,需要写完整路径
modelAndView.setViewName("redirect:../login.jsp?islogin=false");
}
return modelAndView;
}
//我这里是登录就立马查询所有信息,也可以搞一个超链接,href="/user/select"来访问
// @RequestMapping("/select")
// public ModelAndView select( ModelAndView modelAndView) {
// List users=userinfoService.selectAll();
// modelAndView.addObject("users",users);
// modelAndView.setViewName("selectpage");
// return modelAndView;
// }
@RequestMapping("/add")
public ModelAndView add(Userinfo userinfo,ModelAndView modelAndView) {
System.out.println("进入添加方法");
userinfoService.adduserinfo(userinfo);
//添加完后返回查询页面
List users=userinfoService.selectAll();
modelAndView.addObject("users",users);
modelAndView.setViewName("selectpage");
return modelAndView;
}
@RequestMapping("/update")
public ModelAndView update(HttpServletRequest request,Userinfo userinfo,ModelAndView modelAndView) {
System.out.println("进入修改方法");
userinfoService.updateuserinfo(userinfo);
List users=userinfoService.selectAll();
modelAndView.addObject("users",users);
modelAndView.setViewName("selectpage");
return modelAndView;
}
@RequestMapping("/delete")
public ModelAndView delete(HttpServletRequest request,ModelAndView modelAndView) {
System.out.println("进入删除方法");
int userId;
//获取传入的id 通过id来删除
userId=Integer.parseInt(request.getParameter("userId"));
userinfoService.deleteUserByUserid(userId);
//重新查询
List<Userinfo> users= userinfoService.selectAll();
modelAndView.addObject("users",users);
modelAndView.setViewName("selectpage");
return modelAndView;
}
}
5.关系
SSM是sping+springMVC+mybatis集成的框架。 MVC即model view controller。
model层=bean=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。
service层。存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。
mapper层=dao层,现在用mybatis逆向工程生成的mapper层,其实就是dao层。对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者。service的impl是把mapper和service进行整合的文件。数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作,比如数据通过hibernate插入到数据库中
controller层。控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,在返回一个指定的路径或者数据表。
mapper对应的注解是@Repository;Service对应的注解是@Service;Controller对应的注解是@Controller
在service中自动注入mapper:
在controller中自动注入service:
四、jsp文件
很丑,最基本的页面,主要看功能吧
1.login.jsp(登陆页面)
<%--
Created by IntelliJ IDEA.
User: syh
Date: 2021/3/16
Time: 15:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<h1>登陆页面</h1>
<h2 style="color: red">
<%--判断用户名密码是否正确--%>
${param.islogin=="false" ? "用户名或密码错误!":"" }
</h2>
<form action="user/login" method="post">
请输入用户名:<input type="text" name="userName">
请输入密码:<input type="password" name="userPassword">
<input type="submit" value="提交">
</form>
</head>
<body>
</body>
</html>
2.selectpage.jsp(登陆成功以后查询)
用了c标签循环查找和el表达式
<%--
Created by IntelliJ IDEA.
User: syh
Date: 2021/3/30
Time: 16:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入c标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>用户信息查询</title>
</head>
<style>
td{
width:250px;
}
</style>
<body>
<center>
<%-- 控制器传来的参数--%>
<h2> ${msg} ${success}</h2>
<hr>
<h1>用户信息查询</h1>
<a href="../add.jsp">添加用户</a>
<table width="50%" border="1" cellpadding="1" cellspacing="1"><tr>
<tr>
<th>用户id</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<c:forEach items="${requestScope.users}" var="u" >
<tr>
<th>${u.userId}</th>
<th>${u.userName}</th>
<th>${u.userAge}</th>
<th>${u.userSex}</th>
<%--修改和删除都要带参数过去,删除还要弹出是否确定的框,以免误删--%>
<th><a href="../update.jsp?userId=${u.userId} ">修改</a>/<a href="/springmvc/user/delete?userId=${u.userId}" onclick="return confirm('是否确定删除?')">删除</a></th>
</tr>
</c:forEach>
</table>
</center>
</body>
</html>
3.add.jsp(添加页面)
<%--
Created by IntelliJ IDEA.
User: syh
Date: 2021/4/4
Time: 5:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加用户</title>
</head>
<body>
<h1>请添加用户</h1>
<form action="/springmvc/user/add" method="post">
用户名: <input type="text" name="userName" ><br>
密码:<input type="password" name="userPassword"><br>
年龄:<input type="text" name="userAge"><br>
性别:<input type="text" name="userSex"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
添加页面没id这个框,因为数据库里面设置的自动增长
4.update.jsp(修改页面)
<%--
Created by IntelliJ IDEA.
User: syh
Date: 2021/4/4
Time: 5:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改用户</title>
</head>
<body>
<h1>请修改用户</h1>
<form action="/springmvc/user/update" method="post">
<%--传入的id用 value="<%=request.getParameter("userId")%>"来获取--%>
Id:<input type="text" name="userId" readonly="true" value="<%=request.getParameter("userId")%>">
用户名: <input type="text" name="userName"><br>
密码:<input type="password" name="userPassword"><br>
年龄:<input type="text" name="userAge"><br>
性别:<input type="text" name="userSex"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
这个地方id文本框要设置成只读,还可以把其他的信息也获取到,但是可修改,就方便很多
五、结尾
1. 项目结构
2.总结
比较简单的一个ssm框架整合,希望能学到更多来完善,加油,进步!!!