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     List findAll();
6 }

  04. 配置 service 接口及实现类的编写(常规方法下) 

1 public interface AccountService {
2     /*保存数据*/
3     void save(Account account);
4     /*加载全部数据*/
5     List findAll();
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 List findAll() {
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         List accountList = 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     
2     class="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 List findAll() {
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 进行遍历时,接收参数容易 缺少 ${} 配置

    * ${accountList}" var="account"> 

      很容易直接配置成:  accountList" var="account">

 -----------------------------------------------------------------------------

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  中配置监听

1     
2         class>club.wuyu.listener.DriverManagerListenerclass>
3     

  问题解决了