文章目录
SSM和开源框架
MyBatis重要组件:
- Mapper配置: 实体类Student.java - 数据表student , XML或注解
- Mapper接口: DAO层接口。 (只需要写接口,不用写实现类 :需要遵循约定)
Mapper接口在编写时 需要遵循约定:
1.方法名和SQL配置文件(studentMapper.xml)中的id值必须相同
2.方法的输入参数,必须和SQL配置文件的 parameterType的类型相同;
3.方法的返回值,必须和SQL配置文件的resultType的类型相同
SQL配置文件
<select id="queryStudentByNo" parameterType="int" resultType="lanqiao.entity.Student" >
select * from student where stuNo = #{stuNo}
</select>
接口
<select id=" queryStudentByNo" parameterType="int" resultType="Student">
select * from student where stuNo=#{stuNo}
</select>
根据约定,编写接口
public interface StudentMapper
{
Student queryStudentByNo(int stuNO)
List<Student> queryStudentByNo()
}
特殊
1.如果不存在parameterType ,则代表是一个无参方法
2.如果不存在resultType,则代表返回值是void
3.如果方法的返回值是一个集合类型,则实际resultType仍然是元素类型,而不是集合类型。
MyBatis开发时的常用对象
1.SqlSessionFactory:SqlSesssion工厂。通过SqlSessionFactory:SqlSesssion中的openSession()产生SqlSesssion对象。
2.SqlSesssion:SqlSesssion对象(类似于JDBC中的Connection)
3.Executor:MyBatis中所有Mapper语句的执行 都是通过Executor进行的。
MyBatis四大核心对象
1.StatementHandler(负责sql语句):数据库的处理对象 select… from where id = #{} …
2.PrameterHandler(负责sql中的参数):处理SQL中的参数对象
3.Executor
4.ResultSetHandler:处理SQL的返回结果集
MyBatis四大处理器
StatementHandler、PrameterHandler、ResultSetHandler
剩下一个:TypeHandler (类型转换器)
执行流程
一对一、一对多,延迟加载
一对一
使用<resultMap>中<association>
一对一的延迟加载:
使用<resultMap>中<association>的select属性指定延迟加载的sql语句
<resultMap>
<association select="延迟加载的sql语句" >
<<association>>
</resultMap>
一对多:将一对一中的改为
Spring
IOC/DI:控制反转/依赖注入
目的:解耦合
Student2 student = new Student2() 使用new会造成耦合度较高 ->工厂模式
类- >new ->对象
类- > 工厂模式->对象 ,可以实现解耦,问题是:需要自己编写工厂
IOC:IoC帮我们提供了一个工厂。 1.向工厂中注入对象 (配置[xml、注解]) 2.从工厂中获取对象
总结:Ioc可以让我们通过“配置的方式”来创建对象
AOP:面向方面编程
OOP的补充,不是替代。
使用oop的不足:
以上OOP两个不足,可以通过AOP进行改进。
使用AOP的实际场景:日志、安全统一校验
Spring用到了那些设计模式
工厂模式:创建bean、获取bean
单例模式/原型模式: 创建bean时,设置作用域 ,singleton/prototype
监听模式:自定义时间发布,监听模式。如ApplicationListener,当某个动作触发时,就会自动执行一个通知。
责任链模式:AOP
策略模式:创建代理
Spring Boot
最主要的功能:自动装配
以前(不用spring boot),需要自己配置框架的配置文件。
spring,mybatis ,SSM整合等情况 需要编写一大堆配置文件。
如果使用Spring Boot,则可以省略配置 。 好处:将开发重点放在业务逻辑上,而不是配置上。
自动装配的原理? 约定优于配置 (核心:将一些配置功能,前置到源码底层实现好)
自动装配两个特点:
1.版本仲裁中心:因此,以后引入依赖时,不用再写版本号。好处:1.不用记 2.避免冲突(防止引入多个引来时,由于各个依赖的版本不兼容造成的冲突)
2.提供了很多starter(场景启动器) :批量jar。
假设开发web项目 ( json.jar tomcat.jar hibernate-validator.jar, spring-web.jar … ) => spring-boot-starter-web.
以后使用web项目,只需要引入spring-boot-starter-web
自动装配的应用时: @EnableAutoConfiguration 就是springboot提供自动装配的 注解。
SpringMVC 基础入门
一、所需jar包
SpringMVC 所需jar包:
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar
spring-webmvc.jar
commons-logging.jar
报错NoClassDefFoundError:缺少jar
二、第一个SpringMVC程序
1.创建配置文件
springmvc配置文件 springmvc.xml
选中常用的命名空间:beans aop context mvc
编写springmvc.xml
<!-- 扫描有注解的包 -->
<context:component-scan base-package="com.one.handler"></context:component-scan>
<!-- 配置视图解析器(InternalResourceViewResolver) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 扫描有注解的包 -->
<context:component-scan base-package="com.one.handler"></context:component-scan>
<!-- 配置视图解析器(InternalResourceViewResolver) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 加载国际化资源文件 ResourceBundleMessageSource会在springmvc响应程序时 介入(解析国际化资源文件) -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
<!-- view-name会被视图解析器加上前缀后缀 -->
<mvc:view-controller path="testMvcViewController" view-name="success"/>
<!-- 此配置是springmvc的基础配置,很多功能都需要通过该注解来协调 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 该配置会让springmvc 接收一个请求,并且该请求没有对应的@Requestmapping时 , 将该请求交给服务器默认的servlet区处理(直接访问) -->
<mvc:default-servlet-handler/>
<!-- 自定义类型转换器 1.将自定义转换器纳入springIOC容器 -->
<bean id="MyConverter" class="com.one.converter.MyConverter"></bean>
<!-- 2.将MyConverter再纳入springmvc提供的转换器Bean -->
<!-- <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="MyConverter"/>
</set>
</property>
</bean> -->
<!-- 3.将conersionService注册到annotation-driven中 -->
<!-- <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> -->
<!-- 配置 数据格式化 注解 所需要的Bean -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="MyConverter"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 文件上传 -->
<!-- 配置CommonsMultipartResolver,用于实现文件上传,将其加入springIOC容器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 上传单个文件的最大值 单位是Byte -->
<property name="maxUploadSize" value="-1"></property>
</bean>
<!-- 拦截器 -->
<!-- 将自己写的拦截器配置到springmvc中 默认拦截全部请求 -->
<mvc:interceptors>
<!-- 配置具体的拦截路径 -->
<mvc:interceptor>
<!-- 指定拦截的路径,基于ant风格 -->
<mvc:mapping path="/testInterceptor"/>
<!-- 指定不拦截的路径 -->
<mvc:exclude-mapping path="/**"/>
<bean class="com.one.imterceptor.MyInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/testInterceptor"/>
<bean class="com.one.imterceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- SimpleMappingExceptionResolver 以配置的方式处理异常 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 如果发生异常,异常对象会被保存在exceptionAttributr的value值中,并且会放入request域中;异常变量的值是exception -->
<property name="exceptionAttribute" value="e"></property>
<property name="exceptionMappings">
<props>
<!-- 相当于catch(Exception e){跳转页面} -->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
</bean>
</beans>
在SpringMVC中.servlet;.controller;.action;.handler;都可表示控制器所在的包
web.xml
通过以下配置,拦截所有请求,交给SpringMVC处理
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中:
<url-pattern>/</url-pattern>
/:一切请求 ,注意不是 /* ;
/user:拦截以 /user开头的请求;
/user/abc.do :只拦截该请求;
.action:只拦截 .action结尾的请求
com.one.handler.SpringMvcHandler.java
@Controller
public class SpringMvcHandler {
@RequestMapping("hello")
public String hello() {
return "success";
}
}
2.项目中同时兼容 springMVC和Servlet
web.xml
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
通过:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
指定springmvc配置文件的路径,如果要省略,必须放到 默认路径:/WEB-INF/springDispatcherServlet-servlet.xml
3.映射
映射是 去匹配@RequestMapping注解,可以和方法名、类名不一致
通过method指定 请求方式(get post delete put)
@RequestMapping(value=“welcome”,method=RequestMethod.POST)//映射
总结
通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。
它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所具有的优势。而且框架本身有代码,看起来容易理解。