目录

前言

一、环境搭建-spring

1.1 IDEA环境搭建

1.1.1 创建项目配置

1.1.2 选择Springboot版本

1.1.3 项目设置

1.1.4 导入pom.xml文件

1.1.4 导入src文件

1.1.5项目启动测试

二. 用户登录实现

2.1.1 user表说明

2.1.2 编辑User POJO

2.2.1 前后端项目说明

2.2.2 前后端调用说明

2.3.1封装SysResult对象

2.3.2 业务接口文档

2.3.3 MD5加密算法

2.3.4 编辑UserController

2.3.5 编辑UserService

2.3.6 编辑UserMapper

2.3.7 关于前后端报错说明

2.4 关于前端路由说明

2.5 左侧菜单列表展现

2.5.1 关于rights表说明

2.5.2 编辑Rights POJO

2.5.3 搭建层级代码结构

2.5.4 业务接口

2.5.5 编辑RightsController

2.5.6 编辑RightsService

2.5.7 编辑RightsMapper

2.5.8 页面效果展现

2.6.1 配置路由

三. 用户模块管理

3.1 用户列表展现

3.1.1 接口文档说明

3.1.2 分页语法结构

3.1.3 编辑UserController

3.1.4 编辑UserService

3.1.5 编辑UserMapper

3.1.6 页面效果展现

3.2 用户状态修改

3.2.1 接口文档

3.2.2 编辑UserController

3.2.3 编辑UserService

3.2.4 编辑UserMapper

3.3 用户删除操作

3.3.1 业务接口

3.3.2 编辑UserController

3.3.3 编辑UserService

3.3.4 编辑UserMapper

3.3.5 关于删除操作bug说明

3.4 用户新增操作

3.4.1 业务接口文档

3.4.2 编辑UserController

3.4.3 编辑UserService

3.4.4 编辑UserMapper

3.5 用户更新操作-回显

3.5.1 业务接口文档

3.5.2 编辑UserController

3.5.3 编辑UserService

3.5.4 编辑UserMapper

3.6 用户更新操作-更新

3.6.1 业务接口说明

3.6.2 编辑UserController

3.6.3 编辑UserService

3.6.4 编辑UserMapper

3.7 全局异常处理机制

3.7.1 现象描述

2.7.2 全局异常处理机制

四. Mybatis-Plus

4.1 MP介绍

4.2 MP入门案例

4.2.1 导入jar包

4.2.2 编辑POJO对象

4.2.3 继承公共BaseMapper

4.2.4 修改YML配置文件

4.2.5 MP入门案例

注意事项

1. 主启动方法不能执行

2. pom.xml文件jar包报错(比较常见的问题)

3. 编辑properties文件

总结


前言

记录一下项目创建的全流程,以及我在创建的过程中遇到的千奇百怪的问题

提示:以下是本篇文章正文内容,下面案例可供参考

一、环境搭建-spring

1.1 IDEA环境搭建

具体搭建过程,略

 1.1.1 创建项目配置

URL: https://start.aliyun.com

 1.1.2 选择Springboot版本

说明: 其中选择web包 表示添加spring/springmvc等jar包文件

 1.1.3 项目设置

一些基本设置

1.1.4 导入pom.xml文件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--mybatis依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!--spring整合mybatis-plus --><!-- <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency>--><!--jdbc依赖包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--添加lombok的包--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

1.1.4 导入src文件

说明: 下载码云中的后端项目,导入src文件即可

1.1.5项目启动测试

二. 用户登录实现

2.1.1 user表说明

2.1.2 编辑User POJO

1. 编辑父级POJO

2. 编辑User 的POJO

 2.2.1 前后端项目说明

  1. localhost:8000 是VUE UI客户端工具的路径
  2. localhost:8080 是前端项目的路径
  3. localhost:8091 是后端项目的路径

2.2.2 前后端调用说明

 2.3.1封装SysResult对象

