准备工作:
1 创建项目,pom.xml导包
2 jdbc.properties,日志配置文件
3 数据库的准备
总体步骤:进行一个模块,测试一个模块,步步为营.
第一模块:spring和mybatis的整合(Dao层搭建)
1 接口
public interface AccountMapper { public void outAccount(@Param("out") String out, @Param("money") double money); public void inAccount(@Param("in") String in,@Param("money") double money); }
2 mapper文件
注意:mapper文件要对象接口,包名要完全一致,这样扫描的时候就方便一些
<?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"> <!--名称空间namespace相当于类--> <mapper namespace="it.heima.mapper.AccountMapper"> <!--id相当于类中的方法--> <update id="outAccount" > <!--#{out}相当于从接口中的@param取数据--> UPDATE account set money=money-#{money} where name=#{out} </update> <update id="inAccount" > UPDATE account set money=money+#{money} where name=#{in} </update> </mapper>
3 mybatis-config.xml文件(文件为空,如果没有其他信息可以省略不写)
<?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> </configuration>
4 applicationContext_dao.xml 文件配置
<?xml version="1.0" encoding="UTF-8"?> <!--suppress ALL --> <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" xsi:schemaLocation="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"> <!--连接数据库--> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource01" 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> <!--sqlsessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--数据库--> <property name="dataSource" ref="dataSource01"/> <!--关联mybatis-config.xml--> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> </bean> <!--扫描接口和mapper,生成实现类--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--生成it.heima.mapper包下的接口的实现类--> <property name="basePackage" value="it.heima.mapper"/> </bean> </beans>
5 测试(一定要注入配置applicationContext_dao.xml,要不然报空指针异常)
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext_dao.xml") public class AccountMapperTest { @Value("#{accountMapper}") private AccountMapper accountMapper; @Test public void outAccount() throws Exception { accountMapper.outAccount("aaa",100); } @Test public void inAccount() throws Exception { accountMapper.inAccount("bbb",100); } }
6 结果:(aaa减少100,bbb增加100)
第二模块:开启事务(service层搭建)
说明:第一模块出账和入账是独立的,我们需要让他们俩成为一个整体事务,所以要建一个接口综合这两个
1 接口
public interface AccountService { public void transfer(String out,String in,double money); }
2 接口的实现类
@Service("accountServiceImpl") public class AccountServiceImpl implements AccountService { //因为要用accountMapper,所以要注入 @Value("#{accountMapper}") private AccountMapper accountMapper; @Transactional public void transfer(String out, String in, double money) { accountMapper.outAccount(out,money); //模拟断电:看看事务是否生效 //int num=1/0; accountMapper.inAccount(in,money); } }
3 配置文件开启事务
<!--扫描业务包下的注释,作用:扫描实现类,要不然就得像mapper端一样底层实现类了--> <context:component-scan base-package="it.heima.service.Impl"/> <!--开启事务注释,事务的开启是用tx--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource01"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
4 测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext_*.xml") public class AccountServiceTest { //实现类 @Value("#{accountServiceImpl}") private AccountService accountService; @Test public void transfer() throws Exception { accountService.transfer("aaa","bbb",100); } }
5 结果(说明service层没有问题)
第三模块:springmvc搭建(web层搭建)
1 前端控制器web.xml配置(DispatcherServlet)
<web-app> <display-name>Archetype Created Web Application</display-name> <!--配置前端控制器DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet/> <!--配置自定义读取springmvc文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext_web.xml</param-value> </init-param> <!--服务器已启动就初始化类--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!--拦截.do结尾的请求--> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
2 配置springmvc
<!--获取HandlerMapper和 HandleAspect--> <mvc:annotation-driven/> <!--扫描获取controller控制器--> <context:component-scan base-package="it.heima.controller"/> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"/> </bean>
3 控制器Controller
@Controller public class AccountController { @RequestMapping("transfer") public ModelAndView transfer(@RequestParam("out") String out, @RequestParam("in")String in, @RequestParam("money")double money){ String str="out="+out+",in="+in+",money="+money; ModelAndView mv = new ModelAndView("success"); mv.addObject("msg","转账成功"+str); return mv; } }
4 页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h2>${msg}</h2> </body> </html>
5 浏览器访问(说明web端搭建成功)
第四模块:spring和web项目的整合
1 实例化spring容器(加上了监听器)
<web-app> <display-name>Archetype Created Web Application</display-name> <!--通知监听器spring配置文件的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext_*.xml</param-value> </context-param> <!--监听器当项目启动后:立即实例化spring容器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--配置前端控制器DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--配置自定义读取springmvc文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext_web.xml</param-value> </init-param> <!--服务器已启动就初始化类--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!--拦截.do结尾的请求--> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
2 将浏览器的数据作为参数调用service层
@Controller public class AccountController { //注入业务层 @Value("#{accountServiceImpl}") private AccountService accountService; @RequestMapping("transfer") public ModelAndView transfer(@RequestParam("out") String out, @RequestParam("in")String in, @RequestParam("money")double money){ //调用业务层 accountService.transfer(out,in,money); String str="out="+out+",in="+in+",money="+money; ModelAndView mv = new ModelAndView("success"); mv.addObject("msg","转账成功"+str); return mv; } }