SSM【史上最详细整合】(二)

简介: 整合Spring与Mybatis

编写Dao以及实现

接口

package zhongfucheng.dao;
import zhongfucheng.entity.Dept;
/**
 * Created by ozc on 2017/8/8.
 */
public interface DeptDao {
    Dept selectDept(Integer deptId);
    int insertDept(Dept dept);
}

实现:

package zhongfucheng.dao.impl;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import zhongfucheng.entity.Dept;
import javax.annotation.Resource;
/**
 * Created by ozc on 2017/8/8.
 */
@Repository("deptDao")
public class DeptDaoImpl implements zhongfucheng.dao.DeptDao {
    @Resource
    private SqlSessionTemplate sqlSessionTemplate;
    /**
     * 根据部门编号查询部门信息
     * @param deptId 部门编号
     * @return 部门信息
     */
    @Override
    public Dept selectDept(Integer deptId){
        Dept dept=    sqlSessionTemplate.selectOne("zhongfucheng.entity.DeptMapper.selectDept", deptId);
        return dept;
    }
    /**
     * 添加部门信息
     * @param dept 部门信息
     * @return 添加成功的记录数
     */
    @Override
    public int insertDept(Dept dept){
        System.out.println("------dao.dept:"+dept);
        return sqlSessionTemplate.insert("zhongfucheng.entity.DeptMapper.insertDept", dept);
    }
}

测试spring与mybatis整合

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import zhongfucheng.dao.impl.DeptDaoImpl;
import zhongfucheng.entity.Dept;
/**
 * Created by ozc on 2017/8/8.
 */
public class TestDeptDao {
    //@Resource //这里没法使用,后继版本有其它方式可以注入
    static private DeptDaoImpl deptDao;
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
        deptDao=(DeptDaoImpl) context.getBean("deptDao");
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }
    @Test
    public void testSelectDept() {
        System.out.println(deptDao.selectDept(1));
    }
    @Test
    public void testInsertDept() {
        Dept dept=new Dept();
        //dept.setDeptId(117);
        dept.setDeptName("name117");
        dept.setDeptAddress("address117");
        System.out.println("受影响行数:"+deptDao.insertDept(dept));
    }
}

整合SpringMVC

配置文件

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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    ">
    <!-- 同时开启json格式的支持 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- <context:component-scan base-package="*"/> -->
    <!-- 扫描所有的controller 但是不扫描service -->
    <context:component-scan base-package="zhongfucheng">
        <context:include-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Service" />
    </context:component-scan>
</beans>

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_3_1.xsd"
         version="3.1">
    <!--Spring监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--Mvc分配器-->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <!--中文过滤器-->
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

编写Action

package zhongfucheng.action;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import zhongfucheng.dao.impl.DeptDaoImpl;
import zhongfucheng.entity.Dept;
import javax.annotation.Resource;
/**
 * Created by ozc on 2017/8/8.
 */
@Controller
@RequestMapping(value="/dept")
public class DeptAction {
    @Resource
    private DeptDaoImpl deptDao;
    @RequestMapping(value="/insert")
    public String insert(Dept dept){
        System.out.println("---action.dept:"+dept);
        deptDao.insertDept(dept);
        return "forward:/jsp/main.jsp";
    }
}

测试SSI整合

index.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
    <form action="dept/insert.action" method="post">
        名称:<input type="text"   name="deptName"><br> 
        地址:<input type="text" name="deptAddress"><br>
        <input type="submit" value="ok">
    </form>
</body>
</html>

main.jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
 this is main jsp
</body>
</html>

微信图片_20220411193649.jpg

优化

如果想要Spring与Mybatis更加完美地结合,其实我们的Dao并不需要写实现,直接写接口和映射文件就行了,这样一来,我们就可以舍弃DaoImpl了

在Spring配置文件中加入以下的代码:

<!-- 配置 转换器,对于在basePackage设置的包(包括子包)下的接口类,
        如果接口类的全类名在Mapper.xml文件中和定义过命名空间一致,
        将被转换成spring的BEAN,在调用的地方通过@Autowired方式将可以注入接口实例 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
        <!--这里包名留意要不要改-->
        <property name="basePackage" value="zhongfucheng.dao" />
    </bean>

我们的映射文件中把命名空间写成是Dao的全路径

