• 简易SSM框架转账


    编译器:IDEA

    数据库:Mysql 8.0

    项目要求:实现张三给李四转账

    如果自己有项目,可以根据本篇文章修改

    一、导入数据库

    -- 因为我们项目的目标只是实现一个简单的转账,所以我们只使用一个user表,一共三个字段,id,名字,余额

    可以自己搭,也可以用下面的

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for user
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `user`;
    7. CREATE TABLE `user` (
    8. `user_id` int(11) NOT NULL,
    9. `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
    10. `user_money` float(50, 0) NULL DEFAULT NULL,
    11. PRIMARY KEY (`user_id`) USING BTREE
    12. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    13. -- ----------------------------
    14. -- Records of user
    15. -- ----------------------------
    16. INSERT INTO `user` VALUES (1, '张三', 90);
    17. INSERT INTO `user` VALUES (2, '李四', 20);
    18. INSERT INTO `user` VALUES (3, '王五', 90);
    19. INSERT INTO `user` VALUES (4, '赵六', 0);
    20. SET FOREIGN_KEY_CHECKS = 1;

    清楚自己需要做什么功能,准备对应的sql语句

    二、创建工程

    (一)创建目录结构及类

    控制器,Dao,实体,服务

    是类,是接口)

    然后添加一个汤姆猫

    三、导包

    打开pom.xml,粘贴后记得刷一下如果刷不了可以右键 -->  meven -->Reload project

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.fixgroupId>
    6. <artifactId>hellossmartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>hellossm Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <spring.version>5.1.8.RELEASEspring.version>
    13. properties>
    14. <dependencies>
    15. <dependency>
    16. <groupId>org.springframeworkgroupId>
    17. <artifactId>spring-testartifactId>
    18. <version>${spring.version}version>
    19. dependency>
    20. <dependency>
    21. <groupId>log4jgroupId>
    22. <artifactId>log4jartifactId>
    23. <version>1.2.17version>
    24. dependency>
    25. <dependency>
    26. <groupId>junitgroupId>
    27. <artifactId>junitartifactId>
    28. <version>4.12version>
    29. <scope>testscope>
    30. dependency>
    31. <dependency>
    32. <groupId>org.springframeworkgroupId>
    33. <artifactId>spring-webmvcartifactId>
    34. <version>${spring.version}version>
    35. dependency>
    36. <dependency>
    37. <groupId>org.aspectjgroupId>
    38. <artifactId>aspectjweaverartifactId>
    39. <version>1.8.7version>
    40. dependency>
    41. <dependency>
    42. <groupId>org.springframeworkgroupId>
    43. <artifactId>spring-jdbcartifactId>
    44. <version>${spring.version}version>
    45. dependency>
    46. <dependency>
    47. <groupId>com.fasterxml.jackson.coregroupId>
    48. <artifactId>jackson-databindartifactId>
    49. <version>2.9.8version>
    50. dependency>
    51. <dependency>
    52. <groupId>javax.servletgroupId>
    53. <artifactId>javax.servlet-apiartifactId>
    54. <version>3.1.0version>
    55. <scope>providedscope>
    56. dependency>
    57. <dependency>
    58. <groupId>javax.servlet.jspgroupId>
    59. <artifactId>jsp-apiartifactId>
    60. <version>2.0version>
    61. <scope>providedscope>
    62. dependency>
    63. <dependency>
    64. <groupId>javax.servletgroupId>
    65. <artifactId>jstlartifactId>
    66. <version>1.2version>
    67. dependency>
    68. <dependency>
    69. <groupId>mysqlgroupId>
    70. <artifactId>mysql-connector-javaartifactId>
    71. <version>8.0.15version>
    72. dependency>
    73. <dependency>
    74. <groupId>com.alibabagroupId>
    75. <artifactId>druidartifactId>
    76. <version>1.1.10version>
    77. dependency>
    78. <dependency>
    79. <groupId>org.mybatisgroupId>
    80. <artifactId>mybatisartifactId>
    81. <version>3.3.0version>
    82. dependency>
    83. <dependency>
    84. <groupId>org.mybatisgroupId>
    85. <artifactId>mybatis-springartifactId>
    86. <version>1.2.3version>
    87. dependency>
    88. <dependency>
    89. <groupId>com.github.pagehelpergroupId>
    90. <artifactId>pagehelperartifactId>
    91. <version>5.1.8version>
    92. dependency>
    93. <dependency>
    94. <groupId>org.projectlombokgroupId>
    95. <artifactId>lombokartifactId>
    96. <version>1.18.12version>
    97. dependency>
    98. dependencies>
    99. project>

    四、配置文件

    (一)创建配置文件

    在目录下  resources   目录下创建五个文件

    jdbc.properties      mybatis-config.xml       spring-dao.xml        spring-web-xml 

     userMapper.xml  (要在resources中建mapper包,并放在包里)

    jdbc.properties

    (替换自己的mysql账户密码跟数据库名)

    1. jdbc.driver=com.mysql.cj.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/up?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    3. jdbc.username=root
    4. jdbc.password=a123
    mybatis-config.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. <settings>
    7. <setting name="useGeneratedKeys" value="true"/>
    8. <setting name="logImpl" value="STDOUT_LOGGING" />
    9. settings>
    10. configuration>
    spring-dao.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. xmlns:tx="http://www.springframework.org/schema/tx"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. http://www.springframework.org/schema/tx
    11. http://www.springframework.org/schema/tx/spring-tx.xsd">
    12. <context:component-scan base-package="com.an"/>
    13. <context:property-placeholder location="classpath:jdbc.properties"/>
    14. <bean id="dataSource"
    15. class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    16. <property name="url" value="${jdbc.url}"/>
    17. <property name="driverClassName" value="${jdbc.driver}"/>
    18. <property name="username" value="${jdbc.username}"/>
    19. <property name="password" value="${jdbc.password}"/>
    20. bean>
    21. <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    22. <property name="dataSource" ref="dataSource"/>
    23. <property name="configLocation" value="classpath:mybatis-config.xml"/>
    24. <property name="typeAliasesPackage" value="com.an.entity"/>
    25. <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    26. bean>
    27. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    28. <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
    29. <property name="basePackage" value="com.an.dao"/>
    30. bean>
    31. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    32. <property name="dataSource" ref="dataSource"/>
    33. bean>
    34. <tx:annotation-driven transaction-manager="txManager"/>
    35. beans>
    spring-web.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. 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. <context:component-scan base-package="com.an"/>
    11. <mvc:default-servlet-handler/>
    12. <mvc:annotation-driven>
    13. <mvc:message-converters>
    14. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    15. <property name="supportedMediaTypes">
    16. <list>
    17. <value>text/plain;charset=UTF-8value>
    18. <value>text/html;charset=UTF-8value>
    19. <value>application/json;charset=UTF-8value>
    20. list>
    21. property>
    22. bean>
    23. mvc:message-converters>
    24. mvc:annotation-driven>
    25. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    26. <property name="prefix" value="/WEB-INF/pages/">property>
    27. <property name="suffix" value=".jsp">property>
    28. bean>
    29. beans>
    userMapper.xml 

    这里填sql语句  #{ }是占位符

    指定接口,mapper标签里面的标签id指定接口方法,占位符内映射为方法传入的参数

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.an.dao.UserDao">
    4. <select id="selectUser" resultType="User">
    5. select * from user where user_id = #{uid}
    6. select>
    7. <update id="updateUserMoney">
    8. update user set user_money = #{money} where user_id = #{uid}
    9. update>
    10. mapper>
    (二)web.xml,开启spring
    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
    3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    4. id="WebApp_ID" version="3.0">
    5. <display-name>ssmdisplay-name>
    6. <-- 开启spring -->
    7. <servlet>
    8. <servlet-name>springservlet-name>
    9. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    10. <init-param>
    11. <param-name>contextConfigLocationparam-name>
    12. <param-value>classpath:spring-*.xmlparam-value>
    13. init-param>
    14. <load-on-startup>1load-on-startup>
    15. servlet>
    16. <servlet-mapping>
    17. <servlet-name>springservlet-name>
    18. <url-pattern>/url-pattern>
    19. servlet-mapping>
    20. web-app>

    三、类

    如果按照  之前 的建好包了,那么就可以开始着手写类了 

    (一)实体

        所在包:entity  

            User

    实体类中的变量名与数据库的名字一样(避免不必要的冲突)

    这里使用了lombok动态生成get set

    1. package com.an.entity;
    2. import lombok.Data;
    3. @Data
    4. public class User {
    5. int user_id;
    6. String user_name;
    7. float user_money;
    8. }

    (二)Dao
    UserDao

    类型接口,用与与mapper交涉

    1. package com.an.dao;
    2. import com.an.entity.User;
    3. import org.apache.ibatis.annotations.Param;
    4. import java.util.List;
    5. public interface UserDao {
    6. User selectUser(int uid);
    7. // 查询某人
    8. int updateUserMoney(@Param("uid") int uid,@Param("money") float money);
    9. // 修改余额,这里用@param是因为要映射到mapper,之前试了不写就会说匹配不到参数
    10. }
     (三)服务以及服务实现
             UserService

        跟Userdao写一样就行(别把类名也写一样了)

    1. package com.an.service;
    2. import com.an.entity.User;
    3. import java.util.List;
    4. public interface UserService {
    5. User selectUser(int uid);
    6. // 查询某人
    7. int updateUserMoney(int uid,float money);
    8. // 修改余额
    9. }
            UserServiceImpl

            最后这四个字母是   大写的 挨 I         按亩m  批p  爱奥 l

    1. package com.an.service.Impl;
    2. import com.an.dao.UserDao;
    3. import com.an.entity.User;
    4. import com.an.service.UserService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. @Service
    8. public class UserServiceImpl implements UserService {
    9. @Autowired
    10. UserDao userdao;
    11. @Override
    12. public User selectUser(int uid) {
    13. System.out.println("selectUser 进入服务层");
    14. User userAll = userdao.selectUser(uid);
    15. return userAll;
    16. }
    17. @Override
    18. public int updateUserMoney(int uid,float money) {
    19. System.out.println("updateUserMoney 进入服务层 uid -->" +uid +"; money --> "+ money);
    20. int succ = userdao.updateUserMoney(uid,money);
    21. return succ;
    22. }
    23. }
         

    四、测试

    写完就可以进入测试流程了

    我们可以在dao这里创建一个测试类

    选择junit4,把下面两个方法勾上

    测试类会放在这个地方,不会被运行编译,方法单独运行

    UserDaoTest

    开始测试

    1. package com.an.dao;
    2. import com.an.entity.User;
    3. import com.an.service.Impl.UserServiceImpl;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.context.ApplicationContext;
    8. import org.springframework.test.context.ContextConfiguration;
    9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    10. @RunWith(SpringJUnit4ClassRunner.class)
    11. @ContextConfiguration("classpath:spring-dao.xml")
    12. //这里直接把spring配置进去,因为要装配一个容器
    13. public class UserDaoTest {
    14. @Autowired
    15. ApplicationContext context;
    16. //装配容器
    17. @Test
    18. public void selectUser() {
    19. UserServiceImpl userService = context.getBean(UserServiceImpl.class);
    20. // 拿取实现类
    21. User u = userService.selectUser(1);
    22. System.out.println(u);
    23. }
    24. @Test
    25. public void updateUserMoney() {
    26. UserServiceImpl userService = context.getBean(UserServiceImpl.class);
    27. int succ = userService.updateUserMoney(1,100);
    28. System.out.println("影响行 --> "+succ);
    29. }
    30. }

    均测试成功

    (一)控制类

    UserController

    测试成功之后就可以写控制类了

    1. package com.an.controller;
    2. import com.an.entity.User;
    3. import com.an.service.Impl.UserServiceImpl;
    4. import org.apache.ibatis.annotations.Param;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Controller;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.ResponseBody;
    9. @Controller
    10. public class UserController {
    11. @Autowired
    12. UserServiceImpl userService;
    13. // 这里直接注入服务实现类
    14. @RequestMapping("view")
    15. public String selectUserAll(){
    16. System.out.println("进入视图");
    17. // 这里直接跳转到user.jsp
    18. return "tomoney";
    19. // 返回users ,usersjsp的名字,在spring-web中配置了视图解析器,返回jsp名就会被解析并实现视图
    20. }
    21. @RequestMapping("toFoMoney")
    22. @ResponseBody//不跳转页面,只是返回字符串
    23. public String updateUserMoney(@Param("uid") int uid,@Param("money")float money,@Param("touid") int touid){
    24. System.out.println("进入修改余额");
    25. User u1 = userService.selectUser(uid);
    26. float u1moeny = u1.getUser_money();
    27. float _u1money;//u1转账后的余额
    28. float _u2money;//u2转账后的余额
    29. //转账人的余额
    30. User u2 = userService.selectUser(touid);
    31. float u2money = u2.getUser_money();
    32. //收款人的余额
    33. if(u1moeny>=money){
    34. //判断转账人是否满足转账金额,如果余额大于或等于正在转账的金额,那么直接进入转账
    35. _u1money = u1moeny - money;
    36. userService.updateUserMoney(uid,_u1money);
    37. System.out.println(_u1money+" u1转账后余额");
    38. // u1新的余额
    39. _u2money = u2money += money;
    40. userService.updateUserMoney(touid,_u2money);
    41. System.out.println(_u1money+" u2收款后余额");
    42. // u2新的余额
    43. }else{
    44. return "转账失败"+u1.getUser_name()+"的钱不够"+money+"无法转账给"+u2.getUser_name();
    45. }
    46. return "转账成功"+u1.getUser_name()+"成功给"+u2.getUser_name()+"转账"+money+" 转账人" + u1.getUser_name()+"余额还有"+_u1money+" 收款人"+u2.getUser_name()+"余额还有"+_u2money;
    47. }
    48. }

    创建jsp路径,这里也是本篇文章最后的定版结构了

    index.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <a href="view">转账a>
    8. body>
    9. html>
    tomoney.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <form action="toFoMoney">
    8. <p>转账人id:<input type="number" name="uid"> 转账金额<input type="number" name="money" placeholder="转账金额">p>
    9. <p>收款人:<input type="number" name="touid"> p>
    10. <p><button type="submit">转账button> p>
    11. form>
    12. body>
    13. html>

    最后打开汤姆猫

    最终效果:

    点击转账进入控制器 的 view

            

    比如说张三现在有100圆子,给李四转 50 圆子

    转账成功

    赵六没钱,想给张三转100

    转账失败

  • 相关阅读:
    设计模式---工厂模式
    【011】Wireshark主窗口新增、删除显示的列数
    MLX90640 红外热成像传感器测温模块开发笔记(三)
    yolov5和yolov7之实例分割训练
    rdma-轮询常用cq函数。
    JVM调优-GC基本原理和调优关键分析
    《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第5章 实时技术
    消息队列十连问
    微信小程序 springboot新冠疫苗预约系统#计算机毕业设计
    (附源码)springboot水利机械厂仓储管理系统 毕业设计 091408
  • 原文地址:https://blog.csdn.net/qq_54179640/article/details/132800975