第一步.引入maven依赖
分别是groupId : artifactId :version
org.springframework:spring-webmvc:5.0.6.RELEASE
jstl :jstl :1.2
javax.servlet:javax.servlet-api:3.1.0(scope:provided)
org.springframework:spring-context-support:5.0.6.RELEASE
org.springframework:spring-jdbc:5.0.6.RELEASE
org.springframework:spring-tx:5.0.6.RELEASE
mysql:mysql-connector-java:5.1.34
org.mybatis:mybatis:3.4.6
org.mybatis:mybatis-spring:1.3.2
com.alibaba:druid:1.1.10
com.github.pagehelper:pagehelper:5.
ch.qos.logback:logback-classic:1.2.3
org.projectlombok:lombok:1.16.20
第二步.配置前端控制器DispatcherServlet
<servlet>
<servlet-name>et1812</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>et1812</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第三步.配置Spring的配置文件
3.1 <context:component-scan base-package="com.etoak" />
3.2 <mvc:annotation-driven />
3.3 视图解析器
3.4 配置数据源
3.5 整合MyBatis
3.5.1 SqlSessionFactoryBean
dataSource:3.4数据源
mapperLocations:sql文件位置
typeAliasesPackage:别名
plugins->分页插件
3.5.2 Mapper接口扫描
MapperScannerConfigurer
3.5.3 事务管理器
<!-- 扫描bean的注解 -->
<context:component-scan base-package="com.etoak" />
<!-- 注解驱动 -->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 数据源 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 开始整合MyBatis -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:mappers/*.xml" />
<property name="typeAliasesPackage" value="com.etoak.bean" />
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.etoak.mapper" />
</bean>
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="tx" />
第四步.编码
创建数据库和表
编写表对应的Bean、Page类
写Mapper接口、Sql配置文件
写Service
写Controller
写JSP
关于事务的注意事项
@Transactional
- 默认对非检查型异常(运行时异常)起作用;
- 可以使用@Transactional的属性rollbackFor指定异常进行数据回滚;
比如:@Transactional(rollbackFor = Exception.class)
一定要熟悉事务传播特性、隔离级别
举例说明
1.运行时异常 下图代码会出现异常但不会往数据库中插入数据
/**
* 主要测试事务的问题
*/
@Override
//@Transactional(rollbackFor = Exception.class)
@Transactional
public int addUser(User user) throws SQLException {
int result = userMapper.addUser(user);
log.info("添加结果,影响行数:{}", result);
// throw new RuntimeException();
int i = 1 / 0;
// 检查型异常,非运行时异常
// throw new SQLException();
return result;
}
2.非运行异常
会报异常 但是数据却插进数据库了
/**
* 主要测试事务的问题
*/
@Override
//@Transactional(rollbackFor = Exception.class)
@Transactional
public int addUser(User user) throws SQLException {
int result = userMapper.addUser(user);
log.info("添加结果,影响行数:{}", result);
// throw new RuntimeException();
int i = 1 / 0;
// 检查型异常,非运行时异常
throw new SQLException();
//return result;
}
3.使用@Transactional的属性rollbackFor指定异常进行数据回滚
这样的话会报异常,也不会往数据库中插入数据
` /**
* 主要测试事务的问题
*/
@Override
@Transactional(rollbackFor = Exception.class)
//@Transactional
public int addUser(User user) throws SQLException {
int result = userMapper.addUser(user);
log.info(“添加结果,影响行数:{}”, result);
// throw new RuntimeException();
int i = 1 / 0;
// 检查型异常,非运行时异常
throw new SQLException();
//return result;
}`
========================================================
今日收获:
1.<mvc:annotation-driven>
<!-- 注解处理器映射器-->
<!-- <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
<!-- 注解处理器适配器-->
<!-- <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->
<!-- 使用<mvc:annotation-driven/>可以代替上面的映射器和适配器;
会自动注册RequestMappingHandlerMapping和 RequestMappingHandlerAdapter两个bean,这是SpringMVC为@Controllers分发请求所必须的,
并提供了数据绑定支持、
@NumberFormatannotation支持、
@DateTimeFormat支持、
@valid支持、读写XML的支持(JAXB)和JSON的支持(默认jackson)等功能。-->
<mvc:annotation-driven />
2.整合Mybatis的配置:
尤其是对 typeAliasesPackage:别名的新认识
对应的某某Mapper.xml中的resultMap可以直接用
typeAliasesPackage对应value所在位置下的类名小写直接引用,这个我今天才知道。。。。恍然大悟
开始整合MyBatis
1.SqlSessionFactoryBean
dataSource
mapperLocations:sql文件位置
typeAliasesPackage:别名
plugins->分页插件 Mapper接口扫描
2.MapperScannerConfigurer
3.事务管理器
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:mappers/*.xml" />
<property name="typeAliasesPackage" value="com.etoak.bean" />
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>