Maven项目基础上的SSM整合
SSM(Spring+SpringMVC+MyBatis)框架集由 **Spring ** 、**MyBatis **两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。
SSM内容
Spring
Spring就像是整个项目中 装配bean的大工厂 ,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。
Spring的核心思想是 IoC(控制反转),即不再需要程序员去显式地new
一个对象,而是让Spring框架帮你来完成这一切。
SpringMVC
SpringMVC在项目中拦截用户请求,它的核心Servlet即 DispatcherServlet 承担中介或是前台这样的职责,将用户请求通过 HandlerMapping 去匹配 Controller ,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
mybatis
mybatis是对 jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个 sqlSessionFactory 实例展开的。mybatis通过配置文件关联到各实体类的 Mapper 文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
SSM框架的搭建
在第一章maven项目的基础上,继续配置spring和mybatis的相关内容,完成SSM的搭建
项目结构
web.xml的配置
<!-- spring的配置文件 -->
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- spring在启动时自己创建applicationContext——“容器” -->
<!-- needed for ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
SpringMVC的相关配置
<!-- 开启注解的扫描 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 扫描指定包内的controller部件 -->
<context:component-scan
base-package="com.gonna.controller">
</context:component-scan>
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 开启默认的servlet -->
<mvc:default-servlet-handler />
Spring和MyBatis的整合配置
为了提高代码的可维护性可以将数据库信息单独写在“字典文件”1中,在applicationContext.xml中引用就好
<!-- 扫描repository和service部件 -->
<context:component-scan
base-package="com.gonna.dao"></context:component-scan>
<context:component-scan
base-package="com.gonna.service"></context:component-scan>
<!-- 另一种写法(排除controller的包) -->
<!-- <context:component-scan base-package="com.gonna"> -->
<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->
<!-- </context:component-scan> -->
<!-- 使用c3p0构建连接池 -->
<context:property-placeholder
location="classpath:db.properties" /><!--“字典文件”-->
<!-- 由spring创建Connection类 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 其他属性 -->
<property name="maxPoolSize" value="100"></property>
</bean>
<!-- 整合spring和mybatis -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config.xml"></property><!--指定MyBatis的配置文件-->
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations">
<list>
<value>classpath:mapper/*.xml</value><!--指定mapper文件-->
</list>
</property>
</bean>
<!-- 让mybatis扫面dao -->
<bean id="scannerConfigurer"
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gonna.dao"></property>
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"></property><!--解决无法依赖注入问题 -->
</bean>
<!-- 开启spring事物管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启标签 -->
<tx:annotation-driven
transaction-manager="transactionManager" />
MyBatis的配置文件
<?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>
<!--暂时可以什么都不写-->
</configuration>
mapper
mybatis的逆向工程工具为我们自动生成了许多常用的sql语句,在这里我们自己写一个容易测试的
<mapper namespace="com.gonna.dao.StudentMapper">
<resultMap id="BaseResultMap" type="com.gonna.domain.Student">
<id column="sno" property="sno" jdbcType="INTEGER" />
<result column="sname" property="sname" jdbcType="VARCHAR" />
<result column="ssex" property="ssex" jdbcType="VARCHAR" />
<result column="sage" property="sage" jdbcType="INTEGER" />
<result column="stel" property="stel" jdbcType="VARCHAR" />
<result column="shome" property="shome" jdbcType="VARCHAR" />
<result column="pid" property="pid" jdbcType="INTEGER" />
<result column="cid" property="cid" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List">
sno, sname, ssex, sage, stel, shome, pid, cid
</sql>
<select id="selectStudents" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from student
</select>
</mapper>
至此SSM的基本配置也就完成了,我们需要写对应的测试类和页面
SSM测试
实体类MyBatis generator已为我们建好,我们可以给它加一个toString()方法便于测试
StudentMapper.java
dao也已自动建好,在这里做一点小改动
package com.gonna.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.gonna.domain.Student;
@Repository
public interface StudentMapper {
// @Autowired
List<Student> selectStudents();//该方法必须和mapper中的select语句id一致!
int deleteByPrimaryKey(Integer sno);
int insert(Student record);
int insertSelective(Student record);
Student selectByPrimaryKey(Integer sno);
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
}
StudentService.java
package com.gonna.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gonna.domain.Student;
@Service
public interface StudentService {
// @Autowired
List<Student> selectStudents();
}
StudentServiceImpl.java
package com.gonna.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gonna.dao.StudentMapper;
import com.gonna.domain.Student;
import com.gonna.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
// @Resource ----?有的博文里是这么写的,回头再尝试下
StudentMapper studentMapper;
//generator可以自动生成,自然在这里也可以autowired
@Override
public List<Student> selectStudents() {
return studentMapper.selectStudents();
}
}
StudentController.java
package com.gonna.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gonna.domain.Student;
import com.gonna.service.StudentService;
@Controller
public class StudentController {
@Autowired
// @Resource
private StudentService studentService;
@RequestMapping("getStudents")
public String getStudents(ModelMap model) {
List<Student> list = studentService.selectStudents();
model.addAttribute("students", list);
for (Student s : list) {
System.out.println(s);
}
//控制台看看Student对象是否拿到
return "showstudents";
}
}
showstudents.jsp
最后写一个页面显示效果,为了方便以后加东西写多了点
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" align="center">
<tr>
<td colspan="10" align="center">
<form action="searchByName.do" method="get">
<input type="text" name="sname" value="请输入学生名"> <input
type="submit" value="搜索学生信息">
</form>
</td>
</tr>
<tr>
<td align="center">学号</td>
<td align="center">姓名</td>
<td align="center">性别</td>
<td align="center">年龄</td>
<td align="center">电话</td>
<td align="center">家庭住址</td>
<td colspan="2" align="center">操作</td>
</tr>
<!--关键代码:jstl标签循环遍历student的list-->
<c:forEach items="${students}" var="student">
<tr>
<td align="center">${student.sno }</td>
<td align="center">${student.sname }</td>
<td align="center">${student.ssex }</td>
<td align="center">${student.sage }</td>
<td align="center">${student.stel }</td>
<td align="center">${student.shome }</td>
<td><form action="deleteone.do" method="get">
<input type="hidden" name="sname" value="${student.sname }"> <input
type="submit" value="删除">
</form></td>
<td><form action="searchByName.do" method="get">
<input type="hidden" name="sname" value="${student.sname }">
<input type="submit" value="修改">
</form></td>
</tr>
</c:forEach>
<tr>
<td colspan="10" align="center">
<form action="insertone.do" method="get">
<input type="submit" value="加入学生">
</form>
</td>
</tr>
</table>
</body>
</html>
运行结果
大功告成!!!还有不足之处还请各位不吝赐教’’’ V ‘’’
参考:
[SSM框架理解]: https://www.cnblogs.com/verlen11/p/5349747.html
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=root password=root
↩︎