编译器:IDEA
数据库:Mysql 8.0
项目要求:实现张三给李四转账
如果自己有项目,可以根据本篇文章修改
-- 因为我们项目的目标只是实现一个简单的转账,所以我们只使用一个user表,一共三个字段,id,名字,余额

可以自己搭,也可以用下面的
-
- SET NAMES utf8mb4;
- SET FOREIGN_KEY_CHECKS = 0;
-
- -- ----------------------------
- -- Table structure for user
- -- ----------------------------
- DROP TABLE IF EXISTS `user`;
- CREATE TABLE `user` (
- `user_id` int(11) NOT NULL,
- `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
- `user_money` float(50, 0) NULL DEFAULT NULL,
- PRIMARY KEY (`user_id`) USING BTREE
- ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-
- -- ----------------------------
- -- Records of user
- -- ----------------------------
- INSERT INTO `user` VALUES (1, '张三', 90);
- INSERT INTO `user` VALUES (2, '李四', 20);
- INSERT INTO `user` VALUES (3, '王五', 90);
- INSERT INTO `user` VALUES (4, '赵六', 0);
-
- SET FOREIGN_KEY_CHECKS = 1;
清楚自己需要做什么功能,准备对应的sql语句



控制器,Dao,实体,服务

(
是类,
是接口)
然后添加一个汤姆猫

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

- "1.0" encoding="UTF-8"?>
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.fixgroupId>
- <artifactId>hellossmartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
- <name>hellossm Maven Webappname>
-
- <url>http://www.example.comurl>
-
-
- <properties>
- <spring.version>5.1.8.RELEASEspring.version>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>log4jgroupId>
- <artifactId>log4jartifactId>
- <version>1.2.17version>
- dependency>
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.aspectjgroupId>
- <artifactId>aspectjweaverartifactId>
- <version>1.8.7version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.9.8version>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>javax.servlet.jspgroupId>
- <artifactId>jsp-apiartifactId>
- <version>2.0version>
- <scope>providedscope>
- dependency>
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>jstlartifactId>
- <version>1.2version>
- dependency>
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>8.0.15version>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.1.10version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.3.0version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>1.2.3version>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.1.8version>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>1.18.12version>
- dependency>
- dependencies>
- project>
在目录下 resources 目录下创建五个文件
jdbc.properties mybatis-config.xml spring-dao.xml spring-web-xml
userMapper.xml (要在resources中建mapper包,并放在包里)

(替换自己的mysql账户密码跟数据库名)
- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/up?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
- jdbc.username=root
- jdbc.password=a123
- "1.0" encoding="UTF-8" ?>
- configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
-
- <setting name="useGeneratedKeys" value="true"/>
-
- <setting name="logImpl" value="STDOUT_LOGGING" />
- settings>
- configuration>
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- 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">
-
-
- <context:component-scan base-package="com.an"/>
-
-
- <context:property-placeholder location="classpath:jdbc.properties"/>
-
-
- <bean id="dataSource"
- class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
-
- <property name="url" value="${jdbc.url}"/>
- <property name="driverClassName" value="${jdbc.driver}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- bean>
-
- <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="dataSource"/>
-
- <property name="configLocation" value="classpath:mybatis-config.xml"/>
-
- <property name="typeAliasesPackage" value="com.an.entity"/>
-
- <property name="mapperLocations" value="classpath:mapper/*.xml"/>
- bean>
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
- <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
-
- <property name="basePackage" value="com.an.dao"/>
- bean>
-
-
- <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
-
- <property name="dataSource" ref="dataSource"/>
- bean>
-
- <tx:annotation-driven transaction-manager="txManager"/>
-
- beans>
- "1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
- <context:component-scan base-package="com.an"/>
-
-
- <mvc:default-servlet-handler/>
-
- <mvc:annotation-driven>
- <mvc:message-converters>
- <bean class="org.springframework.http.converter.StringHttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>text/plain;charset=UTF-8value>
- <value>text/html;charset=UTF-8value>
- <value>application/json;charset=UTF-8value>
- list>
- property>
- bean>
- mvc:message-converters>
- mvc:annotation-driven>
-
-
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/pages/">property>
- <property name="suffix" value=".jsp">property>
- bean>
-
- beans>
-
这里填sql语句 #{ }是占位符
- "1.0" encoding="UTF-8"?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.an.dao.UserDao">
- <select id="selectUser" resultType="User">
- select * from user where user_id = #{uid}
- select>
-
- <update id="updateUserMoney">
- update user set user_money = #{money} where user_id = #{uid}
- update>
-
- mapper>
- "1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- id="WebApp_ID" version="3.0">
-
- <display-name>ssmdisplay-name>
-
- <-- 开启spring -->
- <servlet>
- <servlet-name>springservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:spring-*.xmlparam-value>
- init-param>
- <load-on-startup>1load-on-startup>
- servlet>
- <servlet-mapping>
- <servlet-name>springservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
-
- web-app>
如果按照 之前 的建好包了,那么就可以开始着手写类了
所在包:entity
实体类中的变量名与数据库的名字一样(避免不必要的冲突)
这里使用了lombok动态生成get set
- package com.an.entity;
-
- import lombok.Data;
-
- @Data
- public class User {
- int user_id;
- String user_name;
- float user_money;
- }
类型接口,用与与mapper交涉
- package com.an.dao;
- import com.an.entity.User;
- import org.apache.ibatis.annotations.Param;
-
- import java.util.List;
-
- public interface UserDao {
- User selectUser(int uid);
- // 查询某人
-
- int updateUserMoney(@Param("uid") int uid,@Param("money") float money);
- // 修改余额,这里用@param是因为要映射到mapper,之前试了不写就会说匹配不到参数
- }
跟Userdao写一样就行(别把类名也写一样了)
- package com.an.service;
- import com.an.entity.User;
- import java.util.List;
-
- public interface UserService {
- User selectUser(int uid);
- // 查询某人
-
- int updateUserMoney(int uid,float money);
- // 修改余额
- }
最后这四个字母是 大写的 挨 I 按亩m 批p 爱奥 l
- package com.an.service.Impl;
-
- import com.an.dao.UserDao;
- import com.an.entity.User;
- import com.an.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- @Service
- public class UserServiceImpl implements UserService {
-
- @Autowired
- UserDao userdao;
-
- @Override
- public User selectUser(int uid) {
- System.out.println("selectUser 进入服务层");
- User userAll = userdao.selectUser(uid);
- return userAll;
- }
-
- @Override
- public int updateUserMoney(int uid,float money) {
- System.out.println("updateUserMoney 进入服务层 uid -->" +uid +"; money --> "+ money);
- int succ = userdao.updateUserMoney(uid,money);
- return succ;
- }
- }
写完就可以进入测试流程了
我们可以在dao这里创建一个测试类



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

测试类会放在这个地方,不会被运行编译,方法单独运行
UserDaoTest
开始测试
- package com.an.dao;
-
- import com.an.entity.User;
- import com.an.service.Impl.UserServiceImpl;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.ApplicationContext;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("classpath:spring-dao.xml")
- //这里直接把spring配置进去,因为要装配一个容器
- public class UserDaoTest {
-
- @Autowired
- ApplicationContext context;
- //装配容器
-
- @Test
- public void selectUser() {
- UserServiceImpl userService = context.getBean(UserServiceImpl.class);
- // 拿取实现类
- User u = userService.selectUser(1);
- System.out.println(u);
-
- }
-
- @Test
- public void updateUserMoney() {
- UserServiceImpl userService = context.getBean(UserServiceImpl.class);
- int succ = userService.updateUserMoney(1,100);
- System.out.println("影响行 --> "+succ);
- }
- }
均测试成功


UserController
测试成功之后就可以写控制类了
- package com.an.controller;
-
- import com.an.entity.User;
- import com.an.service.Impl.UserServiceImpl;
- import org.apache.ibatis.annotations.Param;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- public class UserController {
-
- @Autowired
- UserServiceImpl userService;
- // 这里直接注入服务实现类
-
- @RequestMapping("view")
- public String selectUserAll(){
- System.out.println("进入视图");
- // 这里直接跳转到user.jsp
- return "tomoney";
- // 返回users ,usersjsp的名字,在spring-web中配置了视图解析器,返回jsp名就会被解析并实现视图
- }
-
- @RequestMapping("toFoMoney")
- @ResponseBody//不跳转页面,只是返回字符串
- public String updateUserMoney(@Param("uid") int uid,@Param("money")float money,@Param("touid") int touid){
- System.out.println("进入修改余额");
- User u1 = userService.selectUser(uid);
- float u1moeny = u1.getUser_money();
- float _u1money;//u1转账后的余额
- float _u2money;//u2转账后的余额
- //转账人的余额
-
- User u2 = userService.selectUser(touid);
- float u2money = u2.getUser_money();
- //收款人的余额
-
- if(u1moeny>=money){
- //判断转账人是否满足转账金额,如果余额大于或等于正在转账的金额,那么直接进入转账
- _u1money = u1moeny - money;
- userService.updateUserMoney(uid,_u1money);
- System.out.println(_u1money+" u1转账后余额");
- // u1新的余额
-
- _u2money = u2money += money;
- userService.updateUserMoney(touid,_u2money);
- System.out.println(_u1money+" u2收款后余额");
- // u2新的余额
- }else{
- return "转账失败"+u1.getUser_name()+"的钱不够"+money+"无法转账给"+u2.getUser_name();
- }
- return "转账成功"+u1.getUser_name()+"成功给"+u2.getUser_name()+"转账"+money+" 转账人" + u1.getUser_name()+"余额还有"+_u1money+" 收款人"+u2.getUser_name()+"余额还有"+_u2money;
- }
-
- }
创建jsp路径,这里也是本篇文章最后的定版结构了

- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Titletitle>
- head>
- <body>
- <a href="view">转账a>
- body>
- html>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Titletitle>
- head>
- <body>
- <form action="toFoMoney">
- <p>转账人id:<input type="number" name="uid"> 转账金额<input type="number" name="money" placeholder="转账金额">p>
- <p>收款人:<input type="number" name="touid"> p>
- <p><button type="submit">转账button> p>
- form>
-
- body>
- html>
最后打开汤姆猫
最终效果:
点击转账进入控制器 的 view


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

转账成功


赵六没钱,想给张三转100


转账失败