MyBatis框架依赖的jar包:下载地址:https://github.com/mybatis/mybatis-3/releases
<?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">
[这个可以整合到Spring的配置文件中] properties元素的配置:(两种方式)
<setting name="cacheEnabled" value="true" />
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 -->
<setting name="aggressiveLazyLoading" value="true" />
<!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) -->
<setting name="useGeneratedKeys" value="true" />
<!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
<setting name="defaultStatementTimeout" value="25000" />
[这个可以整合到Spring的配置文件中] 定义类的别名,一般用类名做别名
<typeAlias alias="pageAccessURL" type="com.lgm.mybatis.model.PageAccessURL" />
<environments default="development">
<!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
<environment id="development1">
<!-- 事务配置 type= JDBC、MANAGED 1.JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
2.MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。
默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false -->
<transactionManager type="JDBC" />
<!-- <transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
<!-- 数据源类型:type = UNPOOLED、POOLED、JNDI 1.UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。
不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的 2.POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
这是一种当前Web应用程序用来快速响应请求很流行的方法。 3.JNDI:这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/appdb" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="defaultTransactionIsolationLevel" value="" /> -->
<!-- 映射文件,存放sql语句的xml配置文件的路径 -->
<mapper resource="com/lgm/mybatis/config/pageAccessURL.xml" />
编写Spring配置文件:applicationContext-mybatis.xml
需要的jar包:mybatis-spring-1.2.0.jar
1.加载properties文件,可以配置一些数据库的连接参数和线程池的初始化参数,加载properties文件的方法主要有两种,详细见资料。
====================================
url=jdbc:mysql://10.221.10.111:8080/db_zsl
=====================================
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<array><value>classpath:database.properties</value></array>
dbcp,c3p0,Proxool,他们都实现了连接池的功能
使用到的jar包:commons-dbcp-1.4.jar,commons-pool-1.6.jar
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="minIdle" value="${minIdle}"/>
SqlSessionFactoryBean提供了很多丰富的属性来整合MyBatis的各种元素和属性,SqlSessionFactoryBean来替代SqlSessionFactoryBuilder来创建SqlSession
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="typeAliasesPackage" value="com.del.pojo"></property>
<property name="mapperLocations">
<value>classpath:com/del/dao/UserMapper.xml</value>
4.配置MapperScannerConfigurer批量产生接口映射器实现类1,实现类中已经注入sqlSessionFactory,能get到session。自动递归扫描指定包下的Mapper接口,并将他们直接动态注册为MapperFactoryBean, 接口名称作为Bean组件的名称,首字母小写。并且会注入SqlSessionFactory,若有多个SqlSessionFactory,则必须显示地指定具体用哪个SqlSessionFactory!,因此可以拿到sqlsessionTemplate的实例。
<property name="SqlSessionFactoryBeanName" value="SqlSessionFactoryBean "></property>
使用MapperScannerConfigurer和@Autowired注解和@Resource注解能够配合使用,自动创建映射器实现,并注入给业务组件,能很大程度减少DAO组件的业务组件的编码工作。最后通过Spring的getBean()方法直接拿到DAO和业务层的实例,直接使用。
===============================补充==================================
为什么需要映射器实现类? (也就是手动编写映射器存在的问题)
1:SqlSession.selectList()等方法需要采用字符串指定映射项,易写错
2:SqlSession.getMapper()方法需要在每次调用的时候都实现一次接口.
由此诞生注入映射器,在容器中始终存在一个映射器接口的实现类xxxImpl,这样就将可以用XXXImpl.接口方法() 的方式操作sql语句,取代了SqlSession.selectList()的方式
采用MapperFactoryBean数据映射器实现Mapper映射,
根据Mmapper接口获取Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现MapperFactoryBean是SqlSessionDaoSupport的子类[接口名称和里面的方法名称一定要和映射文件的id对应] 配置方法:
这里注入sqlSessionFactory属性,以便于获得sqlSessionTemplate实例,
A:配置sqlSessionTemplate以获得sqlSession,
通过传入一个SqlSessionFactory构造得到SqlSessionTemplate实例,因为没有set()不能设置注入)
B:另一种获取SqlSession的方法(继承它的基类SqlSessionDaoSupport类)
通过set()方法注入Factory,同过getSqlSession()方法得SqlSession
=============================补充结束==============================
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd "
开启注解支持,扫描基准包自动批量注册为Bean组件,添加命名空间,模板实例地址,扫描service层包,这样的配置基本上把我们全部的DAO和Service扫描进来了,很强大
<context:component-scan base-package="com.del.service,com.del.dao"/>
(有的时候版本低,扫描不能开启注解,则应该用下面这句配置开启注解支持)
//配置MapperScannerConfigurer批量产生映射器实现类
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.del.dao"></property>
3:通过<tx:advice>配置事务增强,绑定事务管理并针对不同的方法定义 事务规则。
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:method name="find*" read-only="true" propagation="SUPPORTS" timeout="1000" isolation="SERIALIZABLE" />
<tx:method name="*" propagation="REQUIRED"/>
从<!--配置切面-->里面的切点表达式里面切中的所有方法中筛选符合<!--配置增强-->里面的name属性要求的方法
<aop:pointcut expression="execution(* cn.smbms.service..*.*(..))" id="myPoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPoint"/>
--------------补充-----------------
REQUIRED(默认值):如果存在一个事务则加入到一个事务,如果不存在事
SUPPORTS: 如果存在事务方法当中,则加入事务。如果不存在事务,则以非事务方式运
1. DEFAULT: 这是TransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
2. READ_UNCOMMITTED: 这是事务最低的隔离级别,充许令外一个事务可以看到这个事务未提交的数据。
3. READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4. REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5. SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
timeout:设置事务的最长运行时间s。一般默认是-1,永不超时。
Read-only:设置事务是否为只读,默认值是false,可以提高性能
Spring默认值在抛出runtimeException时才标识事务回滚
可以通过完全限定类名指定需要回滚事务的异常。多个类名用逗号隔开
Spring默认checked Exception不会触发事务回滚
可以通过完全限定类名指定不需要回滚事务的异常。多个类名逗号隔开
--------------------补充结束--------------------
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
<tx:annotation-driven transaction-manager="txManager"/>
<?xml version="1.0" encoding="UTF-8"?>
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>SSMEBUY</display-name>
<welcome-file>index.jsp</welcome-file>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mybatis.xml</param-value>
在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的。
声明version="3.0",声明web-app_3_0.xsd
为servlet或者filter设置启用异步支持:<async-supported>true</async-supported>,修改WEB应用的web.xml
<filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
<async-supported>true</async-supported>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
//forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
<filter-name>encodingFilter</filter-name>
web容器的入口是被WEB容器所控制的,所以无法在main方法中同过调用创建classpath.xml application context对象来启动spring 容器。所以spring容器提供了一个监听类叫做contextLoaderListen,这个监听实现了servletListener接口,可以在外部容器启动的时候去初始容器,当然,前提是我们必须在web.xml文件中先配置此监听,配置如下:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
它的作用:调用springmvc配置文件的映射,将不同的请求分配给不同的控制器controler!
要点:其中param-name的命名,要与springmvc的配置文件的名称一致
<servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
//让wenb项目去哪个位置加载springmvc的配置文件
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
<load-on-startup>1</load-on-startup>
<servlet-name>dispatcherServlet</servlet-name>
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.del.service,com.del.controller"/>
自动扫描cn.smbms.controller包下的javaBean,使添加了标注的处理器Bean组件生效,此时的javaBean不再需要继承AbstractController,了
作用:自动批量注册处理器映射,小写驼峰命名,注册完成之后,再通过DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter这两个Bean的实例完成对注解的支持.用@Controller表示处理器,用@RequestMapping()表示请求映射.
--------------------重点-----------------------------
DefaultAnnotationHandlerMapping:作用:映射器
用来解析Spring MVC里面的annotation对应的Controller,也就是通过这个类,给annotation设置映射关系,如@RequestMapping等
AnnotationMethodHandlerAdapter:作用:适配器
还会自动注册FormarttingConversionServiceFactoryBean(此实例为spring类型转换核心接口ConversionService的默认注册实例)来通过格式化注解,解决日期的格式转换问题
@ResponseBody这个注解就是使用消息转换机制,最终通过json的转换器转换成json数据的。
HttpMessageConverter接口就是Spring提供的http消息转换接口。
============================补充=======================================
1:第一个是实现类Spring默认的处理器映射,意思是查找与请求URL同名的处理器Bean,这个映射器是不需要配置就可以生效的:
2:第二个实现类是通过注解的方式来进行URL和处理器Bean组件的映射
1:默认用BeanNameUrlHandlerMapping配置处理器映射,表示:(如果请求的路劲是"/index.html",则分配到后面class所指定的处理器去处理)
<bean name="/index.html" class="cn.smbms.controller.IndexController"/>
2:A:创建一个控制器:同过继承AbstractController,重写handlerRequestInternal方法,将IndexController这样的javaBean变成一个能处理前端请求的控制器
当我们需要controller返回一个map的json对象时,可以设定<mvc:annotation-driven />,
同时设定<mvc:message-converters> 标签,设定字符集和json处理类,如下代码:
============================补充结束===================================
配置单视图解析器作用:将返回的逻辑视图名和前缀,后缀,进行拼接成新的view层url,prefix属性和suffix属性其实是InternalResourceViewResolver的父类的属性.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/jsp"></property>
<property name="suffix" value=".jsp"></property>
2:同样的内容数据可以通过不同的view(html,json,xml,xls)进行前台的展现
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="favorParameter" value="true"/>
<property name="defaultContentType" value="text/html"/>
<entry key="html" value="text/html;charset=UTF-8"/>
<entry key="json" value="application/json;charset=UTF-8"/>
<entry key="xml" value="application/xml;charset=UTF-8"/>
<property name="viewResolvers">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
5:配置文件上传CommonsMultipartResolver
<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
6:配置全局异常处理SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<prop key="java.lang.RuntimeException">error</prop>
1:上面提到过如果在配置前端控制器时拦截了所有的请求,不做特殊处理就会导致部分静态资源无法使用。如果是这种情况就可以使用下面的配置来访问静态资源文件。
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/imgdata/**" location="/imgdata/" />