package com.jt.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.io.Serializable;@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor //vo 与web前端与后端交互的对象
public class SysResult implements Serializable {private Integer status; //200成功  201失败private String  msg;    //提示信息private Object  data;   //服务器返回值数据public static SysResult fail(){return new SysResult(201,"业务调用失败!!",null);}public static SysResult success(){return new SysResult(200,"业务调用成功!!",null);}public static SysResult success(Object data){return new SysResult(200,"业务调用成功!!",data);}public static SysResult success(String msg,Object data){return new SysResult(200,msg,data);}
}

2.3.2 业务接口文档

  • 请求路径: /user/login
  • 请求方式: POST
  • 请求参数
参数名称 参数说明 备注
username 用户名 不能为空
password 密码 不能为空
  • 响应数据 SysResult对象
参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 返回密钥token信息

返回值格式如下:

{"status":200,"msg":"服务器调用成功!","data":"1e893a97634847b3a8b499b173bea620"}

2.3.3 MD5加密算法

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.

核心做法: 限定次数!!!

2.3.4 编辑UserController

package com.jt.controller;import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.vo.PageResult;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.sql.SQLException;
import java.util.List;@RestController
@RequestMapping("/user")
@CrossOrigin    //前后端进行跨域操作
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/findAll")public List<User> findAll(){return userService.findAll();}/*** 业务需求: 实现用户登录操作* URL地址: /user/login* 请求类型: post* 参数:    username/password  json串* 返回值:  SysResult对象(token密钥)*/@PostMapping("/login")public SysResult login(@RequestBody User user){String token = userService.login(user);//判断token是否为nullif(token == null){return SysResult.fail(); //表示用户登录失败!!}return SysResult.success(token);//表示用户登录成功!!}
}

2.3.5 编辑UserService

1. 编辑接口

public interface UserService {List<User> findAll();String login(User user);
}

2. 编辑实现类

@Service
public class UserServiceImpl implements UserService{@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll() {return userMapper.findAll();}/*** 业务思维能力: 用户登录操作* 登录业务逻辑:*      1.将用户的密码进行加密处理*      2.根据用户名和密码进行数据库查询*        查到了: 用户名和密码正确  返回token密钥*        没查到: 用户名和密码错误  返回null** @param user* @return*/@Overridepublic String login(User user) {//1.将密码加密处理String password = user.getPassword();String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());user.setPassword(md5Pass);//2.根据用户名和密码查询数据库User userDB = userMapper.findUserByUP(user);if(userDB == null){//用户名或者密码错误return null;}//密钥:该密钥是用户登录的唯一的标识符,特点:独一无二String token = UUID.randomUUID().toString().replace("-", "");return token;}
}

2.3.6 编辑UserMapper

1. 编辑Mapper接口

public interface UserMapper {List<User> findAll();User findUserByUP(User user);
}

2. 编辑xml映射文件

 <select id="findUserByUP" resultType="User">select * from userwhere username=#{username}and   password=#{password}</select>

2.3.7 关于前后端报错说明

1. 检查请求路径

2. 检查请求参数

3. 检查响应结果

2.4 关于前端路由说明 

2.5 左侧菜单列表展现

2.5.1 关于rights表说明

说明: 通过parent_id 控制父子关系.

 2.5.2 编辑Rights POJO

@Data
@Accessors(chain = true)
public class Rights extends BasePojo{private Integer id;private String name;private Integer parentId;private String path;private Integer level;private List<Rights> children; //一对多
}

2.5.3 搭建层级代码结构

 2.5.4 业务接口

  • 请求路径 /rights/getRightsList
  • 请求类型 GET
  • 请求参数 无
  • 响应数据 SysResult对象
参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 返回权限List集合
  • 响应数据如图所示 只查询1-2级数据

 2.5.5 编辑RightsController

package com.jt.controller;import com.jt.pojo.Rights;
import com.jt.service.RightsService;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@CrossOrigin
@RequestMapping("/rights")
public class RightsController {@Autowiredprivate RightsService rightsService;/*** url地址: /rights/getRightsList* 参数:  没有参数* 请求类型: get* 返回值: SysResult(List<Rights>) 1-2级*/@GetMapping("/getRightsList")public SysResult getRightsList(){List<Rights> list = rightsService.getRightsList();System.out.println(list);return SysResult.success(list);}}

2.5.6 编辑RightsService

