SSM笔记

一. spring容器和springmvc容器

父容器和子容器

  • SSM框架中有两个容器,一个是spring容器,称为父容器,一个是springmvc容器,称为子容器.
  • spring容器包含springmvc子容器.

服务器启动时,spring容器先初始化,springmvc后初始化

  • spring容器看不到springmvc容器中注册的bean , springmvc可以看到spring容器中注册的bean
  • 父容器不可以使用子容器中的bean( 比如service中调用controller),而子容器可以使用父容器中的bean(比如controller调用service)

springmvc容器在查找handler时,只会在springmvc容器中查找

  • springmvc配置文件中必须扫描controller包,这样springmvc容器才能正确映射
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <context-param>
    <param-name>contextConfigLocation</param-name>
    <!--路径下是spring容器的配置文件-->
    <param-value>classpath:spring/applicationContext-*.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc/applicationContext-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


</web-app>

服务器正常开启, 页面正常访问(推荐)

spring配置文件:            <context:component-scan base-package="com.hrh.service.impl"/>

springmvc配置文件:     <context:component-scan base-package="com.hrh.controller"/>

 服务器正常开启, 页面正常访问

spring配置文件:            扫描所有包<context:component-scan base-package="com.hrh"/>

springmvc配置文件:     <context:component-scan base-package="com.hrh.controller"/>

 服务器正常开启,访问页面发现404,因为在springmvc子容器中没有发现handler

spring配置文件:            扫描所有包<context:component-scan base-package="com.hrh"/>

springmvc配置文件:     不扫描包

测试:在service层调用controller

服务器开启异常, 异常为service中的controller不能注入,因为springr容器不能使用springmvc容器中的bean

spring配置文件:            <context:component-scan base-package="com.hrh.service.impl"/>

springmvc配置文件:     <context:component-scan base-package="com.hrh.controller"/>

服务器正常开启,页面正常访问,因为所有bean都在springmvc容器中注册(不推荐,扩展性差)

spring配置文件:            不扫描包

springmvc配置文件:     扫描所有包<context:component-scan base-package="com.hrh"/>

 

二.逆向工程

mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、pojo)。

  • pom添加插件和依赖
  • 配置文件
  • 运行拆件,生成文件
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <configuration>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!--mysql 连接数据库jar 这里选择自己本地位置-->
    <classPathEntry location="E:/MyTools/repository_maven/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar" />

    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis_db"
                        userId="root"
                        password="123">
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.hrh.pojo"
                            targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置
           如果maven工程只是单独的一个工程,targetProject="src/main/java"
           若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
           targetProject="ecps-manager-mapper",下同-->
        <sqlMapGenerator targetPackage="com.hrh.mapper"
                         targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.hrh.mapper"
                             targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <table schema="" tableName="tb_user" domainObjectName="User"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="true"
               selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

 

mapper接口的方法

方法功能说明
int countByExample(UserExample example) thorws SQLException按条件计数
int deleteByPrimaryKey(Integer id) thorws SQLException按主键删除
int deleteByExample(UserExample example) thorws SQLException按条件查询
String/Integer insert(User record) thorws SQLException插入数据(返回值为ID)
User selectByPrimaryKey(Integer id) thorws SQLException按主键查询
ListselectByExample(UserExample example) thorws SQLException按条件查询
ListselectByExampleWithBLOGs(UserExample example) thorws SQLException按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。
int updateByPrimaryKey(User record) thorws SQLException按主键更新
int updateByPrimaryKeySelective(User record) thorws SQLException按主键更新值不为null的字段
int updateByExample(User record, UserExample example) thorws SQLException按条件更新
int updateByExampleSelective(User record, UserExample example) thorws SQLException按条件更新值不为null的字段

 

Exaple实例解析

mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分  xxxExample example = new xxxExample();

Criteria criteria = new Example().createCriteria();

方法说明
example.setOrderByClause(“字段名 ASC”);添加升序排列条件,DESC为降序
example.setDistinct(false)去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull添加字段xxx为null的条件
criteria.andXxxIsNotNull添加字段xxx不为null的条件
criteria.andXxxEqualTo(value)添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value)添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value)添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value)添加xxx字段大于等于value条件
criteria.andXxxLessThan(value)添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value)添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>)添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>)添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”)添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”)添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)添加xxx字段值不在value1和value2之间条件

