• SSM 框架整合


    原始整合方式

    • 数据表

      1. create database ssm character set utf8;
      2. use ssm;
      3. create table account(
      4. id int primary key auto_increment,
      5. name varchar(100),
      6. money double(7,2)
      7. );
    • 创建 Maven 工程

    • 导入 Maven 坐标

      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <project xmlns="http://maven.apache.org/POM/4.0.0"
      3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5. <modelVersion>4.0.0</modelVersion>
      6. <groupId>com.ruochen</groupId>
      7. <artifactId>ssm</artifactId>
      8. <version>1.0-SNAPSHOT</version>
      9. <packaging>war</packaging>
      10. <properties>
      11. <maven.compiler.source>8</maven.compiler.source>
      12. <maven.compiler.target>8</maven.compiler.target>
      13. </properties>
      14. <dependencies>
      15. <!--spring相关-->
      16. <dependency>
      17. <groupId>org.springframework</groupId>
      18. <artifactId>spring-context</artifactId>
      19. <version>5.0.5.RELEASE</version>
      20. </dependency>
      21. <!--aop织入-->
      22. <dependency>
      23. <groupId>org.aspectj</groupId>
      24. <artifactId>aspectjweaver</artifactId>
      25. <version>1.8.8</version>
      26. </dependency>
      27. <dependency>
      28. <groupId>org.springframework</groupId>
      29. <artifactId>spring-jdbc</artifactId>
      30. <version>5.0.5.RELEASE</version>
      31. </dependency>
      32. <!--事务相关-->
      33. <dependency>
      34. <groupId>org.springframework</groupId>
      35. <artifactId>spring-tx</artifactId>
      36. <version>5.0.5.RELEASE</version>
      37. </dependency>
      38. <!--测试相关-->
      39. <dependency>
      40. <groupId>org.springframework</groupId>
      41. <artifactId>spring-test</artifactId>
      42. <version>5.0.5.RELEASE</version>
      43. </dependency>
      44. <!--springmvc相关-->
      45. <dependency>
      46. <groupId>org.springframework</groupId>
      47. <artifactId>spring-webmvc</artifactId>
      48. <version>5.0.5.RELEASE</version>
      49. </dependency>
      50. <!--servlet 和 jsp-->
      51. <dependency>
      52. <groupId>javax.servlet</groupId>
      53. <artifactId>servlet-api</artifactId>
      54. <version>2.5</version>
      55. </dependency>
      56. <dependency>
      57. <groupId>javax.servlet.jsp</groupId>
      58. <artifactId>jsp-api</artifactId>
      59. <version>2.0</version>
      60. </dependency>
      61. <!--mybatis 相关-->
      62. <dependency>
      63. <groupId>org.mybatis</groupId>
      64. <artifactId>mybatis</artifactId>
      65. <version>3.5.5</version>
      66. </dependency>
      67. <!--spring 整合 mybatis -->
      68. <dependency>
      69. <groupId>org.mybatis</groupId>
      70. <artifactId>mybatis-spring</artifactId>
      71. <version>1.3.1</version>
      72. </dependency>
      73. <dependency>
      74. <groupId>mysql</groupId>
      75. <artifactId>mysql-connector-java</artifactId>
      76. <version>5.1.46</version>
      77. </dependency>
      78. <!--数据源-->
      79. <dependency>
      80. <groupId>c3p0</groupId>
      81. <artifactId>c3p0</artifactId>
      82. <version>0.9.1.2</version>
      83. </dependency>
      84. <dependency>
      85. <groupId>junit</groupId>
      86. <artifactId>junit</artifactId>
      87. <version>4.13</version>
      88. <scope>test</scope>
      89. </dependency>
      90. <dependency>
      91. <groupId>jstl</groupId>
      92. <artifactId>jstl</artifactId>
      93. <version>1.2</version>
      94. </dependency>
      95. </dependencies>
      96. </project>
    • 编写实体类 Account.java

      1. package com.ruochen.domain;
      2. public class Account {
      3. private Integer id;
      4. private String name;
      5. private Double money;
      6. public Integer getId() {
      7. return id;
      8. }
      9. public void setId(Integer id) {
      10. this.id = id;
      11. }
      12. public String getName() {
      13. return name;
      14. }
      15. public void setName(String name) {
      16. this.name = name;
      17. }
      18. public Double getMoney() {
      19. return money;
      20. }
      21. public void setMoney(Double money) {
      22. this.money = money;
      23. }
      24. @Override
      25. public String toString() {
      26. return "Account{" +
      27. "id=" + id +
      28. ", name='" + name + '\'' +
      29. ", money=" + money +
      30. '}';
      31. }
      32. }
    • 编写 Mapper 接口

      1. package com.ruochen.mapper;
      2. import com.ruochen.domain.Account;
      3. import java.util.List;
      4. public interface AccountMapper {
      5. void save(Account account);
      6. List findAll();
      7. }
    • 编写 Service 接口

      1. package com.ruochen.service;
      2. import com.ruochen.domain.Account;
      3. import java.util.List;
      4. public interface AccountService {
      5. void save(Account account);
      6. List findAll();
      7. }
    • 编写 Service 接口实现

      1. package com.ruochen.service.impl;
      2. import com.ruochen.domain.Account;
      3. import com.ruochen.mapper.AccountMapper;
      4. import com.ruochen.service.AccountService;
      5. import org.apache.ibatis.io.Resources;
      6. import org.apache.ibatis.session.SqlSession;
      7. import org.apache.ibatis.session.SqlSessionFactory;
      8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      9. import org.springframework.stereotype.Service;
      10. import java.io.IOException;
      11. import java.io.InputStream;
      12. import java.util.List;
      13. @Service("accountService")
      14. public class AccountServiceImpl implements AccountService {
      15. @Override
      16. public void save(Account account) {
      17. try {
      18. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
      19. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
      20. SqlSession sqlSession = sqlSessionFactory.openSession();
      21. AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
      22. mapper.save(account);
      23. sqlSession.commit();
      24. sqlSession.close();
      25. } catch (IOException e) {
      26. e.printStackTrace();
      27. }
      28. }
      29. @Override
      30. public List findAll() {
      31. try {
      32. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
      33. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
      34. SqlSession sqlSession = sqlSessionFactory.openSession();
      35. AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
      36. List accountList = mapper.findAll();
      37. sqlSession.close();
      38. return accountList;
      39. } catch (IOException e) {
      40. e.printStackTrace();
      41. }
      42. return null;
      43. }
      44. }
    • 编写 Controller

      1. package com.ruochen.controller;
      2. import com.ruochen.domain.Account;
      3. import com.ruochen.service.AccountService;
      4. import org.springframework.beans.factory.annotation.Autowired;
      5. import org.springframework.stereotype.Controller;
      6. import org.springframework.web.bind.annotation.RequestMapping;
      7. import org.springframework.web.bind.annotation.ResponseBody;
      8. import org.springframework.web.servlet.ModelAndView;
      9. import java.util.List;
      10. @Controller
      11. @RequestMapping("/account")
      12. public class AccountController {
      13. @Autowired
      14. private AccountService accountService;
      15. // 保存
      16. @RequestMapping(value = "/save", produces = "text/html;charset=UTF-8")
      17. @ResponseBody
      18. public String save(Account account) {
      19. accountService.save(account);
      20. return "保存成功";
      21. }
      22. // 查询
      23. @RequestMapping("/findAll")
      24. public ModelAndView findAll() {
      25. List accountList = accountService.findAll();
      26. ModelAndView modelAndView = new ModelAndView();
      27. modelAndView.addObject("accountList", accountList);
      28. modelAndView.setViewName("accountList");
      29. return modelAndView;
      30. }
      31. }
    • 编写添加页面

      1. <%--
      2. Created by IntelliJ IDEA.
      3. User: ruochen
      4. Date: 2022/3/12
      5. Time: 21:31
      6. To change this template use File | Settings | File Templates.
      7. --%>
      8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      9. <html>
      10. <head>
      11. <title>Title</title>
      12. </head>
      13. <body>
      14. <h1>添加账户信息表单</h1>
      15. <form name="accountForm" action="${pageContext.request.contextPath}/account/save" method="post">
      16. 账户名称:<input type="text" name="name"><br/>
      17. 账户金额:<input type="text" name="money"><br/>
      18. <input type="submit" value="保存"><br/>
      19. </form>
      20. </body>
      21. </html>
    • 编写列表页面

      1. <%--
      2. Created by IntelliJ IDEA.
      3. User: ruochen
      4. Date: 2022/3/12
      5. Time: 21:34
      6. To change this template use File | Settings | File Templates.
      7. --%>
      8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      9. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      10. <html>
      11. <head>
      12. <title>Title</title>
      13. </head>
      14. <body>
      15. <h1>展示账户数据列表</h1>
      16. <table border="1">
      17. <tr>
      18. <th>账户ID</th>
      19. <th>账户名称</th>
      20. <th>账户金额</th>
      21. </tr>
      22. <c:forEach items="${accountList}" var="account">
      23. <tr>
      24. <td>${account.id}</td>
      25. <td>${account.name}</td>
      26. <td>${account.money}</td>
      27. </tr>
      28. </c:forEach>
      29. </table>
      30. </body>
      31. </html>
    • 编写相应配置文件

      • Spring 配置文件:applicationContext.xml
      1. "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. <context:component-scan base-package="com.ruochen">
      10. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      11. context:component-scan>
      12. beans>
      • SpringMVC 配置文件:spring-mvc.xml
      1. "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:mvc="http://www.springframework.org/schema/mvc"
      5. xmlns:context="http://www.springframework.org/schema/context"
      6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      7. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
      8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      9. <context:component-scan base-package="com.ruochen.controller"/>
      10. <mvc:annotation-driven/>
      11. <bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      12. <property name="prefix" value="/WEB-INF/pages/"/>
      13. <property name="suffix" value=".jsp"/>
      14. bean>
      15. <mvc:default-servlet-handler/>
      16. beans>
      • MyBatis 映射文件:AccountMapper.xml
      1. "1.0" encoding="UTF-8" ?>
      2. mapper
      3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      5. <mapper namespace="com.ruochen.mapper.AccountMapper">
      6. <insert id="save" parameterType="account">
      7. insert into account
      8. values (#{id}, #{name}, #{money})
      9. insert>
      10. <select id="findAll" resultType="account">
      11. select *
      12. from account
      13. select>
      14. mapper>
      • MyBatis 核心文件:sqlMapConfig.xml
      1. "1.0" encoding="UTF-8" ?>
      2. configuration
      3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
      5. <configuration>
      6. <properties resource="jdbc.properties"/>
      7. <typeAliases>
      8. <package name="com.ruochen.domain"/>
      9. typeAliases>
      10. <environments default="development">
      11. <environment id="development">
      12. <transactionManager type="JDBC"/>
      13. <dataSource type="POOLED">
      14. <property name="driver" value="${jdbc.driver}"/>
      15. <property name="url" value="${jdbc.url}"/>
      16. <property name="username" value="${jdbc.username}"/>
      17. <property name="password" value="${jdbc.password}"/>
      18. dataSource>
      19. environment>
      20. environments>
      21. <mappers>
      22. <package name="com.ruochen.mapper"/>
      23. mappers>
      24. configuration>
      • 数据库连接信息文件:jdbc.properties
      1. jdbc.driver=com.mysql.jdbc.Driver
      2. jdbc.url=jdbc:mysql://localhost:3306/ssm?useSSL=false&useServerPrepStmts=true&useUnicode=true&characterEncoding=UTF-8
      3. jdbc.username=root
      4. jdbc.password=ruochen666
      • Web.xml 文件: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. <!--spring 监听器-->
      7. <context-param>
      8. <param-name>contextConfigLocation</param-name>
      9. <param-value>classpath:applicationContext.xml</param-value>
      10. </context-param>
      11. <listener>
      12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      13. </listener>
      14. <!--springmvc 的前端控制器-->
      15. <servlet>
      16. <servlet-name>DispatcherServlet</servlet-name>
      17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      18. <init-param>
      19. <param-name>contextConfigLocation</param-name>
      20. <param-value>classpath:spring-mvc.xml</param-value>
      21. </init-param>
      22. <load-on-startup>1</load-on-startup>
      23. </servlet>
      24. <servlet-mapping>
      25. <servlet-name>DispatcherServlet</servlet-name>
      26. <url-pattern>/</url-pattern>
      27. </servlet-mapping>
      28. <!--乱码过滤器-->
      29. <filter>
      30. <filter-name>CharacterEncodingFilter</filter-name>
      31. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      32. <init-param>
      33. <param-name>encoding</param-name>
      34. <param-value>UTF-8</param-value>
      35. </init-param>
      36. </filter>
      37. <filter-mapping>
      38. <filter-name>CharacterEncodingFilter</filter-name>
      39. <url-pattern>/*</url-pattern>
      40. </filter-mapping>
      • 日志文件:log4j.xml
      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. ### direct messages to file mylog.log ###
      7. log4j.appender.file=org.apache.log4j.FileAppender
      8. log4j.appender.file.File=c:/mylog.log
      9. log4j.appender.file.layout=org.apache.log4j.PatternLayout
      10. log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
      11. ### set log levels - for more verbose logging change 'info' to 'debug' ###
      12. log4j.rootLogger=debug, stdout

    MyBatis 整合 Spring 实现

    • sqlMapConfig.xml 修改如下

      1. "1.0" encoding="UTF-8" ?>
      2. configuration
      3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
      5. <configuration>
      6. <typeAliases>
      7. <package name="com.ruochen.domain"/>
      8. typeAliases>
      9. configuration>
    • 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. 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. <!--组件扫描 扫描 service 和 mapper-->
      14. <context:component-scan base-package="com.ruochen">
      15. <!--排除controller的扫描-->
      16. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      17. </context:component-scan>
      18. <!--加载 properties 文件-->
      19. <context:property-placeholder location="classpath:jdbc.properties"/>
      20. <!--配置数据源-->
      21. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      22. <property name="driverClass" value="${jdbc.driver}"/>
      23. <property name="jdbcUrl" value="${jdbc.url}"/>
      24. <property name="user" value="${jdbc.username}"/>
      25. <property name="password" value="${jdbc.password}"/>
      26. </bean>
      27. <!--配置 sessionFactory-->
      28. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      29. <property name="dataSource" ref="dataSource"/>
      30. <!--加载 mybatis 核心文件-->
      31. <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
      32. </bean>
      33. <!--扫描 mapper 所在的包,为 mapper 创建实现类-->
      34. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      35. <property name="basePackage" value="com.ruochen.mapper"/>
      36. </bean>
      37. <!--声明式事务控制-->
      38. <!--平台事务管理器-->
      39. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      40. <property name="dataSource" ref="dataSource"/>
      41. </bean>
      42. <!--配置事务增强-->
      43. <tx:advice id="txAdvice">
      44. <tx:attributes>
      45. <tx:method name="*"/>
      46. </tx:attributes>
      47. </tx:advice>
      48. <!--事务的aop织入-->
      49. <aop:config>
      50. <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.ruochen.service.impl.*.*(..))"/>
      51. </aop:config>
      52. </beans>
    • AccountServiceImpl.java 修改如下

      1. package com.ruochen.service.impl;
      2. import com.ruochen.domain.Account;
      3. import com.ruochen.mapper.AccountMapper;
      4. import com.ruochen.service.AccountService;
      5. import org.springframework.beans.factory.annotation.Autowired;
      6. import org.springframework.stereotype.Service;
      7. import java.util.List;
      8. @Service("accountService")
      9. public class AccountServiceImpl implements AccountService {
      10. @Autowired
      11. private AccountMapper accountMapper;
      12. @Override
      13. public void save(Account account) {
      14. accountMapper.save(account);
      15. }
      16. @Override
      17. public List findAll() {
      18. return accountMapper.findAll();
      19. }
      20. }

    报错:Method com/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Z is abstract 解决方法 在 pom.xml 文件中修改C3P0的依赖包

    1. <dependency>
    2. <groupId>com.mchange</groupId>
    3. <artifactId>c3p0</artifactId>
    4. <version>0.9.5.2</version>
    5. </dependency>
  • 相关阅读:
    C++静态代码检查工具 - cppcheck
    Node.js--》简易资金管理系统后台项目实战(后端)
    Docker常用基础指令
    智慧供应链解决方案-最新全套文件
    Centos - DNS - 域名解析 服务搭建
    【动态规划】leetcode 1137. 第 N 个泰波那契数
    壳聚糖修饰人血清白蛋白 Chitosan-HSA,根皮苷修饰人血清白蛋白(Phlorizin-HSA)
    【MYSQL安装】Liunx内核为CentOS7
    竖式计算(c++基础)
    数据结构-单链表(增删查改)
  • 原文地址:https://blog.csdn.net/jcc4261/article/details/127682186