  1. 编辑接口
public interface RightsService {List<Rights> getRightsList();
}

2.编辑实现类

package com.jt.service;import com.jt.mapper.RightsMapper;
import com.jt.pojo.Rights;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class RightsServiceImpl implements RightsService{@Autowiredprivate RightsMapper rightsMapper;/*** 难点: 查询1-2级的菜单,一级对象中包含二级对象* 操作:*      1.简单程度  在业务层查询多次手动封装  效率低*      2.正常方式  利用Sql进行关联查询      效率高* @return*/@Overridepublic List<Rights> getRightsList() {return rightsMapper.getRightsList();}
}

2.5.7 编辑RightsMapper

  1. 编辑Mapper接口
public interface RightsMapper {List<Rights> getRightsList();
}

2. 编辑Xml映射文件

<mapper namespace="com.jt.mapper.RightsMapper"><!--查询1-2级的关联数据--><select id="getRightsList" resultMap="rightsRM">SELECT p.*,c.id c_id,c.name c_name,c.parent_id c_parent_id,c.path c_path,c.level c_level,c.created c_created,c.updated c_updatedFROM rights p,rights cWHERE p.level=1 AND c.parent_id = p.id</select><resultMap id="rightsRM" type="Rights" autoMapping="true"><!--主键--><id column="id" property="id"/><!--关联封装columnPrefix="指定字段映射的前缀"--><collection property="children" ofType="Rights" autoMapping="true" columnPrefix="c_"><!--主键必须标识--><id column="id" property="id"/><!-- <result column="c_name" property="name"/><result column="c_parent_id" property="parentId"/><result column="c_path" property="path"/><result column="c_level" property="level"/><result column="c_created" property="created"/><result column="c_updated" property="updated"/>--></collection></resultMap></mapper>

2.5.8 页面效果展现

2.6.1 配置路由

1. 定义路由占位符

2. 定义路由规则
通过children关键字,实现父子组件的定义

const routes = [{path: '/', redirect: '/login'},{path: '/login', component: Login},{path: '/elementUI', component: ElementUI},{path: '/home', component: Home, children:[{path: '/user', component: User},{path: '/item', component: Item},{path: '/itemCat', component: ItemCat}]},
]

三. 用户模块管理

3.1 用户列表展现

3.1.1 接口文档说明

  • 请求路径: /user/list
  • 请求类型: GET
  • 请求参数: 后台使用PageResult对象接收
  • 请求案例: http://localhost:8091/user/list?query=查询关键字&pageNum=1&pageSize=10
参数名称 参数说明 备注信息
query 用户查询的数据 可以为null
pageNum 分页查询的页数 必须赋值不能为null
pageSize 分页查询的条数 必须赋值不能为null
  • 响应参数: SysResult对象 需要携带分页对象 PageResult
参数名称 参数说明 备注信息
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 返回值PageResult对象
  • PageResult 对象介绍
参数名称 参数类型 参数说明 备注信息
query String 用户查询的数据 可以为null
pageNum Integer 查询页数 不能为null
pageSize Integer 查询条数 不能为null
total Long 查询总记录数 不能为null
rows Object 分页查询的结果 不能为null
  • 返回值效果
{"status":200,"msg":"服务器调用成功!","data":{"query":"","pageNum":1,"pageSize":2,"total":4,"rows":[{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-03-26T06:47:20.000+00:00","id":1,"username":"admin","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112222","email":"1235678@qq.com","status":true,"role":null},{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-03-13T08:50:30.000+00:00","id":2,"username":"admin123","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112223","email":"1235678@qq.com","status":false,"role":null}]}
}

3.1.2 分页语法结构

/*每页10条   查询第一页select * from user limit 起始位置,查询条数规律: 数组含头不含尾*/
SELECT * FROM USER LIMIT 0,10
/*第二页*/
SELECT * FROM USER LIMIT 10,10
/*第三页*/
SELECT * FROM USER LIMIT 20,10
/*第N页*/
SELECT * FROM USER LIMIT (n-1)*10,10

3.1.3 编辑UserController