三.通用Mapper

优快云博主 : abel533

适用单表CRUD

  • 导入依赖
  • 配置插件
  • 继承接口
  • 设置实体类字段
<dependency>
	<groupId>com.github.abel533</groupId>
	<artifactId>mapper</artifactId>
	<version>4.0.4</version>
</dependency>
<?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"/>
    </settings>

    <plugins>
        <!-- 配置分页助手的插件 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 指定数据库方言 -->
            <property name="dialect" value="mysql"/>
            <!-- 设置为true时,查询结果中会查询出总条数信息 -->
            <property name="rowBoundsWithCount" value="true"/>
        </plugin>

        <!-- 通用Mapper的插件 -->
        <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
            <!--主键自增回写方法,默认值MYSQL -->
            <property name="IDENTITY" value="MYSQL" />
            <!--通用Mapper默认接口,我们定义的Mapper需要实现该接口 -->
            <property name="mappers" value="com.github.abel533.mapper.Mapper" />
        </plugin>
    </plugins>

</configuration>
package com.hrh.mapper;

import com.github.abel533.mapper.Mapper;
import com.hrh.pojo.User;

public interface AutoUserMapper extends Mapper<User> {
}

 

四.RESTful

REST 仅仅是一种架构的风格,并不是真正的架构,也不是一个软件,而是一种思想。

我们可以基于现有的HTTP、URI、XML、等现有技术来实现REST的风格。而不用去学习任何新的技术。

SpringMVC天生也是支持REST标准的。

我们可以发现REST其实是一种组织Web服务的架构风格,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP。其目标是为了创建具有良好扩展性的分布式系统。它提出了一系列架构级约束。这些约束有:

  • 使用客户/服务器模型。

    客户和服务器之间通过一个统一的接口来互相通讯。

  • 层次化的系统

    在一个REST系统中,客户端并不会固定地与一个服务器打交道。

  • 无状态

    在一个REST系统中,服务端并不会保存有关客户的任何状态。也就是说,客户端自身负责用户状态的维持,并在每次发送请求时都需要提供足够的信息。 Http协议本身就是无状态的协议。

  • 可缓存

    REST系统需要能够恰当地缓存请求,以尽量减少服务端和客户端之间的信息传输,以提高性能。

  • 统一的接口

    一个REST系统需要使用一个统一的接口来完成子系统之间以及服务与用户之间的交互。这使得REST系统中的各个子系统可以独自完成演化。

     

如果一个系统满足了上面所列出的五条约束,那么该系统就被称为是RESTful的。

响应状态码

package com.hrh.controller;

import com.hrh.domain.User;
import com.hrh.service.AutoUserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/rest/user")
public class RestUserController {

    @Value("#{autoUserService}")
    private AutoUserService autoUserService;

    /**
     * 根据id 查询用户
     * @param id
     * @return
     */
    @RequestMapping(value="/{id}", method = RequestMethod.GET)
    public ResponseEntity<User> queryUserById(@PathVariable("id") Long id) {
        try {
            // 查询用户
            User user = autoUserService.queryUserById(id);
            if (user != null) {
                // 资源存在 返回200
                return new ResponseEntity<User>(user, HttpStatus.OK);
            } else {
                // 资源不存在 返回404
                return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            }
        }catch (Exception e) {
            e.printStackTrace();
            // 出现异常, 返回 500
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

}

Java本身是不支持PUT和DELTE请求,当发起这些请求时,可以接收,但是请求参数接收不到!

<!-- SpringMVC解决PUT请求的参数为null问题 -->
	<filter>
		<filter-name>HttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

这个过滤器并不能真正的去解决DELETE请求问题,而是需要在页面发请求时,满足两点:

1) 依然发POST请求,

2) 同时传递_method参数,指定要模拟的请求方式

<!-- 通过POST请求传递参数,再用_method指定要转化的请求方式(DELETE或PUT),最后转为DELETE或PUT请求 -->
	<filter>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值