ssm整合(springmvc、spring、mybatis) 一、项目目录结构二、导包properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding junit.version4.12/junit.version slf4j.version1.7.25/slf4j.version commons-fileupload.version1.4/commons-fileupload.version commons-io.version2.6/commons-io.version javax.servlet.jsp-api.version2.3.1/javax.servlet.jsp-api.version javax.servlet-api.version3.1.0/javax.servlet-api.version mysql.version5.1.38/mysql.version mybatis.version3.4.6/mybatis.version spring.version5.0.8.RELEASE/spring.version aspect.version1.8.10/aspect.version c3p0.version0.9.5.2/c3p0.version mybatis-spring.version1.3.2/mybatis-spring.version spring-webmvc.version5.1.6.RELEASE/spring-webmvc.version /properties dependencies !-- springmvc支持 -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring-webmvc.version}/version /dependency !-- mybatis整合spring支持 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version${mybatis-spring.version}/version /dependency !-- c3p0支持 -- dependency groupIdcom.mchange/groupId artifactIdc3p0/artifactId version${c3p0.version}/version /dependency !-- spring的aop支持 -- dependency groupIdorg.aspectj/groupId artifactIdaspectjweaver/artifactId version${aspect.version}/version /dependency dependency groupIdorg.aspectj/groupId artifactIdaspectjrt/artifactId version${aspect.version}/version /dependency !-- spring框架支持 -- !-- spring上下文支持 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${spring.version}/version /dependency !-- spring-jdbc支持 -- dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version${spring.version}/version /dependency !-- spring整合junit测试 -- dependency groupIdorg.springframework/groupId artifactIdspring-test/artifactId version${spring.version}/version scopetest/scope /dependency !-- mybatis框架 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version${mybatis.version}/version /dependency !-- mysql connector-- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version${mysql.version}/version /dependency !--jsp、servlet支持 provide属性表示只参与测试不加载导war包中 -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version${javax.servlet.jsp-api.version}/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version${javax.servlet-api.version}/version scopeprovided/scope /dependency !-- file upload -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version${commons-fileupload.version}/version /dependency dependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version${commons-io.version}/version /dependency !-- log4j -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version${slf4j.version}/version scopetest/scope /dependency !-- junit测试支持 -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version${junit.version}/version scopetest/scope /dependency /dependencies三、domian、service、controller3.1.domain包3.1.1.BaseBeanpackage com.blog.domain; public class BaseBean { private Integer uid; private String uname; private Integer age; private String address; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname uname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public String getAddress() { return address; } public void setAddress(String address) { this.address address; } Override public String toString() { return BaseBean [uid uid , uname uname , age age , address address ]; } }3.1.2.Accountpackage com.blog.domain; public class Account { private Integer id; private String name; private Double money; private Double transferMoney; public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money money; } public Double getTransferMoney() { return transferMoney; } public void setTransferMoney(Double transferMoney) { this.transferMoney transferMoney; } }3.2.service包3.2.1.AccountService接口package com.blog.service; import com.blog.domain.Account; public interface AccountService { //转账操作:账户a给账户b转账 public void transfer(Account a,Account b); }3.2.2.AccountServiceImpl实现类package com.blog.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.blog.domain.Account; import com.blog.mapper.AccountMapper; Service Transactional(isolationIsolation.DEFAULT,propagationPropagation.REQUIRED,readOnlyfalse) public class AccountServiceImpl implements AccountService { Autowired private AccountMapper accountMapper; Override public void transfer(Account a, Account b) { //扣钱 accountMapper.reduce(a); //异常 //int x1/0; //减钱 accountMapper.increase(b); } }3.2.3.BaseSerive接口package com.blog.service; import com.blog.domain.BaseBean; public interface BaseService { public BaseBean getOneById(Integer uid); }3.2.4.BaseServiceImpl实现类package com.blog.service; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.blog.domain.BaseBean; import com.blog.mapper.BaseMapper; Service public class BaseServiceImpl implements BaseService { Resource(namebaseMapper) private BaseMapper baseMapper; Override public BaseBean getOneById(Integer uid) { return baseMapper.getOneById(uid); } }3.3.controlller包3.3.1.BaseControllerpackage com.blog.controller; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.blog.domain.BaseBean; import com.blog.service.BaseService; Controller RequestMapping(value/base) public class BaseController { Resource(typeBaseService.class) private BaseService baseService; GetMapping(value/getOneById) public ResponseBody String getOneById(RequestParam Integer uid) { BaseBean bean baseService.getOneById(uid); System.out.println(bean); return 成功访问;//给前端相应数据“成功访问” } GetMapping(value/) public String toNewJsp() { return new;//会跳转到/webapp/views/new.jsp,前提是new.jsp存在 } }三、mybatis相关配置1.mybatis配置文件mybatisConfig.xml?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- 别名设置不设置时引用要使用全包名设置后可以使用自定义别名更加简洁 -- typeAliases !-- 别名设置有两种一种是一个一个设置另外一种是设置某个包默认别名为类名大小写都可以建议小写 -- !-- 第一种设置 typeAlias typecom.mybatis_demo.domain.User aliasuser/-- !-- 第二种设置整个包下面的类都进行别名设置推荐第二种 -- package namecom.blog.domain/ /typeAliases !-- 引入映射文件 -- mappers !-- mapper resourcemapper/UserMapper.xml/ -- package namecom.blog.mapper/ /mappers /configuration2.mapper接口和mapper.xml映射文件2.1.BaseMapper 接口Repository public interface BaseMapper { public BaseBean getOneById(Integer uid); }2.2.BaseMapper .xml映射文件?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.blog.mapper.BaseMapper select idgetOneById parameterTypeInteger resultTypeBaseBean select * from t_user where uid #{uid} /select /mapper2.3.AccountMapper接口package com.blog.mapper; import com.blog.domain.Account; public interface AccountMapper { //账户加钱操作 public void increase(Account a); //账户扣钱操作 public void reduce(Account a); }2.4.AccountMapper.xml映射文件?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.blog.mapper.AccountMapper update idincrease parameterTypeAccount update t_account set money money#{transferMoney} where id#{id} /update update idreduce parameterTypeAccount update t_account set money money-#{transferMoney} where id#{id} /update /mapper四、spring相关配置applicationContext-core.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/tx xmlns:aophttp://www.springframework.org/schema/aop 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd !-- 读取配置文件 -- context:property-placeholder locationclasspath:db.properties/ !-- dataSource -- bean namedataSource classcom.mchange.v2.c3p0.ComboPooledDataSource property namedriverClass value${dataSource.driverClass}/ property namejdbcUrl value${dataSource.jdbcUrl}/ property nameuser value${dataSource.user}/ property namepassword value${dataSource.password}/ /bean !-- spring整合mybatis -- !-- 1.配置SqlSessionFactoryBean -- bean idsqlSessionFactoryBean classorg.mybatis.spring.SqlSessionFactoryBean !-- 注入数据源 -- property namedataSource refdataSource/ !-- 告诉spring去哪里加载mybatis配置文件 -- property nameconfigLocation valueclasspath:mybatisConfig.xml/ /bean !-- UserDao -- !-- bean nameuserDao classcom.spring_mybatis_demo.dao.UserDaoImpl property namesqlSessionFactory refsqlSessionFactoryBean/ /bean -- !-- mapper动态代理开发 bean iduserMapper classorg.mybatis.spring.mapper.MapperFactoryBean 注入SqlSessionFactory property namesqlSessionFactory refsqlSessionFactoryBean/ 配置接口 property namemapperInterface valuecom.spring_mybatis_demo.mapper.UserMapper/ /bean -- !-- mapper扫描开发 -- bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.blog.mapper/ /bean !-- 开启组件扫描默认开启注解 -- context:component-scan base-packagecom.blog.*/ !-- 配置事务核心管理器 -- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean !-- 开启注解事务 -- tx:annotation-driven/ /beans五、springmvc相关配置springmvc-servlet.xml?xml version1.0 encodingUTF-8?!-- mvc 注解 -- mvc:annotation-driven/ !--扫描controller层的Controller-- context:component-scan base-packagecom.blog.controller/ !-- 静态资源映射防止被DispatcherServlet过滤不可访问 -- mvc:resources location/views/ mapping/views/**/ !-- 设置主页面访问/自动跳转到home视图 -- mvc:view-controller path/ view-nameindex/ !-- 页面重定向 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/views/ / property namesuffix value.jsp / /bean !-- 全局设置编码UTF-8 -- mvc:annotation-driven enable-matrix-variablestrue mvc:message-converters register-defaultstrue bean classorg.springframework.http.converter.StringHttpMessageConverter constructor-arg valueUTF-8 / /bean /mvc:message-converters /mvc:annotation-driven !-- 文件上传配置 -- bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolver property namemaxUploadSize value5120000/ /bean# 六、web.xml?xml version1.0 encodingUTF-8? web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://xmlns.jcp.org/xml/ns/javaee xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1 display-nameblog/display-name !-- 项目启动就加载spring配置文件 -- context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext*.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- 配置拦截器拦截路径为/需要在springmvc-servlet.xml配置一下静态资源的映射路径不然静态资源会被过滤导致无法访问 -- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !-- springmvc的配置文件名不是springmvc-servlet.xml需要配置下面的参数 init-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext*.xml,/WEB-INF/springmvc-servlet.xml/param-value /init-param -- load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping !-- 编码过滤器 -- filter filter-namecharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-namecharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app七、db.properties(请根据自己的数据库进行修改)dataSource.driverClasscom.mysql.jdbc.Driver dataSource.jdbcUrljdbc:mysql://localhost:3306/mybatis?useUnicodetruecharacterEncodingutf8 dataSource.userblog dataSource.passwordblog八、测试1.测试BaseServiceRunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classpath:applicationContext-core.xml) public class TestBaseService { Resource(typeBaseService.class) private BaseService baseService; Test public void test1() { BaseBean bean baseService.getOneById(15); System.out.println(bean); } }2.测试事务管理package com.blog.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.blog.domain.Account; import com.blog.service.AccountService; RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classpath:applicationContext-core.xml) public class TestAccountService { Autowired private AccountService accountService; Test public void test1() { Double transferMoney 1000d; Account a new Account(); Account b new Account(); a.setId(1); b.setId(2); a.setTransferMoney(transferMoney); b.setTransferMoney(transferMoney); accountService.transfer(a, b); } }3.postman测试springmvc3.1.页面跳转3.2.响应前端数据