zoukankan      html  css  js  c++  java
  • SSM集成

    SSM集成
     
    Spring和各个框架的整合
     
    Spring目前是JavaWeb开发中最终的框架,提供一站式服务,可以其他各个框架整合集成
     
    Spring整合方案
     
    SSH
    Ssh是早期的一种整合方案
    Struts2 : Web层框架
    Spring : 容器框架
    Hibernate : 持久层框架
     
    SSM
    主流的项目架构的三大框架(相对其他框架而言,最优秀)
    SpringMVC : spring自己家的 Web层框架,spring的一个模块
    Spring :容器框架
    MyBatis :持久层框架
     
     
    Spring与MyBatis整合
    集成思路
    实际开发,使用Maven项目,直接引入项项目在Maven仓库中的坐标即可
     
    学习阶段: 手动导入jar包,从零开始集成(巩固基础知识)
     
    创建java项目
     
    准备集成相关jar包
    Spring依赖包
    SpringMVC依赖包
     
    Mybatis依赖包
    MyBatis和Spring框架集成的桥梁包
    Spring自己并没有集成MyBatis框架,需要MyBatis自己来集成,所以需要自己提供Spring框架集成的桥梁包
     
    如果我们使用的mybatis3.4.4 不能直接使用mybatis内置的 桥梁包版本,版本比较低,无法正常运行,需要单独下载一个比价高的版本
    数据库驱动包和连接池
     
    Jstl标签库依赖包
     
    Mybatis支持的日志包log4j
    项目集成需要各种配置文件
     
    Mapper层
    package cn.zj.ssm.mapper;
    import java.util.List;
    import cn.zj.ssm.pojo.User;
    public interface UserMapper {
     
    int insert(User user);
     
    User selectByPrimaryKey(Integer id);
     
     
    List<User> selectList();
     
    int delteByPrimaryKey(Integer id);
    }
     
    Mapperxml文件
    <?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 namespace="cn.zj.ssm.mapper.UserMapper">
     
    <insert id="insert" parameterType="cn.zj.ssm.pojo.User">
    insert into user (name,password,age)values(#{name},#{password},#{age})
    </insert>
     
    <select id="selectByPrimaryKey" parameterType="Integer" resultType="cn.zj.ssm.pojo.User">
    select * from user where id = #{id}
    </select>
     
    <select id="selectList" resultType="cn.zj.ssm.pojo.User">
    select * from user
    </select>
     
    <delete id="delteByPrimaryKey" parameterType="int">
    delete from user where id = #{id}
    </delete>
     
    </mapper>
     
    完成项目层与层之间spring对象的创建和依赖关系的维护
    Service层
    package cn.zj.ssm.service.impl;
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import cn.zj.ssm.mapper.UserMapper;
    import cn.zj.ssm.pojo.User;
    import cn.zj.ssm.service.UserService;
    @Service
    public class UserServiceImpl implements UserService {
    /*
    * 问题: UserMapper 代理对象如何创建?
    * 答 :使用 SqlSession 操作对象创建 !
    *
    * 问题 : SqlSession 对象如何创建?
    *
    * 答 : SqlSessionFactory 工厂对象创建?
    *
    * 问题: SqlSessionFactory 对象如何创建
    *
    * 1,和Spring框架集成之前
    * MyBatis框架自己读取配置文件中的相关配置去创建
    * 2, 和Spring框架集成之后
    * 交个Spring容器来创建
    * 问题: 如何在Spring框架中配置,创建出来SqlSessionFactory对象?
    * mybatis和spring集成的类查阅 桥梁包
    * org.mybatis.spring.SqlSessionFactoryBean 创建 SqlSessionFactory
    *
    */
    @Autowired
    private UserMapper mapper;
     
    @Override
    public int insert(User user) {
    return mapper.insert(user);
    }
    @Override
    public User selectByPrimaryKey(Integer id) {
    System.out.println(mapper);
    return mapper.selectByPrimaryKey(id);
    }
    @Override
    public List<User> selectList() {
    return mapper.selectList();
    }
    @Override
    public int delteByPrimaryKey(Integer id) {
    return mapper.delteByPrimaryKey(id);
    }
     
     
    }
    测试代码
    package cn.zj.ssm.test;
    import java.util.List;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import cn.zj.ssm.pojo.User;
    import cn.zj.ssm.service.UserService;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:spring.xml")
    public class UserServiceTest {
     
    @Autowired
    private UserService service;
    @Test
    public void testInsert() {
    User user = new User(null, "乔峰", "qiaofeng", 30);
    int row = service.insert(user);
    System.out.println(row);
     
    }
    @Test
    public void testSelectByPrimaryKey() {
    User user = service.selectByPrimaryKey(8);
    System.out.println(user);
    }
     
    @Test
    public void testSelectList() throws Exception {
    List<User> users = service.selectList();
     
    for (User user : users) {
    System.out.println(user);
    }
    }
    }
     
    applicationContext配置文件的配置
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    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
    ">
     
     
    <!-- 设置注解配置包扫描位置 -->
    <context:component-scan base-package="cn.zj.mybatis"/>
    </beans>
     
    MyBatis 框架SqlSessionFactory对象的创建
     
    * 问题: UserMapper 代理对象如何创建?
    * 答 :使用 SqlSession 操作对象创建 !
    *
    * 问题 : SqlSession 对象如何创建?
    *
    * 答 : SqlSessionFactory 工厂对象创建?
    *
    * 问题: SqlSessionFactory 对象如何创建
    *
    * 1,和Spring框架集成之前
    * MyBatis框架自己读取配置文件中的相关配置去创建
    * 2, 和Spring框架集成之后
    * 交个Spring容器来创建
    * 问题: 如何在Spring框架中配置,创建出来SqlSessionFactory对象?
    * mybatis和spring集成的类查阅 桥梁包
    * org.mybatis.spring.SqlSessionFactoryBean 创建 SqlSessionFactory
    *
    */
    创建MyBatis框架工厂对象的 类在mybatis-spring1.2.1.jar 桥梁包中的
    org.mybatis.spring.SqlSessionFactoryBean 类 如下图
     
    配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    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"/>
    <!-- 配置数据源连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="maxActive" value="${jdbc.maxActive}"/>
    </bean>
     
     
    <!--
    配置MyBatis框架的 SqlSessionFactoryBean 类,创建
     
    SqlSessionFactory 工厂对象
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 1.注入数据源 -->
    <property name="dataSource" ref="dataSource"/>
     
     
    <!-- 2.配置映射文件 -->
    <property name="mapperLocations">
    <array>
    <!-- <value>classpath:cn/zj/mybatis/mapper/UserMapper.xml</value> -->
    <!-- 可以使用通配符 * 读取 目录下面所有的配置文件 -->
    <value>classpath:cn/zj/mybatis/mapper/*Mapper.xml</value>
    </array>
    </property>
     
    <!-- 3. 配置别名使用包扫描 -->
    <property name="typeAliasesPackage" value="cn.zj.mybatis.pojo"/>
     
    <!-- 4.读取mybat-config.xml配置文件,此配置文件可能还会配一些mybatis框架的
    其他个性化配置
    实际项目开发可能不用配置
    -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    </beans>
    创建MyBatis的Mapper接口的代理对象
    使用桥梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 创建 UserMapper代理对象
     
    此种方式每一个Mapper接口需要单独配置,如果Mapper过多,创建Mapper可能造成配置代码过多
    <!-- 创建UserMapper代理对象-创建单个Mapper对象
     
    使用桥梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 创建 UserMapper代理对象
    -->
     
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
     
    <!-- 注入SqlSessionFacotry对象 -->
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
     
    <!-- 注入UserMapper接口类型:底层创建UserMapper的代理对象 -->
    <property name="mapperInterface" value="cn.zj.mybatis.mapper.UserMapper"/>
     
    </bean>
     
     
    使用包扫描创建MyBatis的Mapper接口的代理对象
     
     
    <!-- 批量创建Mapper代理对象 ,使用包扫描创建Mapper代理对象
    使用桥梁包
    org.mybatis.spring.mapper.MapperScannerConfigurer
    -->
     
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 配置需要创建Mapper接口代理对象对应的包 -->
    <property name="basePackage" value="cn.zj.mybatis.mapper"/>
     
    <!-- 配置SqlSessionFactoryBean 的名称,不是引用 -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
     
    MyBatis的事务管理器的配置
    一般开发,事务的管理都会使用aop切入到业务层
     
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 注入数据源 -->
    <property name="dataSource" ref="dataSource"/>
    </bean>
     
    <!-- spring事务配置 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
     
    <!-- 事务属性配置 -->
    <tx:attributes>
    <!-- DQL :查询操作,配置只读事务 -->
    <tx:method name="get*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
    <tx:method name="select*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
    <tx:method name="find*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
    <tx:method name="query*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
     
    <!-- 其他 SQL :非只读事务 -->
    <tx:method name="*" read-only="false" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
     
    </tx:attributes>
     
    </tx:advice>
     
    <!-- 配置AOP 切入事务 -->
     
    <aop:config>
    <!-- 切入点 -->
    <aop:pointcut expression="execution(* cn.zj.mybatis.service..*.*(..))" id="pt"/>
     
    <!-- 切面 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>
     
    SpringMVC的集成
    在在web.xml配置SpringMVC的前端控制器
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
     
    <!-- 配置字符编码过滤器 -->
    <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>
     
     
    <!-- 配置前端控制器 -->
    <servlet>
    <servlet-name>MVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
     
    <!-- 读取配置文件
    问题:有多个spring相关配置文件如何读取
    如 :spring.xml 和springmvc.xml
     
    解决方案:
    方案一:直接使用 统配 * 可以读取多个有相同前缀的文件
    <param-value>classpath:spring*.xml</param-value>
    方案二:先读取一个配置文件 如果 spring.xml
    再在spring.xml文件中使用<import>标签导入 springmvc.xml文件
    <import resource="classpath:springmvc.xml"/>
    -->
     
    <param-value>classpath:spring.xml</param-value>
    </init-param>
     
    <load-on-startup>1</load-on-startup>
     
    </servlet>
    <servlet-mapping>
    <servlet-name>MVC</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    </web-app>
    springmvc.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
    ">
    <!-- 配置springmvc的注解驱动 -->
    <mvc:annotation-driven/>
     
    </beans>
     
     
    编写控制器 UserController
    package cn.zj.ssm.controller;
    import java.util.List;
    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 cn.zj.ssm.pojo.User;
    import cn.zj.ssm.service.UserService;
    @Controller
    @RequestMapping("/user")
    public class UserController {
     
    @Autowired
    private UserService service;
     
    @RequestMapping("/list")
    public String list(Model m) {
     
    //调用service查询所有用户方法
    List<User> users = service.selectList();
     
    //共享数据
    m.addAttribute("users", users);
     
    return "/WEB-INF/view/user_list.jsp";
    }
     
     
    @RequestMapping("/delete")
    public String delete(Integer id) {
    System.out.println(id);
     
    //调用service层的删除方法
    service.delteByPrimaryKey(id);
     
    return "redirect:/user/list.do";
    }
     
    }
     
    user_list.jsp 页面
    在jsp页面 使用jstl标签库需要先在页面引入jstl 标签库
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 引入jstl标签库 -->
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h3>用户列表</h3>
    <table border="1" style="width: 500px;" cellspacing="0">
    <tr>
    <th>id</th>
    <th>名称</th>
    <th>密码</th>
    <th>年龄</th>
    <th>操作</th>
    </tr>
    <c:forEach items="${users}" var="user">
    <tr>
    <td>${user.id}</td>
    <td>${user.name}</td>
    <td>${user.password}</td>
    <td>${user.age}</td>
    <td>
    <a href="javascript:void(0);" onclick="deleteByPrimaryKey(${user.id})">删除</a> &nbsp;&nbsp;
    <a href="">修改</a>
    </td>
    </tr>
    </c:forEach>
    </table>
     
    <script type="text/javascript">
     
    function deleteByPrimaryKey(userId){
     
    if(confirm("亲,您确定删除此条数据么?")){
    window.location.href= "${pageContext.request.contextPath}/user/delete.do?id="+userId;
    }
    }
    </script>
    </body>
    </html>
     
  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/aknife/p/11028983.html
Copyright © 2011-2022 走看看