一.环境
javaWeb后端技术
框架:Spring+SpringMVC+Mybatis (redis含集群和单机简单应用)
服务器:tomcat8.5(同装8.0和9.0方便适应性调试) Nginx这个我也不会使 自行教程安装
IDE: IntelliJ)即可 之前用的Eclipse很久了,上手IDEA后真的很简单 自行教程安装
JDK: jdk8(JDK1.8.131) 自行教程安装
接口测试工具---------》(用于模拟请求获取服务器返回的JSONObject)
接口测试工具1:Postman
接口测试工具2:自写安卓应用->HttpURLconnection、OkHttp3、retrofit 自行百度教程
接口测试工具3:Web(网页技术:H5) ajax、node.js、XMLHttpRequest(原生ajax)(用于模拟请求) 自行百度教程
Redis:WIN版 ( 点此下载教程-提取码:2whr: 教程自带资源链接)
数据库:Mysql8.0.17 sqlite、SqlServer和Oracle暂不写 自行教程安装
数据库工具:Dos(cmd)、navicat.... 自行学习
项目管理工具:Maven(用于管理jar包) 我在写android的时候
Git工具:GitBash 这里我就不拿我仓库地址了(点此直接下载源码 提取码:pv8h)
二.创建工程
可以看到src>main下有个webapp,删除它,src是放java代码的地方,应该有java和resource两个文件夹
将pom.xml文件中的内容替换
<?xml version="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.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>WebLogin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>WebLogin Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.2.2.RELEASE</spring.version>
<security.version>5.2.1.RELEASE</security.version>
<slf4j.version>2.0.0-alpha1</slf4j.version>
<log4j.version>2.13.0</log4j.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<redis.version>3.2.0</redis.version>
<spring.data.redis.version>2.2.3.RELEASE</spring.data.redis.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--javax.mail-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!--spring依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!-- Druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--dbcp连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<!-- json配置-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.1</version>
</dependency>
<!-- google的json格式支持 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<!--阿里fastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--log4j2-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
<!--log4j2完 -//- shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.2</version>
</dependency>
<!--搭建redis:start-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${redis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring.data.redis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>${spring.data.redis.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--mybatis 逆向工程插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<finalName>WebLogin</finalName>
<resources>
<!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
你刚粘贴过来,你maven本地仓库不一定有这类炸包,或者没有该类对应版本的jar包,所以dependcies会泛红,将鼠标悬停到每个version泛红的地方,依次Update Maven Indices,请保证有网!他才会帮你下载jar包
将一.git工具处下载的源码下载下来,依次按java和resource将目录下的文件复制到工程对应位置
建立webapp,该文间夹等同于Eclipse->Dynamic Web Project中的WebContent,将源码包里的代码也复制到webapp文件夹
此时就可以添加module组件了,看左上角:File>Project Structure
现在配置webapp文件夹至web组件
此时你发现META-INF并未配置
此时web组件配置完成了一半,注意刚生成组件写的是web,你要自己改为webapp
上图Source Roots我已经配置完了,你们可能会显示,因为你们没有配置该项
在Artifacts进行配置,然后点击apply进行保存 不能直接点OK
接下来要配置服务器tomcat
如果你忘了将工程放至tomcat工作空间,会报warning, 请按以下步骤
好了,此时点击apply再点击ok进行保存
配置好了,先不用启动服务器
现在我们要实现分页获取用户功能,首先看源码
实体类YzUsers:
package ssm.Pojo;
// Generated 2019-11-16 13:53:28 by Hibernate Tools 3.6.0.Final
import java.util.HashSet;
import java.util.Set;
/**
* YzUsers generated by hbm2java
* 益众网用户实体类
*/
public class YzUsers implements java.io.Serializable {
private static final long serialVersionUID = 7828915891651379458L;
private String id; // 生成Java.util.UUID x32ef
private YzStatus yzStatus; //多对一关联:用户的身份
private String realname; // 用户设置的真实姓名或称谓 初始化12(大众会员)
private String username; // 用户用于登录的账号 Unique
private String password; // 用户用于登录的密码
private String qq; // 用户设置的QQ Default=NULL
private String email; // 用户个人邮箱,可用于找回密码 Default=NULL
private String wechat; // 用户微信号 Default=NULL
private String mobile; // 用户手机号 Default=NULL
private String address; // 用户联系地址 Default=NULL
private Integer age; // 用户年龄 存值区间[10,90] Default=10
private String sex; // 用户性别 约束(男或女)
private String derive; // 用户出生地
private String hobby; // 个人爱好
private String u_img; // 用户头像图片
private YzSurplus yzSurpluses;// 用户钱包,一对一关联
private Set<YzMerch> yzMerch= new HashSet<YzMerch>();
private Set<YzMerchUserOrder> yzMerchUserOrders = new HashSet<YzMerchUserOrder>(); // 用户订单,一对多关联
public YzUsers() {
}
public YzUsers(String realname, String username, String password) {
this.realname = realname;
this.username = username;
this.password = password;
}
public YzUsers(String id, YzStatus yzStatus, String realname, String username, String password, String qq, String email, String wechat, String mobile, String address, Integer age, String sex, String derive, String hobby, String u_img, YzSurplus yzSurpluses, Set<YzMerch> yzMerch, Set<YzMerchUserOrder> yzMerchUserOrders) {
this.id = id;
this.yzStatus = yzStatus;
this.realname = realname;
this.username = username;
this.password = password;
this.qq = qq;
this.email = email;
this.wechat = wechat;
this.mobile = mobile;
this.address = address;
this.age = age;
this.sex = sex;
this.derive = derive;
this.hobby = hobby;
this.u_img = u_img;
this.yzSurpluses = yzSurpluses;
this.yzMerch = yzMerch;
this.yzMerchUserOrders = yzMerchUserOrders;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public YzStatus getYzStatus() {
return yzStatus;
}
public void setYzStatus(YzStatus yzStatus) {
this.yzStatus = yzStatus;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getWechat() {
return wechat;
}
public void setWechat(String wechat) {
this.wechat = wechat;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getDerive() {
return derive;
}
public void setDerive(String derive) {
this.derive = derive;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public YzSurplus getYzSurpluses() {
return yzSurpluses;
}
public void setYzSurpluses(YzSurplus yzSurpluses) {
this.yzSurpluses = yzSurpluses;
}
public Set<YzMerchUserOrder> getYzMerchUserOrders() {
return yzMerchUserOrders;
}
public void setYzMerchUserOrders(Set<YzMerchUserOrder> yzMerchUserOrders) {
this.yzMerchUserOrders = yzMerchUserOrders;
}
public String getU_img() {
return u_img;
}
public void setU_img(String u_img) {
this.u_img = u_img;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public Set<YzMerch> getYzMerch() {
return yzMerch;
}
public void setYzMerch(Set<YzMerch> yzMerch) {
this.yzMerch = yzMerch;
}
public String toString(){
String Info="User [ ";
Info+="用户身份="+yzStatus.getStatus()+" ";
Info+="昵称="+realname+" ";
Info+="账号="+username+" ";
Info+="密码="+password+" ";
Info+="QQ号="+qq+" ";
Info+="邮箱="+email+" ";
Info+="微信="+wechat+" ";
Info+="电话="+mobile+" ";
Info+="地址="+address+" ";
Info+="年龄="+age+" ";
Info+="性别="+sex+" ";
Info+="籍贯="+derive+" ";
Info+="]";
return Info;
}
}
身份参照实体类YzStatus:
package ssm.Pojo;
// Generated 2019-11-16 13:53:28 by Hibernate Tools 3.6.0.Final
import java.util.HashSet;
import java.util.Set;
/**
* YzStatus generated by hbm2java
* 益众网用户身份映射参照的实体类
*/
public class YzStatus implements java.io.Serializable {
private static final long serialVersionUID = -6839053582167331067L;
private Integer id; // 底层数据库支持的identity生成的序列id
private String status; // 用户身份称谓
private int powerLevel; // 用户权限等级
private Set<YzUsers> yzUserses = new HashSet<YzUsers>(); // 该身份映射于参照用户
public YzStatus() {
}
public YzStatus(Integer id, String status, int powerLevel, Set<YzUsers> yzUserses) {
super();
this.id = id;
this.status = status;
this.powerLevel = powerLevel;
this.yzUserses = yzUserses;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public int getPowerLevel() {
return powerLevel;
}
public void setPowerLevel(int powerLevel) {
this.powerLevel = powerLevel;
}
public Set<YzUsers> getYzUserses() {
return yzUserses;
}
public void setYzUserses(Set<YzUsers> yzUserses) {
this.yzUserses = yzUserses;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public String toString(){
String Info="Status [ ";
Info+="id="+id+" ";
Info+="称谓="+status+" ";
Info+="级别="+powerLevel+" ";
Info+="]";
return Info;
}
}
用户余额实体类YzSurplus:
package ssm.Pojo;
// Generated 2019-11-16 13:53:28 by Hibernate Tools 3.6.0.Final
/**
* YzSurplus generated by hbm2java
* 益众网用户关联账户实体类
*/
public class YzSurplus implements java.io.Serializable {
private static final long serialVersionUID = 5610221464359637158L;
private String id; // 生成Java.util.UUID x32ef
private YzUsers yzUsers; // 一对一关联:账户对应的用户
private String surplus; // 该用户的钱包余额
public YzSurplus() {
}
public YzSurplus(String id, YzUsers yzUsers, String surplus) {
this.id = id;
this.yzUsers = yzUsers;
this.surplus = surplus;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public YzUsers getYzUsers() {
return this.yzUsers;
}
public void setYzUsers(YzUsers yzUsers) {
this.yzUsers = yzUsers;
}
public String getSurplus() {
return this.surplus;
}
public void setSurplus(String surplus) {
this.surplus = surplus;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public String toString(){
String Info="Suplus [ ";
Info+="用户姓名="+yzUsers.getRealname()+" ";
Info+="余额="+surplus+" ";
Info+="]";
return Info;
}
}
低层接口:UserDao
package ssm.Dao;
import org.apache.ibatis.annotations.Param;
import ssm.Pojo.YzUsers;
import java.util.List;
import java.util.Map;
/**
* 用户方法接口
*/
public interface UserDao {
//用户登陆
public YzUsers UserLogin(@Param("account") String account, @Param("password") String password);
//用户注册
public int UserRegister(@Param("user")YzUsers user);
//判断user_id是否存在
public int isExistUser(@Param("id")String UUID);
//用户注册使用,登陆的账号username必须唯一:检索是否存在
public int isExistUsername(@Param("username")String username);
//用户修改个人信息
public int updateUser(@Param("user")YzUsers user);
//删除用户
public int deleteUser(@Param("id")String user_id);
//查询所有用户,分页&计算用户总数
public List<YzUsers> queryAllUsers(@Param("index")Integer index,@Param("maxResult")Integer maxResult);
public int queryTotalUser();
//批量插入用户
public int BatchInsertUsers(Map<String,Object> map);
//批量查询用户List<user_id>
List<YzUsers> BatchFind(List<String> user_ids);
}
接口实现,mybatis是mapper.xml替代传统的UserDaoImpl UserDaoMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ssm.Dao.UserDao">
<!-- 单用户返回的user结构封装 -->
<resultMap id="YzUserMap" type="ssm.Pojo.YzUsers">
<id property="id" column="uid"/>
<result property="realname" column="realname"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="wechat" column="wechat"/>
<result property="mobile" column="mobile"/>
<result property="address" column="address"/>
<result property="age" column="age"/>
<result property="sex" column="sex"/>
<result property="derive" column="derive"/>
<result property="hobby" column="hobby"/>
<result property="u_img" column="u_img"/>
<association property="yzStatus" >
<id property="id" column="stid"/>
<result property="status" column="status"/>
<result property="powerLevel" column="PowerLevel"/>
</association>
<association property="yzSurpluses" >
<id property="id" column="spid"/>
<result property="surplus" column="surplus"/>
</association>
<collection property="yzMerch" ofType="ssm.Pojo.YzMerch">
<id property="id" column="meid"/>
<result property="merchName" column="MerchName"/>
<result property="merchNo" column="MerchNo"/>
<result property="classify" column="Classify"/>
<result property="merchant" column="Merchant"/>
<result property="introduce" column="Introduce"/>
<result property="retailPrice" column="RetailPrice"/>
<result property="surpAmount" column="SurpAmount"/>
<result property="m_img" column="m_img"/>
</collection>
<collection property="yzMerchUserOrders" ofType="ssm.Pojo.YzMerchUserOrder">
<id property="id" column="moid"/>
<result property="orderAmount" column="OrderAmount"/>
<result property="totalPrice" column="TotalPrice"/>
<result property="Time" column="OrderTime"/>
</collection>
</resultMap>
<!--用户登陆-->
<select id="UserLogin" parameterType="String" resultMap="YzUserMap">
select ys.id stid, status, PowerLevel,
u.id uid, realname, username, password, qq, email, wechat, mobile, address, age, sex, derive, hobby, status_id, u_img,
su.id spid, surplus,
m.id meid, MerchName, MerchNo, Classify, Merchant, Introduce, RetailPrice, SurpAmount, product_user_id, m_img,
ymuo.id moid, OrderAmount, TotalPrice, user_id, merch_id, OrderTime
from yz_status ys inner join (yz_users u inner join (yz_surplus su left join (yz_merch m left join yz_merch_user_order ymuo on m.id = ymuo.merch_id) on su.id=m.product_user_id)on u.id=su.id) on u.status_id = ys.id
where u.username=#{account} and u.password=#{password} /*'zhangsan' and u.password='123456';*/
</select>
<!--用户注册-->
<insert id="UserRegister" parameterType="ssm.Pojo.YzUsers">
insert into yz_users(id,realname, username, password
<if test="user.qq!=null">,qq</if>
<if test="user.email!=null">,email</if>
<if test="user.wechat!=null">,wechat</if>
<if test="user.mobile!=null">,mobile</if>
<if test="user.address!=null">,address</if>
<if test="user.age!=null">,age</if>
<if test="user.sex!=null">,sex</if>
<if test="user.derive!=null">,derive</if>
<if test="user.hobby!=null">,hobby</if>
<if test="user.yzStatus!=null">,status_id</if>
<if test="user.u_img!=null">,u_img</if>)
values(#{user.id},#{user.realname},#{user.username},#{user.password}
<if test="user.qq!=null">,#{user.qq}</if>
<if test="user.email!=null">,#{user.email}</if>
<if test="user.wechat!=null">,#{user.wechat}</if>
<if test="user.mobile!=null">,#{user.mobile}</if>
<if test="user.address!=null">,#{user.address}</if>
<if test="user.age!=null">,#{user.age}</if>
<if test="user.sex!=null">,#{user.sex}</if>
<if test="user.derive!=null">,#{user.derive}</if>
<if test="user.hobby!=null">,#{user.hobby}</if>
<if test="user.yzStatus!=null">,#{user.yzStatus.id}</if>
<if test="user.u_img!=null">,#{user.u_img}</if>)
</insert>
<!--判断用户id是否已存在-->
<select id="isExistUser" parameterType="String" resultType="int">
select count(u.id) from yz_users u where u.id=#{id}
</select>
<!--判断用户名是否被占用-->
<select id="isExistUsername" parameterType="String" resultType="int">
select count(u.username) from yz_users u where u.username=#{username}
</select>
<!--动态更新用户信息-->
<update id="updateUser" parameterType="ssm.Pojo.YzUsers">
update yz_users
<set>
<if test="user.realname!=null">realname= #{user.realname},</if>
<if test="user.password!=null">password=#{user.password},</if>
<if test="user.qq!=null">qq=#{user.qq},</if>
<if test="user.email!=null">email=#{user.email},</if>
<if test="user.wechat!=null">wechat=#{user.wechat},</if>
<if test="user.age!=null">age=#{user.age},</if>
<if test="user.sex!=null">sex=#{user.sex},</if>
<if test="user.derive!=null">derive=#{user.derive},</if>
<if test="user.hobby!=null">hobby=#{user.hobby},</if>
<if test="user.yzStatus!=null">status_id=#{user.yzStatus.id},</if>
<if test="user.u_img!=null">u_img=#{user.u_img},</if>
<if test="user.mobile!=null">mobile=#{user.mobile},</if>
<if test="user.address!=null">address=#{user.address},</if>
</set>
<where>
<choose>
<when test="user.id!=null">
and yz_users.id = #{user.id}
</when>
<otherwise>
and 1 = 2
</otherwise>
</choose>
</where>
</update>
<!--根据用户id删除用户-->
<delete id="deleteUser" parameterType="String">
delete from yz_users
<where>
<if test="id!=null">
and id=#{id}
</if>
</where>
</delete>
<!--计算用户表记录数,分页使用,或统计网站注册用户数-->
<select id="queryTotalUser" resultType="int">
select count(*) from yz_users
</select>
<!--分页查询用户-->
<select id="queryAllUsers" resultMap="YzUserMaps">
select ys.id stid, status, PowerLevel,
u.id uid, realname, username, password, qq, email, wechat, mobile, address, age, sex, derive, hobby, status_id, u_img,
su.id spid, surplus
from yz_status ys inner join (yz_users u inner join yz_surplus su on u.id=su.id) on u.status_id = ys.id
limit #{index},#{maxResult}
</select>
<!-- 多用户返回的user结构封装 -->
<resultMap id="YzUserMaps" type="ssm.Pojo.YzUsers">
<id property="id" column="uid"/>
<result property="realname" column="realname"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="wechat" column="wechat"/>
<result property="mobile" column="mobile"/>
<result property="address" column="address"/>
<result property="age" column="age"/>
<result property="sex" column="sex"/>
<result property="derive" column="derive"/>
<result property="hobby" column="hobby"/>
<result property="u_img" column="u_img"/>
<association property="yzStatus" >
<id property="id" column="stid"/>
<result property="status" column="status"/>
<result property="powerLevel" column="PowerLevel"/>
</association>
<association property="yzSurpluses" >
<id property="id" column="spid"/>
<result property="surplus" column="surplus"/>
</association>
</resultMap>
<!--批量注册用户 <vip企业通道> -->
<insert id="BatchInsertUsers" parameterType="java.util.HashMap">
insert into yz_users(id, realname, username, password, qq, email, wechat, mobile, address, age, sex, derive, hobby, status_id)
values
<include refid="BatchInsertUsersSQL"></include>
</insert>
<!-- 在打印控制台的执行语句中,写${field}可显示参数而#{}不可 -->
<!--批量注册用户 <vip企业通道> 嵌套语句,#{map.keyname}就可以拿到map的值,故map不用foreach,其子元素进行foreach迭代 -->
<sql id="BatchInsertUsersSQL">
<foreach collection="userlist" item="user" separator=",">
(#{user.id},#{user.realname},#{user.username},#{user.password},#{user.qq},#{user.email},#{user.wechat},#{user.mobile},#{user.address},#{user.age},#{user.sex},#{user.derive},#{user.hobby},#{status})
</foreach>
</sql>
<!--根据id集合获取相应的用户集合-->
<select id="BatchFind" resultMap="YzUserMaps">
select ys.id stid, status, PowerLevel,
u.id uid, realname, username, password, qq, email, wechat, mobile, address, age, sex, derive, hobby, status_id, u_img,
su.id spid, surplus
from yz_status ys inner join (yz_users u inner join yz_surplus su on u.id=su.id) on u.status_id = ys.id
where u.id in
<foreach collection="list" open="(" separator="," close=")" item="Uid" index="i">
#{Uid}
</foreach>
</select>
</mapper>
Service层接口,用于解耦,USerService:
package ssm.Service;
import org.apache.ibatis.annotations.Param;
import ssm.Pojo.YzUsers;
import ssm.Tools.Page;
import java.util.List;
import java.util.Map;
/**
* User服务层接口
*/
public interface UserService {
//用户登陆
public YzUsers UserLogin(@Param("account") String account, @Param("password") String password);
//用户注册
public int UserRegister(@Param("user")YzUsers user);
//判断user_id是否存在
public int isExistUser(@Param("id")String UUID);
//用户注册使用,登陆的账号username必须唯一:检索是否存在
public int isExistUsername(@Param("username")String username);
//用户修改个人信息
public int updateUser(@Param("user")YzUsers user);
//删除用户
public int deleteUser(@Param("id")String user_id);
//查询所有用户,分页
public Page<YzUsers> queryAllUsers(Integer pageNum, Integer pageSize);
public int queryTotalUser();
//批量插入用户
public int BatchInsertUsers(List<Map<String,String>> list,Integer status);
//批量查询用户List<user_id>
List<YzUsers> BatchFind(List<String> user_ids);
}
与低层交互 ServiceImpl:
package ssm.Service.Impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ssm.Dao.SurplusDao;
import ssm.Dao.UserDao;
import ssm.Pojo.YzUsers;
import ssm.Service.UserService;
import ssm.Tools.Page;
import java.util.*;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao ud;
@Autowired
private SurplusDao spd;
@Override
public YzUsers UserLogin(String account, String password) {
return this.ud.UserLogin(account,password);
}
@Override
public int UserRegister(YzUsers user) {
this.ud.UserRegister(user);
return this.spd.InitSurplus(user.getId(),"1.00");
}
@Override
public int isExistUser(String UUID) {
return this.ud.isExistUser(UUID);
}
@Override
public int isExistUsername(String username) {
return this.ud.isExistUsername(username);
}
@Override
public int updateUser(YzUsers user) {
return this.ud.updateUser(user);
}
@Override
public int deleteUser(String user_id) {
return this.ud.deleteUser(user_id);
}
@Override
public Page<YzUsers> queryAllUsers(Integer pageNum, Integer pageSize) {
Page<YzUsers> p=null;
int totalcount=queryTotalUser();
if(totalcount>0){
p=new Page<YzUsers>(pageNum,pageSize,totalcount);
List<YzUsers> list=this.ud.queryAllUsers(p.getIndex(),p.getPageSize());
p.setList(list);
return p;
}
return null;
}
@Override
public int queryTotalUser() {
return this.ud.queryTotalUser();
}
@Override
public int BatchInsertUsers(List<Map<String,String>> list,Integer status) {
Map<String,Object> mvp=new LinkedHashMap<>();
//设置该批成员的身份类型
mvp.put("status",status);
//将List<Map>转化为List<YzUsers>
List<YzUsers> userlist=new ArrayList<>();
//存储每个用户的id,当user存在时为其添加账户关联
List<String> ids=new ArrayList<>();
YzUsers u=null;
for(Map<String,String> ul:list){
u=new YzUsers();
//填充用户id
String create_uid="";
while(true){
String uuid= UUID.randomUUID().toString().replaceAll("-", "");
int count=isExistUser( uuid );
if(count==0){
create_uid=uuid;break;
}
}
u.setId(create_uid);
ids.add(create_uid);
//填充其余属性
Iterator<Map.Entry<String,String>> it=ul.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String,String> map=it.next();
if(map.getKey().equals("realname")) u.setRealname(map.getValue());
if(map.getKey().equals("username")) u.setUsername(map.getValue());
if(map.getKey().equals("password")) u.setPassword(map.getValue());
if(map.getKey().equals("qq")) u.setQq(map.getValue());
if(map.getKey().equals("email")) u.setEmail(map.getValue());
if(map.getKey().equals("wechat")) u.setWechat(map.getValue());
if(map.getKey().equals("mobile")) u.setMobile(map.getValue());
if(map.getKey().equals("address")) u.setAddress(map.getValue());
if(map.getKey().equals("age")){
String ageSTR=map.getValue();
if(ageSTR!=null||!ageSTR.equals("")) u.setAge(Integer.parseInt(ageSTR));
}
if(map.getKey().equals("sex")) u.setSex(map.getValue());
if(map.getKey().equals("derive")) u.setDerive(map.getValue());
if(map.getKey().equals("hobby")) u.setHobby(map.getValue());
//System.out.println(map.getKey()+"******"+map.getValue());
}
userlist.add(u);
}
mvp.put("userlist",userlist);
//批量插入,返回影响行数
int AffectLine=this.ud.BatchInsertUsers(mvp);
//为每个用户初始化账户
for(String id:ids)
this.spd.InitSurplus(id,"1.00");
return AffectLine;
}
@Override
public List<YzUsers> BatchFind(List<String> user_ids) {
return this.ud.BatchFind(user_ids);
}
}
UserController: 业务逻辑层or服务器接口
package ssm.Controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import ssm.Pojo.YzStatus;
import ssm.Pojo.YzUsers;
import ssm.Service.UserService;
import ssm.Tools.JSONFilter;
import ssm.Tools.Page;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.*;
@Controller
@SessionAttributes(value={"user"})
public class UserController {
@Autowired
private UserService us;
//用户登录
@RequestMapping(value="user/login",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject select(@RequestParam("username") String username,@RequestParam("password") String password,Model model) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="登陆失败";
YzUsers u=us.UserLogin(username,password);
if(u!=null){
statusCode=1;
msg="登陆成功";
model.addAttribute("user", u);
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
//用户注册
@RequestMapping(value="user/register",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject add(HttpServletRequest request) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="注册失败";
//取值
String uname=request.getParameter("username");
String password=request.getParameter("password");
String name=request.getParameter("name");
String mobile=request.getParameter("mobile");
//年龄若空值则不进行转化,否则Integer转化空值会报空指针异常
String ageSTR=request.getParameter("age")==null?null:request.getParameter("age");
int age=0;
if(ageSTR!=null) age=Integer.parseInt(request.getParameter("age"));
String address=request.getParameter("address");
String qq=request.getParameter("qq");
String wechat=request.getParameter("wechat");
String email=request.getParameter("email");
String sex=request.getParameter("sex");
//用户数组与年龄一样需要判空否则如下的for循环会报空指针错误
String[] aihao=request.getParameterValues("aihao")==null?null:request.getParameterValues("aihao");
String Aihao ="";
if(aihao!=null){
for(String s:aihao){
Aihao+=s+",";
}
Aihao=Aihao.substring(0,Aihao.length()-1);
}
String jiguan=request.getParameter("jiguan");
//实体对象转存数据
YzUsers u=new YzUsers();
// 用户id程序生成
String create_uid="";
while(true){
String uuid=UUID.randomUUID().toString().replaceAll("-", "");
int count=us.isExistUser( uuid );
if(count==0){
create_uid=uuid;break;
}
}
if(!create_uid.equals("")){
u.setId(create_uid);
u.setUsername(uname);
u.setRealname(name);
u.setPassword(password);
if(mobile!=null) u.setMobile(mobile);
if(ageSTR!=null) u.setAge(age);;
if(address!=null) u.setAddress(address);
if(qq!=null) u.setQq(qq);
if(wechat!=null) u.setWechat(wechat);
if(email!=null) u.setEmail(email);
if(sex!=null) u.setSex(sex);
if(aihao!=null) u.setHobby(Aihao);
if(jiguan!=null) u.setDerive(jiguan);
//初始化用户身份
YzStatus ys=new YzStatus();
ys.setId(12);
u.setYzStatus(ys);
int AffectLine=us.UserRegister(u);
if(AffectLine>0){
statusCode=1;
msg="注册成功";
}
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
//检验用户名是否存在 redis or mysql
@RequestMapping(value="user/uniqueUsername",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject isExistUsername(@RequestParam("username")String username) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="用户名已存在";
int result=us.isExistUsername(username);
if(result==0){
statusCode=1;
msg="此用户名可用";
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
//修改用户
@RequestMapping(value="user/update",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject updateUser(HttpServletRequest request) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="信息修改失败";
//取值
String user_id=request.getParameter("user_id");
String uname=request.getParameter("username");
String password=request.getParameter("password");
String name=request.getParameter("name");
String mobile=request.getParameter("mobile");
//年龄若空值则不进行转化,否则Integer转化空值会报空指针异常
String ageSTR=request.getParameter("age")==null?null:request.getParameter("age");
int age=0;
if(ageSTR!=null) age=Integer.parseInt(request.getParameter("age"));
String address=request.getParameter("address");
String qq=request.getParameter("qq");
String wechat=request.getParameter("wechat");
String email=request.getParameter("email");
String sex=request.getParameter("sex");
String jiguan=request.getParameter("jiguan");
//用户数组与年龄一样需要判空否则如下的for循环会报空指针错误
String[] aihao=request.getParameterValues("aihao")==null?null:request.getParameterValues("aihao");
String Aihao ="";
if(aihao!=null){
for(String s:aihao){
Aihao+=s+",";
}
Aihao=Aihao.substring(0,Aihao.length()-1);
}
String u_imgPath=request.getParameter("u_img");
//实体对象填充数据
YzUsers u=new YzUsers();
u.setId(user_id);
if (uname != null) u.setUsername(uname);
if (name != null) u.setRealname(name);
if (password != null) u.setPassword(password);
if (mobile != null) u.setMobile(mobile);
if(ageSTR!=null) u.setAge(age);
if (address != null) u.setAddress(address);
if (qq != null) u.setQq(qq);
if (wechat != null) u.setWechat(wechat);
if (email != null) u.setEmail(email);
if (sex != null) u.setSex(sex);
if (aihao!=null) u.setHobby(Aihao);
if (jiguan != null) u.setDerive(jiguan);
if (u_imgPath != null) u.setU_img(u_imgPath);
int result=us.updateUser(u);
if(result>0){
statusCode=1;
msg="信息修改成功";
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
//删除用户
@RequestMapping(value="user/delete",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject deleteUser(@RequestParam("id")String user_id) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="用户注销失败";
int result=us.deleteUser(user_id);
if(result>0){
statusCode=1;
msg="用户注销成功";
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
//查询用户(分页)
@RequestMapping(value="user/page-ulist",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public String queryAllUsers(@RequestParam("pageNum")Integer pageNum,@RequestParam("pageSize")Integer pageSize) throws IOException, ServletException {
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="未获取到任何信息";
Page<YzUsers> p=us.queryAllUsers(pageNum,pageSize);
if(p!=null){
json.put("page",p);
statusCode=1;
msg="获得用户信息列表";
}
json.put("statusCode",statusCode);
json.put("msg",msg);
//过滤掉子元素中的数组
JSONFilter[] jfs={
new JSONFilter(YzUsers.class,"yzMerch","yzMerchUserOrders"),
new JSONFilter(YzStatus.class,"yzUserses")
};
return JSONObject.toJSONString(json,jfs).replace("page","UserPage");
}
//批量插入用户 //get该技能之后可练习写购物车下单
@RequestMapping(value="user/batch-add",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject InsertUserList(@RequestBody Map<String,Object> map,HttpServletRequest request){
JSONObject json=new JSONObject();
int statusCode=-1;
String msg="批量添加失败";
String BatchUser_status=request.getParameter("status")==null?null:request.getParameter("status");
Integer status=12;//如果没有特定设置身份,默认12(大众会员)
if(BatchUser_status!=null) status=Integer.parseInt(BatchUser_status);
List<Map<String,String>> userlist=null;
String checkcode="";
try{
checkcode= (String) map.get("checkcode");
if(checkcode.equals("ab9e8")){
userlist= (List<Map<String,String>>) map.get("userlist");
int AffectLine=us.BatchInsertUsers(userlist,status);
if(AffectLine>0){
statusCode=1;
msg="批量添加成功";
}
}else{
statusCode=-3;
msg="你没有授权码调用该接口";
}
}catch(Exception e) {
statusCode=-2;
msg="请求参数格式不正确";
}
json.put("msg",msg);
json.put("statusCode",statusCode);
return json;
}
//批量查询用户List<user_id>
@RequestMapping(value="user/batch-find",method= RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public JSONObject BatchFind(@RequestParam(value="uid",required=false)String ... Uids){
JSONObject json=new JSONObject();
String msg="查询失败";
int statusCode=-1;
List<String> list=null;
if(Uids!=null&&Uids.length>0){
list=new ArrayList<>();
for(String id:Uids)
list.add(id);
List<YzUsers> ulist=us.BatchFind(list);
if(ulist.size()>0){
statusCode=1;
msg="查询成功";
JSONArray arrs=new JSONArray();
for (YzUsers uu:ulist)
arrs.add(uu);
json.put("userList",arrs);
}
}
json.put("statusCode",statusCode);
json.put("msg",msg);
return json;
}
}
好了,我们把tomcat启动起来
postman请准备好,其导出的文件已经放在源码的src>main>resource>WebLogin.postman_collection.json,导入它
该工程数据库配置文件也在src>main>resource>yzsearch.sql中,自行百度教程“sql文件使用”
接下来看看数据库中的数据
成功获取到服务器返回的信息
-----------------------------------------------end-----------------------------------------------------