SSM Spring_SpringMVC_MyBatis
>> 本次随笔,在于记录学习过程,便于后期快速复习, 分二阶段处理
A: 常规方式下的集成使用;
B: 真正的SSM集成使用;
-------------------------------------------------------------------------------------------------------------------
A: 常规处理
准备: 工程项目结构配置
准备: 坐标引用
1 <dependencies> 2 3 <dependency> 4 <groupId>javax.servletgroupId> 5 <artifactId>javax.servlet-apiartifactId> 6 <version>4.0.1version> 7 <scope>providedscope> 8 dependency> 9 <dependency> 10 <groupId>javax.servletgroupId> 11 <artifactId>jsp-apiartifactId> 12 <version>2.0version> 13 dependency> 14 <dependency> 15 <groupId>jstlgroupId> 16 <artifactId>jstlartifactId> 17 <version>1.2version> 18 dependency> 19 20 21 <dependency> 22 <groupId>mysqlgroupId> 23 <artifactId>mysql-connector-javaartifactId> 24 <version>8.0.24version> 25 dependency> 26 <dependency> 27 <groupId>com.alibabagroupId> 28 <artifactId>druidartifactId> 29 <version>1.2.6version> 30 dependency> 31 <dependency> 32 <groupId>org.mybatisgroupId> 33 <artifactId>mybatisartifactId> 34 <version>3.5.5version> 35 dependency> 36 <dependency> 37 <groupId>org.mybatisgroupId> 38 <artifactId>mybatis-springartifactId> 39 <version>2.0.5version> 40 dependency> 41 42 43 <dependency> 44 <groupId>org.springframeworkgroupId> 45 <artifactId>spring-contextartifactId> 46 <version>5.2.12.RELEASEversion> 47 dependency> 48 <dependency> 49 <groupId>org.aspectjgroupId> 50 <artifactId>aspectjweaverartifactId> 51 <version>1.9.6version> 52 dependency> 53 <dependency> 54 <groupId>org.springframeworkgroupId> 55 <artifactId>spring-jdbcartifactId> 56 <version>5.2.10.RELEASEversion> 57 dependency> 58 <dependency> 59 <groupId>org.springframeworkgroupId> 60 <artifactId>spring-txartifactId> 61 <version>5.2.10.RELEASEversion> 62 dependency> 63 <dependency> 64 <groupId>org.springframeworkgroupId> 65 <artifactId>spring-webmvcartifactId> 66 <version>5.2.12.RELEASEversion> 67 dependency> 68 69 70 <dependency> 71 <groupId>junitgroupId> 72 <artifactId>junitartifactId> 73 <version>4.12version> 74 <scope>testscope> 75 dependency> 76 <dependency> 77 <groupId>org.springframeworkgroupId> 78 <artifactId>spring-testartifactId> 79 <version>5.1.7.RELEASEversion> 80 dependency> 81 dependencies>
01. 数据库建表
1 Create Table Account( 2 id int not null primary key auto_increment, 3 name varchar(50), 4 money double(7,2) 5 )
02. POJO 对象的创建
1 public class Account { 2 private Integer id; 3 private String name; 4 private Double money; 5 6 //省略 getter 和 setter 7 }
03. 配置 mapper 接口 ( 若觉得 mapper 不太好理解,就当成 dao 接口理解)
1 public interface AccountMapper { 2 /*保存数据*/ 3 void save(Account account); 4 /*加载全部数据*/ 5 ListfindAll(); 6 }
04. 配置 service 接口及实现类的编写(常规方法下)
1 public interface AccountService { 2 /*保存数据*/ 3 void save(Account account); 4 /*加载全部数据*/ 5 ListfindAll(); 6 }
1 @Service("accountService") 2 public class AccountServiceImpl implements AccountService{ 3 4 @Override 5 public void save(Account account) { 6 try { 7 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); 8 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); 9 SqlSession sqlSession = factory.openSession(true); 10 AccountMapper mapper = sqlSession.getMapper(AccountMapper.class); 11 mapper.save(account); 12 } catch (IOException e) { 13 e.printStackTrace(); 14 } 15 } 16 17 @Override 18 public ListfindAll() { 19 try { 20 InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); 21 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); 22 SqlSession sqlSession = factory.openSession(true); 23 AccountMapper mapper = sqlSession.getMapper(AccountMapper.class); 24 List accountList = mapper.findAll(); 25 return accountList; 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 return null; 30 } 31 }
05. 前端控制器的编写
1 @Controller 2 @RequestMapping("/account") 3 public class AccountController { 4 5 @Autowired 6 private AccountService accountService; 7 8 @RequestMapping("/save") 9 public String save(Account account){ 10 accountService.save(account); 11 return "forward:/account/findAll"; 12 } 13 14 @RequestMapping("/findAll") 15 public ModelAndView findAll(){ 16 ListaccountList = accountService.findAll(); 17 ModelAndView modelAndView = new ModelAndView(); 18 modelAndView.addObject("accountList",accountList); 19 modelAndView.setViewName("accountlist"); 20 return modelAndView; 21 } 22 }
06. 数据库连接参数配置 jdbc.properties
1 jdbc.driver=com.mysql.cj.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/ssm 3 jdbc.username=root 4 jdbc.password=123456
07. 日志配置文件 log4j.properties
1 ### direct log messages to stdout ### 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.Target=System.out 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 5 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 6 7 ### direct messages to file mylog.log ### 8 log4j.appender.file=org.apache.log4j.FileAppender 9 log4j.appender.file.File=D:\\Demos\\Java\\mylog.log 10 log4j.appender.file.layout=org.apache.log4j.PatternLayout 11 log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 12 13 ### set log levels - for more verbose logging change 'info' to 'debug' ### 14 15 log4j.rootLogger=all, stdout
08. mybatis 模块业务配置文件 XxxxMapper.xml (注意别名的配置)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="club.wuyu.mapper.AccountMapper"> 6 7 <insert id="save" parameterType="account"> 8 insert into account values (#{id},#{name},#{money}) 9 insert> 10 11 12 <select id="findAll" resultType="account"> 13 select * from account 14 select> 15 mapper>
09. mybatis 核心配置文件 sqlConfig.xml (名称自行决定,无格式要求) : 注意别名和mapper映射配置,可以直接配置包名,而不用一个一个配置
1 <?xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <properties resource="jdbc.properties"/> 8 9 <typeAliases> 10 11 <package name="club.wuyu.domain"/> 12 typeAliases> 13 14 <environments default="dev"> 15 <environment id="dev"> 16 <transactionManager type="JDBC">transactionManager> 17 <dataSource type="POOLED"> 18 <property name="driver" value="${jdbc.driver}"/> 19 <property name="url" value="${jdbc.url}"/> 20 <property name="username" value="${jdbc.username}"/> 21 <property name="password" value="${jdbc.password}"/> 22 dataSource> 23 environment> 24 environments> 25 26 <mappers> 27 28 <package name="club.wuyu.mapper"/> 29 mappers> 30 configuration>
10. Spring 配置文件 applicationContext.xml (排除了控制器的扫描)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation=" 6 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 8 "> 9 10 11 <context:component-scan base-package="club.wuyu"> 12 13 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 14 context:component-scan> 15 16 beans>
11. SpringMVC配置文件 sping-mvc.xml (名称自定义,无要求; )
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 9 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 10 "> 11 12 13 <context:component-scan base-package="club.wuyu.controller"/> 14 15 <mvc:annotation-driven> 16 17 18 <mvc:message-converters> 19 <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 20 <constructor-arg value="utf-8"/> 21 bean> 22 mvc:message-converters> 23 mvc:annotation-driven> 24 25 <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 26 <property name="prefix" value="/WEB-INF/pages/"/> 27 <property name="suffix" value=".jsp"/> 28 bean> 29 30 <mvc:default-servlet-handler/> 31 32 beans>
12. web.xml 配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 7 8 <context-param> 9 <param-name>contextConfigLocationparam-name> 10 <param-value>classpath:applicationContext.xmlparam-value> 11 context-param> 12 <listener> 13 <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class> 14 listener> 15 16 17 <servlet> 18 <servlet-name>DispatcherServletservlet-name> 19 <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> 20 <init-param> 21 <param-name>contextConfigLocationparam-name> 22 <param-value>classpath:spring-mvc.xmlparam-value> 23 init-param> 24 <load-on-startup>1load-on-startup> 25 servlet> 26 <servlet-mapping> 27 <servlet-name>DispatcherServletservlet-name> 28 <url-pattern>/url-pattern> 29 servlet-mapping> 30 31 32 <filter> 33 <filter-name>CharacterEncodingFilterfilter-name> 34 <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class> 35 <init-param> 36 <param-name>encodingparam-name> 37 <param-value>utf-8param-value> 38 init-param> 39 filter> 40 <filter-mapping> 41 <filter-name>CharacterEncodingFilterfilter-name> 42 <url-pattern>/*url-pattern> 43 filter-mapping> 44 45 web-app>
---------------------------------------------------------------------------------------------
B: SSM 整合
>> 核心处理点,主要在于业务层的确 Service;
从 04. 配置 service 接口及实现类的编写 这一项中所展示的源码看,myBatis核心配置文件被多次加载,内部业务中,多数代码完全一样,区别只在于获取 mapper 以后的业务处理不同;
---------------------------------------------------------------------------------------
01. 将 SqlSessionFactory 整合到 Spring 当中去
02. 在 applicationConfig.xml 中进行配置 (让 Spring 容器可以产生 Mapper 的实现类)
1 2class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 3 4 5
03. 在 applicationConfig.xml 中进行配置,事务管理增强
1 2 3 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 4 <property name="dataSource" ref="dataSource"/> 5 bean> 6 7 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 8 <tx:attributes> 9 10 <tx:method name="*"/> 11 tx:attributes> 12 tx:advice> 13 14 <aop:config> 15 16 <aop:pointcut id="txPointCut" expression="execution(* club.wuyu.service.impl.*.*(..))"/> 17 18 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> 19 aop:config>
04. 修改服务端实现代码
1 @Service("accountService") 2 public class AccountServiceImpl implements AccountService { 3 4 @Autowired 5 private AccountMapper accountMapper; 6 7 @Override 8 public void save(Account account) { 9 accountMapper.save(account); 10 } 11 12 @Override 13 public ListfindAll() { 14 List accountList = accountMapper.findAll(); 15 return accountList; 16 } 17 }
>> 整合后的 applicationConfig.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xsi:schemaLocation=" 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 12 "> 13 14 <context:component-scan base-package="club.wuyu"> 15 16 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 17 context:component-scan> 18 19 20 21 <context:property-placeholder location="classpath:jdbc.properties"/> 22 23 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 24 <property name="driverClassName" value="${jdbc.driver}"/> 25 <property name="url" value="${jdbc.url}"/> 26 <property name="username" value="${jdbc.username}"/> 27 <property name="password" value="${jdbc.password}"/> 28 bean> 29 30 <bean id="sqlsessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 31 <property name="dataSource" ref="dataSource"/> 32 <property name="configLocation" value="classpath:sqlMapConfig.xml"/> 33 bean> 34 35 36 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 37 38 <property name="basePackage" value="club.wuyu.mapper"/> 39 bean> 40 41 42 43 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 44 <property name="dataSource" ref="dataSource"/> 45 bean> 46 47 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 48 <tx:attributes> 49 50 <tx:method name="*"/> 51 tx:attributes> 52 tx:advice> 53 54 <aop:config> 55 56 <aop:pointcut id="txPointCut" expression="execution(* club.wuyu.service.impl.*.*(..))"/> 57 58 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> 59 aop:config> 60 61 beans>
>> 整合后的 sqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 <typeAliases> 8 9 <package name="club.wuyu.domain"/> 10 typeAliases> 11 configuration>
-----------------------------------------------------------------------------
C: 开发过程中较容易忽略而造成错误的地方
>> 01. 坐标引用,容易忽略 aspectjweaver 的引用
>> 02. 控制器函数中返回的 ModelAndView , 配置返回数据集时,容易忽略属性名称这项
* modelAndView.addObject( 属性名, 对象)
很容易直接配置成: modelAndView.addObject(对象)
>> 03. 前端页面中使用 jstl 进行遍历时,接收参数容易 缺少 ${} 配置
*
很容易直接配置成:
-----------------------------------------------------------------------------
D: 关闭服务时,异常的处理
>> JDBC 驱动相关异常
>> 解决方式 ( 新增监听类 DriverManagerListener 并在 web.xml 中进行配置 )
1 package club.wuyu.listener; 2 3 import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread; 4 5 import javax.servlet.ServletContextEvent; 6 import javax.servlet.ServletContextListener; 7 import java.sql.DriverManager; 8 import java.sql.SQLException; 9 10 public class DriverManagerListener implements ServletContextListener { 11 12 @Override 13 public void contextInitialized(ServletContextEvent sce) { 14 //ServletContextListener.super.contextInitialized(sce); 15 } 16 17 @Override 18 public void contextDestroyed(ServletContextEvent sce) { 19 //ServletContextListener.super.contextDestroyed(sce); 20 21 while (DriverManager.getDrivers().hasMoreElements()){ 22 try { 23 DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement()); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 } 27 } 28 AbandonedConnectionCleanupThread.checkedShutdown(); 29 } 30 }
在 web.xml 中配置监听
12 class>club.wuyu.listener.DriverManagerListener class> 3
问题解决了