//Dao的全路径,那么Spring就会自动帮我们创建对象,注入进去
<mapper namespace="zhongfucheng.dao.DeptDao">
    <resultMap type="Dept" id="deptResultMap">
        <id property="deptId" column="dept_id" />
        <result property="deptName" column="dept_name" />
        <result property="deptAddress" column="dept_address" />
    </resultMap>
    <!-- id和命名空间用来定位SQL语句,parameterType表示参数的类型,resultMap返回类型 -->
    <select id="selectDept" parameterType="Integer" resultMap="deptResultMap">
        <!--参数的写法#{deptID} -->
        select * from dept where dept_id=#{deptID}
    </select>
    <insert id="insertDept" parameterType="Dept">
        insert into dept(dept_name,dept_address) values(#{deptName},#{deptAddress});
    </insert>
</mapper>

在配置工厂的时候,我们可以配置mapperLocations属性,这样一来,我们就不用在Mybatis中逐个加载配置文件了。

<!-- 配置session工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--这里的路径和名字留意要不要改-->
        <property name="configLocation" value="classpath:myBatis-config.xml" />
        <!--配置扫描式加载SQL映射文件,记得去掉mybatis-config配置,使用了这个,在Mybatis配置文件中就不用加载对应的映射文件了-->
        <!--这里留意路径是否要改-->
        <property name="mapperLocations" value="classpath:zhongfucheng/dao/*.xml"/>
    </bean>

总结

SSM整合和SSH整合的步骤差不多

  • log4j配置文件
  • web.xml配置文件
  • SpringContext监听器
  • SpringMVC核心过滤器
  • 中文过滤器
  • Spring配置文件
  • 数据库连接池
  • Mybatis总配置文件
  • SessionFactory
  • 事务
  • 扫描注解,不扫描controller
  • sessionTemplate(简化SQLSession的操作)
  • 转换器[使用Mapper来进行代理]
  • Mybatis映射文件
  • SpringMVC配置文件
  • 扫描controller,不扫描service
目录
相关文章
|
5月前
|
XML Java 数据格式
javaweb实训第五天上午——Spring基础(2)
添加文档声明和约束(这个东西不需要记忆):   (1)可以参考文档,中英文文档都可以;     ①spring-framework-4.1.2.RELEASE\docs\spring-framework-reference\pdf   (2)可以参考资源中的资料;   (3)可以百度spring的配置文件;   (4)也可以直接拿以下内容去修改
49 0
|
5月前
|
JSON 前端开发 Java
javaweb实训第五天下午——SpringMVC基础(4)
7.3.向页面传值 传递数据就是Controller往前台(页面)传递数据;
76 0
|
5月前
|
前端开发 Java 应用服务中间件
|
5月前
|
开发框架 前端开发 Java
javaweb实训第五天下午——SpringMVC基础(1)
1.课程介绍 SpringMVC概述; (了解) SpringMVC入门; (掌握) 前端控制器配置; (掌握) 业务控制器的三种实现; (掌握) 全注解; (掌握) 控制器常用操作(接收数据,向页面传值,重定向转发); (掌握)
51 0
|
5月前
|
Java 关系型数据库 MySQL
基于SpringBoot的冬奥会科普平台
基于SpringBoot的冬奥会科普平台
|
5月前
|
存储 安全 Java
基于ssm的经典电影推荐网站
基于ssm的经典电影推荐网站
|
5月前
|
前端开发 JavaScript Java
基于SSM的毕业设计流程管理系统
基于SSM的毕业设计流程管理系统
|
5月前
|
XML Java 测试技术
javaweb实训第五天上午——Spring基础(3)
5.2.1.方案一:使用@Autowired @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;
93 0
|
5月前
|
Java 数据库连接 API
javaweb实训第五天上午——Spring基础(1)
1.课程介绍 为什么需要Spring; (了解) 初识Spring; (了解) Spring入门; (掌握) Spring依赖注入; (掌握) Spring测试; (掌握) Spring配置细节; (掌握) 三层架构中Spring的使用; (掌握)
50 0
|
5月前
|
JSON Java 数据格式
javaweb实训第五天下午——SpringMVC基础(3)
7.控制器常用操作 控制器除了处理请求并返回视图以外,还需要一些事情,比如接收页面请求参数、绑定数据到页面、返回json数据、文件上传、文件下载等;
52 0