• SSM搭建手册


    Spring MVC框架

    Spring MVC 框架围绕DispatcherServlet这个核心展开,DispatcherServlt是Spring MVC的总导演,总策划,它负责截获请求并将其分派给相应的处理器。Spring MVC框架包含注解驱动控制器,请求及响应的信息处理、视图解析、本地化解析、上传文件解析、异常处理以及表单标签绑定等内容。

    Spring MVC和Struts2两者皆用于控制层的开发

    Spring MVC 属于Spring框架的后续产品,是Spring框架中的模块之一。

    Spring MVC与Struts2区别

    相比于Struts2框架的复杂臃肿,Spring MVC 更为精简

    1.Spring MVC可以使用单例开发,建议使用单例开发

    2.性能比Sturts2好,如果使用struts2框架,建议使用JSTL标签库

    3.学习成本低,学起来非常简单,开发控制器就像是开发Service

    4.和Spring是一家的,无需整合,可直接使用IOC,DI,AOP特征

    Spring MVC运行原理

    1.浏览器请求提交至DispatcherServlet前端控制器;

    2.DispatcherServlet控制器调用DefaultAnnotationHandlerMapping,以查找与请求地址相对应的控制器;

    3.DefaultAnnotationHandlerMapping找到对应的控制器及其方法,并将结果返回给DispatcherServlet;

    4.DispatcherServlet将请求传递至AnnotationMethodHandlerAdapter组件,以适配调用控制器的方法;

    5.AnnotationMethodHandlerAdapter适配调用控制器的方法,适配内容包括方法的参数列表和返回值;

    6.控制器方法处理请求,并将结果返回至AnnotationMethodHandlerAdapter;

    7.AnnotationMethodHandlerAdapter将返回结果封装到ModelAndView对象,进而返回给DispatcherServlet;

    ModelAndView:包含了处理结果的视图和视图中要使用的数据

    8.DispatcherServlet基于ModelAndView对象调用ViewResolver,以查找指定的视图;

    9.ViewResolver查找并确定视图,并返回给DispatcherServlet;

    10.DispatcherServlet调度视图,视图负责将结果显示到客户端。

    Spring MVC Web应用开发步骤

    1.导入Spring MVC所需库文件(.jar文件)

    spring-web-x.x.x.RELEASE.jar

    spring-webmvc-x.x.x.RELEASE.jar

    spring-webmvc-portlet-x.x.x.RELEASE.jar

    2.在Web.xml中配置 Spring MVC 核心Servlet

    Spring容器监听

    复制代码
    <!–  支持业务层,持久层的相关配置 -->
    
      <context-param>
    
       <param-name>contextConfigLocation</param-name>
    
       <param-value>classpath:applicationContext.xml</param-value>
    
      </context-param>
    
      <listener>
    
      <listener-class>
    
    org.springframework.web.context.ContextLoaderListener
    
    </listener-class>
    
      </listener>
    复制代码

    统一网站字符集编码

    复制代码
     <!-- 统一网站字符编码 -->
    
      <filter>
    
        <filter-name>CharacterEncodingFilter</filter-name>
    
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    
    
        <init-param>
    
            <param-name>forceEncoding</param-name>
    
            <param-value>true</param-value>
    
    </init-param>
    
        <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>
    复制代码

     DispatcherServlet配置

    复制代码
    <!-- 配置Spring MVC 核心控制器DispatcherServlet -->
    
      <servlet>
    
        <servlet-name>DispatcherServlet</servlet-name>
    
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
        <!-- 如果值为大于0的整数,在Web容器启动时立即加载并实例化(设置启动加载级别:值越小加载级别越大) -->
    
        <load-on-startup>1</load-on-startup>
    
      </servlet>
    
      <!-- 缺省配置:不要写/* 注意:这样配置会拦截静态资源(html,css,js,img...)后边需要进行放行处理。 -->
    
      <servlet-mapping>
    
        <servlet-name>DispatcherServlet</servlet-name>
    
    <url-pattern>/</url-pattern>
    
     </servlet-mapping>
    复制代码

    修改Spring MVC 配置文件默认位置(在DispatcherServlet中配置,在加载顺序之前)

    复制代码
        <!-- 修改SpringMVC配置文件默认位置 -->
    
        <init-param>
    
            <param-name>contextConfigLocation</param-name>
    
            <param-value>classpath:SpringMVC配置文件名</param-value>
    
        </init-param>
    复制代码

    3.配置Spring MVC 配置文件

    缺省情况下,Spring MVC 配置文名称为 <核心Servlet名称>-servlet.xml,默认存放在WEB/INF下,可以通过init-param来指定位置和文件名

    Sping命名空间

    复制代码
    <beans xmlns="http://www.springframework.org/schema/beans"
    
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
           xmlns:context="http://www.springframework.org/schema/context"
    
           xmlns:mvc="http://www.springframework.org/schema/mvc"
    
           xmlns:aop="http://www.springframework.org/schema/aop"
    
           xmlns:tx="http://www.springframework.org/schema/tx"
    
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
           http://www.springframework.org/schema/context
    
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
    
           http://www.springframework.org/schema/mvc
    
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    
           http://www.springframework.org/schema/aop
    
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    
           http://www.springframework.org/schema/tx
    
           " >http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    
    </beans>
    
     
    
        <!-- 配置包扫描 -->
    
        <context:component-scan base-package="所需扫描包" use-default-filters="false">
    
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    
    </context:component-scan>
    
        
    
        <!-- 指定Spring容器对Spring MVC相关组件的注解进行注册。相当于配置HandlerMapping和HandlerAdapter -->
    
        <mvc:annotation-driven/>
    
        
    
        <!-- 放行静态资源(img,css...),交给默认的tomcat去处理,如果前端控制器配置的是/,这个地方必须配置 -->
    
        <mvc:default-servlet-handler/>
    
        
    
        <!-- 定义视图解析器  此处ID可以不指定 -->
    
        <bean id="defaultViewResolver" class='org.springframework.web.servlet.view.InternalResourceViewResolver'>
    
          <!-- 配置前缀和后缀:控制器返回的url会经过视图解析器解析最终的url是:前缀+url+后缀 -->
    
          <property name="prefix" value="/" />
    
          <property name="suffix" value=".jsp" />
    
    </bean>
    
    Spring是父容器,Spring MCV 是子容器
    复制代码

     4.编写控制器

    复制代码
    import org.springframework.context.annotation.Scope;
    
    import org.springframework.stereotype.Controller;
    
    import org.springframework.ui.Model;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
     
    
    @Controller
    
    @Scope(value="prototype")
    
    @RequestMapping("/springmvc")
    
    public class SimpleController {
    
      @RequestMapping("/test")
    
      public String test(Model model) {
    
        model.addAttribute("message", "Hello world!");
    
        return "HelloWorld";
    
      }
    
    }
    复制代码

     5.编写JSP页面

    可通过EL表达式获取model中的属性的对象值  

    Spring MVC 高级特性

    Restful风格

    @PathVariable

    Spring MVC 可以通过@RequestMapping 指定请求路径,同时也支持rest风格。例如

    http://localhost:8080/springmvc/user/{id}    

    {id} 为占位符。Java代码示例如下:

    复制代码
    @RequestMapping(“/user/{id}”)
    
    public  ModelAndView  queryUserById(
    
    @PathVariable(“id”) Integer id) {
    
    //此处省略
    
    }
    复制代码

    使用@PathVariable 这个注解进行标识,在请求的时候,会把请求中的{id}的值直接注入到 方法的参数id中,如果在类的上面使用占位符,同样可以进行注入。

    一个简单的页面跳转

    复制代码
    import org.springframework.context.annotation.Scope;
    
    import org.springframework.stereotype.Controller;
    
    import org.springframework.web.bind.annotation.PathVariable;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
     
    
    @Controller
    
    @Scope("prototype")
    
    @RequestMapping("/forward")
    
    public class SimpleForwardController {
    
     
      @RequestMapping("/{page}")
    
      public String forwardPage(@PathVariable("page") String page) {
    
        return page;
    
      }
    
    }
    复制代码

    静态资源处理

    使用Rest风格的URL不希望后缀名是.do,.htm等格式,优雅的格式为  http://localhost:8080/springmvc/test/java  :java模块

    http://localhost:8080/springmvc/test/user :  用户模块

    早期的springmvc不能很好的处理静态资源,所以通常会以.do , .htm等形式结尾。如果在DispatcherServlet中配置url-pattern为“/” 那么spring默认为处理所有请求,包括静态资源的请求。Spring MVC会把它作为一个普通的请求,如果找不到,则会抛出异常。Spring  rest风格是3.0版本的重要特征,所以该团队在处理静态资源文件的时候,做出了非常的多的努力,最终通过两种实现方式来处理静态资源文件。

    1、<mvc:default-servlet-handler />  

    一般服务器包括tomcat, weblogic , jboss , jetty ,webshpare等默认servlet的名称为default ,如果你使用的服务器的默认值不是default,需要通过属性default-servlet-name指定你服务器的默认值

    2、 <mvc:resources />

    该标签允许静态资源放在服务器的任何位置,包括WEB-INF, classpath下等,甚至可以打包到jar中,通过location指定静态资源的位置。

    <mvc:resources location="/js/" mapping="/**"/>

    <mvc:resources location="/images/" mapping="/iamges/**"/>

    <mvc:resources location="/css/" mapping="/css/**"/>

    3、<mvc:annotation-driven />

    如果仅仅使用上面两个标签,那么系统会找不到我们的资源。

    Json处理

    Spring MVC的MappingJascksonJsonView借助Jackson框架的ObjectMapper将模型数据转换为Json格式输出。

    Json视图解析器

    由于MappingJacksonJsonView 也是一个bean,可以通过BeanNameViewResolver进行解析,因此需要在springmvc配置文件中配置:

    复制代码
    <!-- 默认情况会把模型中的所有都输出json,可以通过renderedAttributes指定输出的内容 -->
    
    <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
    
        <property name=“renderedAttributes”   value=“userList“ />
    
    </bean>
    
    <!-- 需要使用bean视图解析器 -->
    
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="10" />
    
     
    
    简单测试:
    
    @RequestMapping("getJson")
    
    public String getJson(ModelMap map){
    
    User user = userService.getUserByUserId(1);
    
    map.put("userList", userList);
    
    map.put("jsonList1", "这是一个测试字符串");
    
    return "jsonView" ;
    
    }
    复制代码

    @ResponseBody注解

    该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

    使用时机:

    返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。

    防止IE下载

    复制代码
    <!-- 防止IE下载 -->
    
        <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    
            <property name="supportedMediaTypes">
    
                <list>
    
                    <value>text/html;charset=UTF-8</value>
    
                </list>
    
            </property>
    
        </bean>
    
        
    
        <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    
            <property name="supportedMediaTypes">
    
                <list>
    
                    <value>text/html;charset=UTF-8</value>
    
                </list>
    
            </property>
    
        </bean>
    
        
    
        <util:list id="messageConverters">
    
            <ref bean="mappingJackson2HttpMessageConverter"/>
    
            <ref bean="stringHttpMessageConverter"/>
    
        </util:list>
    复制代码

    文件上传功能

    Spring MVC 提供了对文件的上传支持,这种支持是通过即插即用的MultipartResolver实现的。Spring通过Jakarta   Commons FileUpload 技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。

    Spring在上下文中默认是没有配置MultipartResolver的,因此默认情况下不能支持文件上传的工作,如果想要使用文件上传的工作,那么需要先配置MultipartResolver,配置如下:

    复制代码
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" />
    
    <!-- 上传临时路径 -->
    
    <property name="uploadTempDir" value="upload/temp"></property>
    复制代码

    拦截器

    继承HandlerInterceptorAdapter类

    实现HandlerInterceptor接口

    boolean preHandler(request,response,handler) :

    在请求到达handler之前,先执行这个前置处理方法,当该方法返回false,则直接返回,不会传递到下一个拦截器中,更不会调用处理器链末端的handler中,只有返回true是请求才向链中的下一个处理节点传递。

    void postHandler(request,response,handler, mav)

    在请求被Handler执行后,执行这个方法做后置处理

    void afterCompletion(req, resp , handler , exception)

    在相应已经被渲染后,执行该方法。

    Springmvc配置文件如下:

    复制代码
    <mvc:interceptors>
    
    <mvc:interceptor>
    
    <mvc:mapping path="/**/*"/>
    
    <mvc:exclude-mapping path="/user/login"/>
    
    <mvc:exclude-mapping path="/easyui/**"/>
    
    <mvc:exclude-mapping path="/images/**"/>
    
    <mvc:exclude-mapping path="/jquery/**"/>
    
    <mvc:exclude-mapping path="/js/**"/>
    
    <bean class=“com.r863.spring.interceptor.SessionInterceptor" />
    
    </mvc:interceptor>
    
    </mvc:interceptors>
    复制代码

    异常处理器

    Spring MVC对异常的处理提供了一个视图处理类:SimpleMappingExceptionResoler

    复制代码
        <!-- 定义一个异常视图处理器 -->
    
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    
            <property name="exceptionMappings">
    
                <props>
    
                    <!-- <prop key="异常全类名1">对应的视图1</prop> -->
    
                    <prop key="com.r863.spring.exception.MyServiceException">error</prop>
    
                    <prop key="java.lang.NullPointerException">error1</prop>
    
                </props>
    
            </property>
    
            
    
            <property name="statusCodes">
    
                <props>
    
                    <prop key="error">500</prop>
    
                    <prop key="error1">501</prop>
    
                </props>
    
            </property>
    
    </bean>
    复制代码

    XML配置Spring MVC

    配置文件:

    复制代码
    <bean id="xmlConfigController" class="com.r863.spring.controller.XmlConfigController" scope="prototype">
    
    <property name="methodNameResolver" ref="methodNameResolver" />
    
    </bean>
    
    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
    
    <property name="paramName" value="action" />
    
    </bean>
    
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    
    <property name="mappings">
    
    <props>
    
    <prop key="/xmlConfig">xmlConfigController</prop>
    
    </props>
    
    </property>
    
    </bean>
    复制代码

    --  XmlConfigController  需要继承 MultiActionController  

    访问地址为:http://localhost:8080/springmvc/xmlConfig?action=login

     loginXmlConfigController 中的一个方法名

    注解控制器的规则

    参数类型

    在处理HTTP请求时,AnnotationMethodHandlerAdapter组件负责调用指定的请求处理方法。它可以根据方法的参数列表不同,生成对应类型的参数,进而调用请求处理方法。

    对于控制器中方法,Spring支持以下参数类型:

    HttpServletRequestHttpServletResponse以及HttpSession

    @RequestParam注解

    任意JavaBean对象

    Model与ModelAndView或Map  

    返回类型

    返回值被交由ViewResolver组件进行解析,将其解析为最终转发的JSP页面URL

     

    重定向及转发

    return "forward:xxxURL";

    return "redirect:xxxURL";

    注意:如果使用转发或重定向的话,返回路径不会经过视图解析器的解析,需要手动添加。

    ModelAndView类型

    Spring MVC 内置类,包含ModelView两个对象,分别用于封装数据和转发视图。

    addObject(name,value);//request作用域中设置数据

    setViewName(url);  //设置响应的视图URL

    String类型

    Model、ModelMap、Map与void

    其中Model和ModelMap均为Spring MVC 内置类。

    注意:返回视图名称与请求URL相同

    MyBatis ORM 框架

    Mybatis是世界上流行最广泛的SQL映射框架,由Clinton Begin在2002年创建,后捐献给Apache基金会,成立了iBatis项目,该项目是O/R Mapping解决方案。2010年5月,将代码库迁至Google Code,并更名为MyBatis

    MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码,手工设置参数和结果集重获。MyBatis只使用简单的XML和注解来配置和映射基本数据类型,接口和POJO到数据库记录

    MyBatis框架:半自动化的ORM框架

    优点:

    1需要编写sql语句,对sql优化和维护比较方便

    2学习成本低,学起来非常简单

    缺点:

        1开发效率不如hibernate,数据库移植性差

        2缓存机制不是很好,需要使用第三方日志统计:log4j

    适用于:需求量变化比较频繁的项目  例:互联网项目...

    框架Hibernate框架:全自动化的ORM框架

    优点:

    1不需要编写SQL语句,自动生成sql

    2开发效率非常快

    3数据库移植性好,提供了HQL语句

    4缓存机制比较好,自带日志统计

    缺点:

    1相比于mybatis,维护性比较差,修改sql语句比较麻烦

    2性能没有Mybatis好,学习成本高,入门门槛高

           

           适用于:需求量变化不大的项目(中小型项目) 例:后台管理系统,OA...

    MyBatis系统架构

    API接口层

    提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。

    接口层接收到调用请求后,会调用数据处理层来完成具体的数据处理。

    数据处理层

    负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。

    其主要目的是根据调用请求完成一次数据库操作。

    基础支持层

    负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理。

    为其上的数据处理层提供最基础的支撑。

    MyBatis开发步骤

    1.导入MyBatis所需库文件(jar包)

    commons-logging-x.x.x.jar

    mybatis-x.x.x.jar处理mybatis的核心jar

    jar包可以从 http://www.mvnrepository.com网站获取

    2.编写MyBatis配置文件

    在MyBatis应用程序中,需要提供以下配置文件:

    数据库连接属性文件,例如database.properties(Mysql数据库为例)

    Mybatis主配置文件(XML格式),例如config.xml

    数据库连接资源文件

    dirver=com.mysql.jdbc.Driver

    url=jdbc:mysql://localhost:3036/数据库名

    username=root

    password=1234

    XML创建SqlSessionFactory

    复制代码
    <?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> 
    
        <!-- 配置别名 -->
    
        <typeAliases>
    
            <typeAlias alias="别名" type="类的完全限定名"/>
    
        </typeAliases>
    
        <!-- 环境集 -->
    
        <environments default="development">
    
            <!-- 环境,数据库的连接 -->
    
            <environment id="development">
    
            <!-- 事务管理器 -->
    
                <transactionManager type="JDBC"/>
    
                <!-- 数据源 -->
    
                <dataSource type="POOLED">
    
                    <property name="driver" value="${driver}"/>
    
                    <property name="url" value="${url}"/>
    
                    <property name="username" value="${username}"/>
    
                    <property name="password" value="${password}"/>
    
                </dataSource>
    
            </environment>
    
        </environments>
    
        <mappers> 
    
            <!-- 加载映射语句配置文件:XXXMapper.xml -->
    
            <mapper resource="com/mybatis/dao/XXXMapper.xml"/> 
    
        </mappers> 
    
    </configuration>
    复制代码

    3.声明实体类

    MyBatis实体类与普通JavaBean无任何区别。需注意:类中属性名应与数据库字段名相对应。

    4.声明映射接口及映射配置

    创建持久层文件:声明映射接口

    MyBatis映射接口相当于DAO,用于提供将对象映射为数据库关系的操作方法。

    当程序运行时,MyBatis可基于该接口自动生成实现类,而无须手动编写。但须提供与之接口对应的XML映射配置文件。

    创建映射文件:mapper文件

    映射配置文件通常与接口名称一致:XXXMapper.xml。

    复制代码
    <?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="XXXMapper关联接口完全限定名">
    
    </mapper>
    复制代码

    namespace

    指定映射文件所对应的映射接口

    #{}与${}

    #{}MyBatis会对属性自动解析

    ${}不可变字符串

    Select

    最基本写法:

        <select id="接口中对应的方法" parameterType="参数类型" resultType="返回类型">
    
            select语句
    
        </select>

    省略参数类型:

    <select id="接口中对应的方法" resultType="返回值类型">
    
            select语句
    
    </select>

    sql

    定义重用的sql语句:

    复制代码
    <sql id="xxx_column"> 字段名,字段名 </sql>
    
    <select id="接口中对应的方法" resultType="返回值类型">
    
    select <include refid="xxx_column"/> from xxx;
    
    </select>
    复制代码

    分页查询:

    Mysql分页:

    <select id="接口中对应的方法" resultType="返回值类型">
    
    select <include refid="xxx_column"/> from xxx limit #{0},#{1} ;
    
    </select>

    Oracle分页:

    <select id="接口中对应方法" parameterType="参数类型" resultType="返回值类型">
         <include refid="common.header"></include>
             select语句
         <include refid="common.footer"></include>
    </select>

    创建base.xmlMapper共同文件,需要另外加载映射。

    复制代码
    <?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="common">
    
        <sql id="header">
    
           select * from ( select a.* , rownum r from (
    
        </sql>
    
        <sql id="footer">
    
              ) a
    
            ) b where b.r > #{start} and b.r <= #{end}
    
        </sql>
    
    </mapper>
    复制代码

    insert

    Mysql插入:

    复制代码
        <insert id="接口中对应的方法" parameterType="参数类型" useGeneratedKeys="true"
    
        keyProperty="id名">
    
            insert into xxx(字段,字段)
    
            values(#{属性},#{属性})
    
        </insert>
    复制代码

    Oracle插入:

    复制代码
        <insert id="接口中对应的方法" parameterType="参数类型">
    
            insert into xxx(字段,字段)
    
            values(#{属性},#{属性})
    
            <selectKey keyColumn="id" keyProperty="id名" order="BEFORE" resultType="int">
    
                select 序列.nextval from dual
    
            </selectKey>
    
        </insert>
    复制代码

    update

    复制代码
    <update id="接口中对应的方法" parameterType="参数类型">
    
            update xxx set
    
            字段=#{属性},
    
            字段=#{属性},
    
            字段=#{属性}
    
            where id=#{属性};
    
    或采用占位符
    
            update xxx set
    
            字段=#{1},
    
            字段=#{2},
    
            字段=#{3}
    
            where id=#{0};
    
        </update>  
    复制代码

    parameterType可省略

    delete

        <delete id="接口中对应的方法" parameterType="参数类型">
    
            delete from xxx where lid=#{属性};
    
        </delete>

    parameterType可省略

    resultMap

    解决列名不匹配问题:

    复制代码
       <!-- 定义ResultMap:解决列名不匹配的一种方式 -->
    
        <resultMap type="xxx" id="xxxMap">
    
            <!-- property:属性名   column:列名 -->
    
            <result property="year" column="lyear"/>
    
        </resultMap>
    
        <select id="接口中对应方法" resultMap="xxxMap">
    
            select语句
    
        </select>
    复制代码

    一对多关系映射:

    复制代码
    <resultMap type="grade" id="gradeResultMap">
    
    <id column="id" property="id"/>
    
    <result column="className" javaType="string" property="className" />
    
    <!– 通过collection配置集合属性,ofType指定集合中元素的类型,id标签配置外键 -->
    
    <collection property="users" ofType="user">
    
    <id column="u_id" property="id"/>
    
    <result column="username" property="username"/>
    
    </collection>
    
    </resultMap>
    
    <select id="getGradeById" resultMap="gradeResultMap">
    
    select g.id , g.className , u.id as u_id ,
    
    u.username from t_grade g left join t_user u
    
    on g.id = u.g_id
    
    where g.id = #{id}
    
    </select>
    复制代码

    多对一关系映射:

    复制代码
    <resultMap type="user" id="userResultMap">
    
    <id column="id" property="id"/>
    
    <result column="username" property="username"/>
    
    <result column="password" property="password"/>
    
    <!– 通过association配置集合属性, javaType指定元素的类型-->
    
    <association property="grade" javaType="grade">
    
    <id column="g_id" property="id"/>
    
    <result column="className" property="className"/>
    
    </association>
    
    </resultMap>
    
    <select id="getUserGradeByUserId" resultMap="userResultMap">
    
    select u.id , u.username , u.password ,
    
    g.id as g_id , g.className from t_user u
    
    left join t_grade g on u.g_id = g.id
    
    where u.id = #{id}
    
    </select>
    复制代码

    5.编写客户端访问代码

    从SqlSessionFactoryBuilder中build 创建SqlSessionFactory之后create获取SqlSession回话。

    复制代码
    public class SqlSessionFactoryUtil {
    
    private static SqlSessionFactory sqlSessionFactory;
    
     
    
    static {
    
    String resource = "config.xml";
    
    // InputStream in = SqlSessionFactoryUtil.class.getResourceAsStream(resource);
    
    try {
    
    InputStream in = Resources.getResourceAsStream(resource);
    
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
    
    } catch (IOException e) {
    
    e.printStackTrace();
    
    }
    
    }
    
     
    
    public static SqlSession getSession(boolean autoCommit)  {
    
    return sqlSessionFactory.openSession(autoCommit);
    
    }
    
     
    
    public static void main(String[] args) {
    
    SqlSession session = SqlSessionFactoryUtil.getSession(true);
    
    LeagueMapper mapper = session.getMapper(LeagueMapper.class);
    
    }
    
    }
    复制代码

    获取事务的方式

    可在调用增删改操作后调用session.commit()进行事务的提交;

    也可在获取SqlSession的时候,通过sqlSessionFactory.openSession(true)。

    MyBatis动态SQL

    if语句

    <select id="selectUsers" parameterType="java.util.HashMapresultType="user">

    select ID , USERNAME , PASSWORD

     FROM USERW WHERE 1=1

    <if test="username!=null and username!=''">

    and USERNAME = #{username}

    </if>

    <if test="password!=null and password!=''">

    and PASSWORD = #{password}

    </if>

    </select>

    choose when other 语句

    <select id="selectUsers" parameterType="java.util.HashMap" resultType="user">

    select ID , USERNAME , PASSWORD FROM USERW WHERE 1=1

    <choose>

    <when test="username!=null and username!=''">

    and USERNAME = #{username}

    </when>

    <when test="username==null or username==''">

    and USERNAME is null

    </when>

    <otherwise>

    and 1!=1

    </otherwise>

    </choose>

    </select>

    trim, where,set语句

    <select id="selectUsers" parameterType="java.util.HashMap" resultType="user">

    select ID , USERNAME , PASSWORD FROM USERW

    <where>

    <if test="username!=null">

    USERNAME = #{username}

    </if>

    </where>

    </select>

    <update id="updateUser" parameterType="java.util.HashMap">

    update USERW

    <set>

    <if test="username!=null">

    USERNAME = #{username},

    </if>

    <if test="password!=null">

    PASSWORD = #{password},

    </if>

    </set>

    where ID = #{id}

    </update>

    foreach语句

    <select id="selectUsers" parameterType="java.util.HashMap" resultType="user">

    select ID , USERNAME , PASSWORD FROM USERW WHERE 1=1

    <choose>

    <when test="username!=null and username!=''">

    and USERNAME = #{username}

    </when>

    <when test="username==null or username==''">

    and USERNAME is null

    </when>

    <otherwise>

    and 1!=1

    </otherwise>

    </choose>

    </select>

    Spring+MyBatis整合

    Spring整合ORM框架的优势

    简化编程:整合后的编程,在配置文件、API调用,以及异常处理等方面的程序有很大的简化

    简化事务配置:整合后可使用Spring AOP事务实现对事务的控制,程序中不必再编写事务控制的代码。

    Spring-MyBatis整合结构

    将MyBatis整合到Spring的优势

    在MyBatis-Spring中,使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder,它直接声明在Spring配置文件中。

    Mapper实例不在需要手动编码获取,直接在Spring配置文件中声明即可。

    原有的数据源配置信息,被整合到Spring提供的DataSource中。

    MapperFactoryBean

    用于生成MyBatis Mapper子类实例的工厂类,该类内部使用了工厂方法模式。服务组件通过通过该Bean获取Mapper实例。

    MapperScannerConfigurer

    用于扫描指定路径中的映射配置文件来获取映射信息。

    SqlSessionFactoryBean

    用于生产MyBatis中SqlSession的工厂类,该类内部使用了工厂方法模式。

    DataSource

    用于连接数据库的通用组件,可使用Web容器提供的数据源,也可以使用第三方数据源。

  • 相关阅读:
    bound 很靠近0的mle
    order statistics 为什么3维要把6块加起来
    正态分布的来历
    互斥和独立
    平稳随机过程 会不会和随机过程矛盾呢?
    请问如何理解同一个随机过程,里面的两个随机变量的期望不同呢?
    bagging和boosting以及rand-forest
    arr = map(float,arr)输出问题
    lasso数学解释
    岭回归的数学解释
  • 原文地址:https://www.cnblogs.com/mengmengi/p/10818561.html
Copyright © 2020-2023  润新知