 /*** 业务需求: 分页查询用户数据* URL: /user/list* 类型: GET类型* 参数: pageResult接收*      http://localhost:8091/user/list?query=查询关键字&pageNum=1&pageSize=10* 返回值: SysResult(PageResult对象)*/@GetMapping("/list")public SysResult findList(PageResult pageResult){//3pageResult = userService.findList(pageResult); //3+2 总数+分页结果return SysResult.success(pageResult);//5}

3.1.4 编辑UserService

1. 编辑UserService接口

 PageResult findList(PageResult pageResult);

2. 编辑UserServiceImpl

@Overridepublic PageResult findList(PageResult pageResult) {//1.获取记录总数long total = userMapper.findCount();//2.获取分页结果int size = pageResult.getPageSize(); //条数int start = (pageResult.getPageNum() - 1) * size; //起始位置String query = pageResult.getQuery();   //查询条件//查询分页结果List<User> list = userMapper.findUserLimit(query,start,size);//封装返回值数据pageResult.setTotal(total).setRows(list);return pageResult; //3+2的效果!!}

3.1.5 编辑UserMapper

1. 编辑Mapper接口

 List<User> findUserLimit(@Param("query") String query,@Param("start") int start,@Param("size") int size);

2. 编辑xml映射文件

  <select id="findUserLimit" resultType="User">select * from user<where><if test="query !=null and query !=''">username like "%"#{query}"%"</if></where>limit #{start},#{size}</select>

3.1.6 页面效果展现

3.2 用户状态修改

3.2.1 接口文档

  • 请求路径 /user/status/{id}/{status}
  • 请求类型 PUT
  • 请求参数: 用户ID/状态值数据
参数名称 参数类型 参数说明 备注信息
id Integer 用户ID号 不能为null
status boolean 参数状态信息 不能为null
  • 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}

3.2.2 编辑UserController

 /***  - 请求路径 /user/status/{id}/{status}*  - 请求类型    PUT*  - 请求参数:   用户ID/状态值数据*  - 返回值:  SysResult*/@PutMapping("/status/{id}/{status}")public SysResult updateStatus(User user){userService.updateStatus(user);return SysResult.success();}

3.2.3 编辑UserService

1. 编辑UserService

    void updateStatus(User user);

2. 编辑UserServiceImpl

 @Override@Transactional  //控制事务public void updateStatus(User user) {//获取当前时间user.setUpdated(new Date());userMapper.updateStatus(user);}

3.2.4 编辑UserMapper

 @Update("update user set status=#{status},updated=#{updated} where id=#{id}")void updateStatus(User user);

3.3 用户删除操作

3.3.1 业务接口

  • 请求路径: /user/{id}
  • 请求类型: delete
  • 请求参数:
参数名称 参数说明 备注
ID 用户ID号 不能为null
  • 返回值: SysResult对象
参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 null

3.3.2 编辑UserController

/*** 业务说明: 删除业务* 请求路径: /user/{id}* 请求类型: delete* 请求参数: id=xx* 返回值: SysResult对象*/@DeleteMapping("/{id}")public SysResult deleteUser(@PathVariable Integer id){userService.deleteUserById(id);return SysResult.success();}

3.3.3 编辑UserService

1. 编辑UserService接口

 void deleteUserById(Integer id);

2. 编辑UserServiceImpl

@Override@Transactional  //控制事务public void deleteUserById(Integer id) {userMapper.deleteUserById(id);}

3.3.4 编辑UserMapper

 @Delete("delete from user where id=#{id}")void deleteUserById(Integer id);

3.3.5 关于删除操作bug说明

bug: 漏洞 一般条件下对的,偶然现象可能导致错误.
说明: 添加return 关键字即可.

3.4 用户新增操作

3.4.1 业务接口文档

  • 请求路径 /user/addUser
  • 请求类型 POST
  • 请求参数: 整个form表单数据封装为js对象进行参数传递
参数名称 参数类型 参数说明 备注信息
username String 用户名 不能为null
password String 密码 不能为null
phone String 电话号码 不能为null
email String 密码 不能为null
  • 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}

3.4.2 编辑UserController

/*** 业务说明: 用户新增* 请求路径 /user/addUser* 请求类型 POST* 请求参数: 整个form表单数据封装为js对象进行参数传递* 返回值结果: SysResult对象*/@PostMapping("/addUser")public SysResult addUser(@RequestBody User user){userService.addUser(user);return SysResult.success(); //200}

3.4.3 编辑UserService

  1. 编辑UserService接口
 void addUser(User user);

2. 编辑UserServiceImpl实现类

@Override@Transactionalpublic void addUser(User user) {Date date = new Date(); //获取当前时间String md5Pass =DigestUtils.md5DigestAsHex(user.getPassword().getBytes());user.setPassword(md5Pass).setStatus(true).setCreated(date).setUpdated(date);userMapper.addUser(user);}

3.4.4 编辑UserMapper

1. 编辑UserMapper接口

 void addUser(User user);

2. 编辑UserMapper.xml映射文件

<!--完成用户入库操作--><insert id="addUser">insert into user values (null,#{username},#{password},#{phone},#{email},#{status},#{created},#{updated})</insert>

3.5 用户更新操作-回显

3.5.1 业务接口文档

  • 请求路径: /user/{id}
  • 请求类型: GET
  • 返回值: SysResult对象
参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 返回user对象
  • JSON格式如下:
{"status":200,"msg":"服务器调用成功!","data":{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-05-17T11:33:46.000+00:00","id":1,"username":"admin","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112222","email":"1235678@qq.com","status":true,"role":null}}

3.5.2 编辑UserController

 /*** 业务说明:*  请求路径: /user/{id}*  请求类型: GET*  返回值: SysResult(User对象)*/@GetMapping("/{id}")public SysResult findUserById(@PathVariable Integer id){User user = userService.findUserById(id);return SysResult.success(user);}

3.5.3 编辑UserService

1. 编辑UserService接口

    User findUserById(Integer id);

2. 编辑UserServiceImpl实现类

     @Overridepublic User findUserById(Integer id) {return userMapper.findUserById(id);}

3.5.4 编辑UserMapper

 @Select("select * from user where id=#{id}")User findUserById(Integer id);

3.6 用户更新操作-更新

3.6.1 业务接口说明

  • 请求路径: /user/updateUser
  • 请求类型: PUT
  • 请求参数: User对象结构
参数名称 参数说明 备注
ID 用户ID号 不能为null
phone 手机信息 不能为null
email 邮箱地址 不能为null
  • 返回值: SysResult对象

参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 null
  • JSON格式如下:
{"status":200,"msg":"服务器调用成功!","data":{}}

3.6.2 编辑UserController

 /*** 完成用户更新操作* 请求路径: /user/updateUser* 请求类型: PUT* 请求参数: User对象结构*/@PutMapping("/updateUser")public SysResult updateUser(@RequestBody User user){userService.updateUser(user);return SysResult.success();}

3.6.3 编辑UserService

1. 编辑UserService

void updateUser(User user);

2. 编辑UserServiceImpl

 //电话/邮箱/更新时间 where id=xx@Override@Transactionalpublic void updateUser(User user) {user.setUpdated(new Date());userMapper.updateUser(user);}

3.6.4 编辑UserMapper

 @Update("update user set phone=#{phone},email=#{email},updated=#{updated} " +"where id=#{id}")void updateUser(User user);

3.7 全局异常处理机制

3.7.1 现象描述

由于后端服务器只是处理了200的正确的请求,如果后端服务器报错了,理论上应该返回201提示信息. 这样前端接收到201提示之后 给用户反馈. 这样的用户体验更好.
问题: 几乎所有的业务都需要防止异常的发生. 所有的方法都必须有201的判断. 代码如图所示

案例:

@PutMapping("/updateUser")public SysResult updateUser(@RequestBody User user){try{userService.updateUser(user);return SysResult.success();}catch (Exception e){e.printStackTrace(); //打印异常return SysResult.fail();}}

解决方案: Spring-AOP 面向切面编程

2.7.2 全局异常处理机制

package com.jt.aop;import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;//Spring专门为解决异常问题,开发了针对Controller层的注解
//注解的核心就是 Spring-AOP
@RestControllerAdvice
public class SystemException {/*** 拦截什么异常: 运行时异常* 返回值: SysResult对象 --201* @ExceptionHandler: 切入点表达式*/@ExceptionHandler(RuntimeException.class)public SysResult fail(Exception e){e.printStackTrace();return SysResult.fail();}
}

四. Mybatis-Plus

4.1 MP介绍

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

4.2 MP入门案例

核心: 以对象的方式操作数据库

4.2.1 导入jar包

说明: MP的jar包与Mybatis的jar包冲突. 只能添加一个

         <!--spring整合mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency>

4.2.2 编辑POJO对象

说明: 通过注解实现对象与数据表的绑定

 4.2.3 继承公共BaseMapper

 4.2.4 修改YML配置文件

 4.2.5 MP入门案例

package com.jt;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.StringUtils;import java.util.List;@SpringBootTest
public class TestMybatis {@Autowiredprivate UserMapper userMapper;//核心: 以对象的方式操作数据库//原则: 使用对象中不为null的属性,进行操作  MP内部使用动态Sql//注意事项: MP只适用于单表操作!!!@Testpublic void saveUser(){User user = new User();user.setUsername("MP").setPassword("123456").setPhone("13333").setEmail("11@qq.com").setStatus(true);userMapper.insert(user);}/*** 1.根据ID查询数据库*/@Testpublic void test01(){int id = 1;User user = userMapper.selectById(id);System.out.println(user);}/*** 2.查询username="admin" status=true的用户*  参数: QueryWrapper 条件构造器  拼接where条件*  原则: 根据不为null的属性进行操作*  写法2:*       通过条件构造器手动封装*       关键字:  = eq, > gt, < lt, >= ge, <= le, != ne*/@Testpublic void test02(){//1.构建条件构造器User user = new User();user.setUsername("admin").setStatus(true);QueryWrapper queryWrapper = new QueryWrapper(user);List<User> list1 = userMapper.selectList(queryWrapper);//2.手动构建条件构造器 默认连接符使用 andQueryWrapper<User> queryWrapper2 = new QueryWrapper();queryWrapper2.eq("username","admin").eq("status", true);List<User> list2 = userMapper.selectList(queryWrapper2);System.out.println(list1);System.out.println(list2);}/*** 3.查询id>1的数据*/@Testpublic void test03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("id",1);List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}/*** 4.查询username含有"admin"的数据* 规则:  like      username like "%xxxx%"*       likeLeft  username like "%xxxx"*       likeRight username like "xxxx%"*/@Testpublic void test04(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("username", "admin");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}/*** 5.查询id=1,2,3,4的数据 并且按照ID倒叙排列*/@Testpublic void test05(){Integer[] ids = {1,2,3,4};QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in("id",ids).orderByDesc("id");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}/*** 6.动态Sql: 根据电话和邮箱查询数据*   语法: condition: true  动态拼接数据*                   false 不拼接数据*/@Testpublic void test06(){String phone = "";String email = "1235678@qq.com";QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq(StringUtils.hasLength(phone), "phone",phone).eq(StringUtils.hasLength(email), "email",email);List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}/*** 7.查询主键字段* Sql: select id from user* 使用场景: 一般用在关联查询时*/@Testpublic void test07(){List<Object> ids = userMapper.selectObjs(null);System.out.println(ids);}
}

注意事项

 1. 主启动方法不能执行

说明: 如图所示,主启动方法不能正常运行,原因IDEA不能识别该java工程,当做普通的文本文件。

解决方案: pom.xml 右键 add maven project

2. pom.xml文件jar包报错(比较常见的问题) 

注意事项: 使用maven下载jar包文件时,尽量不要使用手机特点(除非特殊情况)
前提条件: 必须正确配置maven环境/配置私服镜像
关于依赖项的说明:

3. 编辑properties文件

# 1.数据结构:  key=value
# 2.无需添加多余的引号
# 3.注意多余的空格
# 4.程序读取properties文件时,默认采用ISO-8859-1编码! 中文必定乱码
name=张三

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

项目全流程 (1/3)相关推荐

  1. pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程

    (PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...

  2. 项目开发流程_视频网课:房地产开发项目全流程全税种税收筹划

    致CFO:今天不税筹,明天就愁税 为了支持企业发展,国家出台了诸多税收优惠政策.但因不同行业税种多样,如房地产业涉税就有20余种,如何做到用好优惠政策,优化缴税结构?避免重复纳税,降低财务成本,还要合 ...

  3. 这份【互联网项目全流程表】,实在是泰裤辣!!!

    互联网行业是一个快速变化的行业,作为半个互联网人.太明白用户和环境每天都在不停地变化是什么感受了. ​从项目开始到项目结束,要经历立项.计划.执行.结项,项目一周一个,一周一个.(**的)为了省时间就 ...

  4. storm throw 口袋妖怪_初版storm项目全流程自动化测试代码实现

    由于项目需要,写了版针对业务的自动化测试代码,主要应用场景在于由于业务日趋复杂,一些公共代码的改动,担心会影响已有业务.还没进行重写,但知识点还是不少的与大家分享实践下.首先,介绍下整个流处理的业务流 ...

  5. 【Git】码云Gitee.com管理项目全流程

    Gitee.com 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管.目前已有超过 500 万的开发者选择 Gitee. 官网:https://gite ...

  6. python自动化测试项目全流程

    之前做的一个自动化项目,大概总结了一下. 1.先整理好一个完整流程的接口,这里需要导入requests模块,因为涉及到新建需要随机命名的,所以还增加了random模块 2.对接口进行封装(def):接 ...

  7. Linux-部署应用到生产环境Tomcat项目-全流程(图文教程)

    场景 部署效果 登录之后效果 前提条件 Linux-安装 Ubuntu Server 16.04 X64(图文教程详细版): https://blog.csdn.net/BADAO_LIUMANG_Q ...

  8. Linux项目部署单体项目全流程

    虚拟机安装与IP配置说明 软件下载 URL: https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation ...

  9. Python机器学习全流程项目实战精讲(2018版)

    Python机器学习全流程项目实战精讲(2018版) 网盘地址:https://pan.baidu.com/s/16SSVq74YC07M0dW1iDekPg 提取码: vu7r 备用地址(腾讯微云) ...

最新文章

  1. 机器学习处理流程、特征工程,模型设计实例
  2. centos7 mariadb mysql max_connections=214 无法修改的问题
  3. CentOS 8 成为绝版!到底发生了什么?
  4. Oracle分页查询语句
  5. C#学习笔记:预处理指令
  6. MVC PartialView视图使用心得
  7. SEO基础问题:14.给图片添加alt标签的知识点
  8. jdom编写xml自动缩进_Spring Beans 自动装配
  9. Atitit 计算机网络体系结构原理与实践attilax总结 目录 1.  计算机网络体系结构 1 1.1. Wmi 1 1.2. IPMI与BMC 1 1.3. Tcp/udp 2 1.4. 代理
  10. DupanTools第三方不限速下载工具
  11. ResourceBundle使用详解
  12. PID实现水平姿态角控制
  13. 作为一名女程序员是什么体验?
  14. flutter集成Apple第三方登录
  15. Codeforces Daily (Round 370-410)
  16. android hid 鼠标,使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘
  17. Volley,Glide,Swiperefreshlayout 简单使用
  18. Python实现摄像头实时人脸检测
  19. 【CICE-A7a】人身保险会计与财务(上)
  20. Python将string转换到float的实例方法

热门文章

  1. VsCode使用教程1(更换背景)
  2. termux之手机青龙
  3. reaver使用方法
  4. DNS攻击原理与防范!!(转载:月光博客)
  5. 用txt文本显示图片
  6. 3S优创空间 雨花科技园众创空间
  7. linux java aptget_linux环境apt方式安装和卸载Jdk
  8. 创建Windows Service
  9. 爬虫解析库之xpath、Beautifulsoup的对比使用
  10. idea安装与配置(2019版本)