当前位置: 首页 > news >正文

怎么模仿网站做ppt网站建设优化培训

怎么模仿网站做ppt,网站建设优化培训,设计报告书怎么写,wordpress扁平化文章目录 1.MybatisPlus实现基本的CRUD快速开始常见注解常见配置 2.使用条件构建造器构建查询和更新语句条件构造器自定义SQLService接口 官网 MybatisPlus无侵入和方便快捷. MybatisPlus不仅仅可以简化单表操作#xff0c;而且还对Mybatis的功能有很多的增强。可以让我们的开… 文章目录 1.MybatisPlus实现基本的CRUD快速开始常见注解常见配置 2.使用条件构建造器构建查询和更新语句条件构造器自定义SQLService接口 官网 MybatisPlus无侵入和方便快捷. MybatisPlus不仅仅可以简化单表操作而且还对Mybatis的功能有很多的增强。可以让我们的开发更加的简单高效。 通过今天的学习我们要达成下面的目标 能利用MybatisPlus实现基本的CRUD会使用条件构建造器构建查询和更新语句 1.MybatisPlus实现基本的CRUD 快速开始 初始化工程: 配置文件 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root logging:level:com.itheima: debugpattern:dateformat: HH:mm:ss mybatis:mapper-locations: classpath*:mapper/*.xml 实体类 Data public class User {/*** 用户id*/private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 注册手机号*/private String phone;/*** 详细信息*/private String info;/*** 使用状态1正常 2冻结*/private Integer status;/*** 账户余额*/private Integer balance;/*** 创建时间*/private LocalDateTime createTime;/*** 更新时间*/private LocalDateTime updateTime; } dao层/mapper层 public interface UserMapper{void saveUser(User user);void deleteUser(Long id);void updateUser(User user);User queryUserById(Param(id) Long id);ListUser queryUserByIds(Param(ids) ListLong ids); } mapper.xml ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.itheima.mp.mapper.UserMapperinsert idsaveUser parameterTypecom.itheima.mp.domain.po.UserINSERT INTO user (id, username, password, phone, info, balance)VALUES(#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});/insertupdate idupdateUser parameterTypecom.itheima.mp.domain.po.UserUPDATE usersetif testusername ! nullusername#{username}/ifif testpassword ! nullpassword#{password}/ifif testphone ! nullphone#{phone}/ifif testinfo ! nullinfo#{info}/ifif teststatus ! nullstatus#{status}/ifif testbalance ! nullbalance#{balance}/if/setWHERE id#{id};/updatedelete iddeleteUser parameterTypecom.itheima.mp.domain.po.UserDELETE FROM user WHERE id #{id}/deleteselect idqueryUserById resultTypecom.itheima.mp.domain.po.UserSELECT *FROM userWHERE id #{id}/selectselect idqueryUserByIds resultTypecom.itheima.mp.domain.po.UserSELECT *FROM userif testids ! nullWHERE id INforeach collectionids open( close) itemid separator,#{id}/foreach/ifLIMIT 10/select/mapper现在我们来改造!用mp快速体验一下: dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependencyimport com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.mp.domain.po.User; import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper extends BaseMapperUser { }把那些方法全部都删除了,然后把mapper.xml文件也一并删除.我们继承的这个爸爸里面这些方法它都有,所以我们直接去测试类测试即可. import com.itheima.mp.domain.po.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDateTime; import java.util.List;SpringBootTest class UserMapperTest {Autowiredprivate UserMapper userMapper;Testvoid testInsert() {User user new User();user.setId(5L);user.setUsername(Lucy);user.setPassword(123);user.setPhone(18688990011);user.setBalance(200);user.setInfo({\age\: 24, \intro\: \英文老师\, \gender\: \female\});user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.insert(user);}Testvoid testSelectById() {User user userMapper.selectById(5L);System.out.println(user user);}Testvoid testQueryByIds() {ListUser users userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));users.forEach(System.out::println);}Testvoid testUpdateById() {User user new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);}Testvoid testDeleteUser() {userMapper.deleteById(5L);} }全部都能测试成功,而且updateById语句如果你没有修改其他的字段那么其他字段不会修改.这样实现单表增删改查全部搞定. 常见注解 MybatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息. Data TableName(user) public class User {/*** 用户id*/TableId(type IdType.AUTO)//默认使用雪花算法生成idprivate Long id;/*** 用户名*/ // TableField(username)private String username;/*** 密码*/ // TableField(exist false)private String password;/*** 注册手机号*/private String phone;/*** 详细信息*/private String info;/*** 使用状态1正常 2冻结*/private Integer status;/*** 账户余额*/private Integer balance;/*** 创建时间*/private LocalDateTime createTime;/*** 更新时间*/private LocalDateTime updateTime; }常见配置 但是其实大部分都是默认配置具体可以看官网那些是默认配置 mybatis-plus:type-aliases-package: com.itheima.mp.domain.poglobal-config:db-config:id-type: auto2.使用条件构建造器构建查询和更新语句 核心功能: 条件构造器 Testvoid testQueryWrapper(){WrapperUser wrapper new QueryWrapperUser().select(id, username, info,balance).like(username, o).ge(balance, 1000);ListUser users userMapper.selectList(wrapper);users.forEach(System.out::println);}debug信息: 14:40:41 DEBUG 26264 — [ main] c.i.mp.mapper.UserMapper.selectList : Preparing: SELECT id,username,info,balance FROM user WHERE (username LIKE ? AND balance ?) 14:40:41 DEBUG 26264 — [ main] c.i.mp.mapper.UserMapper.selectList : Parameters: %o%(String), 1000(Integer) 14:40:41 DEBUG 26264 — [ main] c.i.mp.mapper.UserMapper.selectList : Total: 1 Testvoid testUpdateWrapper(){//1.要更新的数据User user new User();user.setBalance(2000);//2.更新的条件QueryWrapperUser wrapper new QueryWrapperUser().eq(username, jack);//3.执行更新userMapper.update(user,wrapper);}debug日志信息: 14:45:32 DEBUG 15964 — [ main] com.itheima.mp.mapper.UserMapper.update : Preparing: UPDATE user SET balance? WHERE (username ?) 14:45:32 DEBUG 15964 — [ main] com.itheima.mp.mapper.UserMapper.update : Parameters: 2000(Integer), jack(String) 14:45:32 DEBUG 15964 — [ main] com.itheima.mp.mapper.UserMapper.update : Updates: 1 Testvoid testUpdateWrapper(){UpdateWrapperUser wrapper new UpdateWrapperUser().setSql(balance balance 200).in(id, List.of(1L, 2L, 3L, 4L));userMapper.update(null,wrapper);}但是这种写法是硬编码. 推荐Lambda Testvoid testLambdaQueryWrapper(){LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser().select(User::getId, User::getUsername,User::getInfo, User::getBalance).like(User::getUsername, o).ge(User::getBalance, 1000);ListUser users userMapper.selectList(wrapper);users.forEach(System.out::println);}自定义SQL 我们可以利用MybatisPlus的wrapper来构建where条件,然后自己定义SQL语句中剩下部分. 这样确实方便但是这是在业务层中,这在很多企业中是不允许的. Testvoid testCustomSql(){ListLongids List.of(1L, 2L, 3L, 4L);int amount 200;QueryWrapperUser wrapper new QueryWrapperUser().in(id, ids);userMapper.updateBalanceByIds(wrapper, amount);}public interface UserMapper extends BaseMapperUser {Update(UPDATE user set balance balance #{amount} ${ew.customSqlSegment})void updateBalanceByIds(Param(Constants.WRAPPER) QueryWrapperUser wrapper, Param(amount) int amount); }Service接口 SpringBootTest class IUserServiceTest {Autowiredprivate IUserService userService;Testvoid testSave(){User user new User(); // user.setId(5L);user.setUsername(yyy);user.setPassword(123);user.setPhone(18688990011);user.setBalance(200);user.setInfo({\age\: 24, \intro\: \英文老师\, \gender\: \female\});user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userService.save(user);}Testvoid testQuery(){ListUser users userService.listByIds(List.of(1L, 2L, 3L));users.forEach(System.out::println);}}我们发现Iservice 和 baseMapper其实有很多方法都是重复的,从功能上是一致的,那我们应该如何选择?这里给出一个案例来进行讲解: !--swagger-- dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-openapi2-spring-boot-starter/artifactIdversion4.1.0/version /dependency !--web-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependency然后配置swagger信息 knife4j:enable: trueopenapi:title: 用户管理接口文档description: 用户管理接口文档email: zhanghuyiitcast.cnconcat: 虎哥url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- com.itheima.mp.controllerData ApiModel(description 用户表单实体) public class UserFormDTO {ApiModelProperty(id)private Long id;ApiModelProperty(用户名)private String username;ApiModelProperty(密码)private String password;ApiModelProperty(注册手机号)private String phone;ApiModelProperty(详细信息JSON风格)private String info;ApiModelProperty(账户余额)private Integer balance; } Data ApiModel(description 用户VO实体) public class UserVO {ApiModelProperty(用户id)private Long id;ApiModelProperty(用户名)private String username;ApiModelProperty(详细信息)private String info;ApiModelProperty(使用状态1正常 2冻结)private Integer status;ApiModelProperty(账户余额)private Integer balance; }Api(tags 用户管理接口) RestController RequestMapping(/user) RequiredArgsConstructor public class UserController {private final IUserService userService;// 注入userService 有final才注入// public UserController(IUserService userService) { // this.userService userService; // }ApiOperation(新增用户接口)PostMappingpublic void saveUser(RequestBody UserFormDTO userDTO){//1.DTO拷贝1到POUser user BeanUtil.copyProperties(userDTO, User.class);//2.新增userService.save(user);}ApiOperation(删除用户接口)DeleteMapping(/{id})public void DeleteUser(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id){userService.removeById(id);}ApiOperation(根据id查询用户接口)GetMapping(/{id})public UserVO queryUser(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id){User user userService.getById(id);UserVO userVO BeanUtil.copyProperties(user, UserVO.class);return userVO;}ApiOperation(根据id批量查询用户接口)PostMappingpublic ListUserVO queryUser(RequestParam(ids) ListLong ids){ListUser users userService.listByIds(ids);return BeanUtil.copyToList(users, UserVO.class);}} 以后在大多数场景下直接用IService就可以了因为这几个没有业务逻辑。 第五个接口是有业务的接口要判断状态判断余额数量等等。。 在controller中 ApiOperation(扣减用户余额接口)PutMapping(/{id}/deduction/{money})public void deduction(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id,ApiParam(name money, value 扣减金额, required true) PathVariable(money) Integer money) {userService.deduction(id, money);}service层 public interface IUserService extends IServiceUser {void deduction(Long id, Integer money); } serviceImpl Service public class UserServiceImlp extends ServiceImplUserMapper, User implements IUserService {Overridepublic void deduction(Long id, Integer money) {//1. 根据id查询用户User user this.getById(id);//2.检验用户状态if(usernull || user.getStatus()!1){throw new RuntimeException(用户状态异常);}//3.检验余额是否充足if(user.getBalance()money){throw new RuntimeException(余额不足);}//4.扣除余额baseMapper.deductBalance(id,money);} }mapper: public interface UserMapper extends BaseMapperUser {Update(UPDATE user set balance balance #{amount} ${ew.customSqlSegment})void updateBalanceByIds(Param(Constants.WRAPPER) QueryWrapperUser wrapper, Param(amount) int amount);Update(UPDATE user set balance balance - #{money} WHERE id #{id})void deductBalance(Param(id) Long id,Param(money) Integer money); } import cn.hutool.core.bean.BeanUtil; import com.itheima.mp.domain.dto.UserFormDTO; import com.itheima.mp.domain.po.User; import com.itheima.mp.domain.vo.UserVO; import com.itheima.mp.service.IUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*;import java.util.List;Api(tags 用户管理接口) RestController RequestMapping(/user) RequiredArgsConstructor public class UserController {private final IUserService userService;// 注入userService 有final才注入// public UserController(IUserService userService) { // this.userService userService; // }ApiOperation(新增用户接口)PostMappingpublic void saveUser(RequestBody UserFormDTO userDTO){//1.DTO拷贝1到POUser user BeanUtil.copyProperties(userDTO, User.class);//2.新增userService.save(user);}ApiOperation(删除用户接口)DeleteMapping(/{id})public void DeleteUser(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id){userService.removeById(id);}ApiOperation(根据id查询用户接口)GetMapping(/{id})public UserVO queryUser(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id){User user userService.getById(id);UserVO userVO BeanUtil.copyProperties(user, UserVO.class);return userVO;}ApiOperation(根据id批量查询用户接口)PostMappingpublic ListUserVO queryUser(RequestParam(ids) ListLong ids){ListUser users userService.listByIds(ids);return BeanUtil.copyToList(users, UserVO.class);}ApiOperation(扣减用户余额接口)PutMapping(/{id}/deduction/{money})public void deduction(ApiParam(name id, value 用户id, required true) PathVariable(id) Long id,ApiParam(name money, value 扣减金额, required true) PathVariable(money) Integer money) {userService.deduction(id, money);}} query: Data ApiModel(description 用户查询条件实体) public class UserQuery {ApiModelProperty(用户名关键字)private String name;ApiModelProperty(用户状态1-正常2-冻结)private Integer status;ApiModelProperty(余额最小值)private Integer minBalance;ApiModelProperty(余额最大值)private Integer maxBalance; }controller: ApiOperation(根据复杂条件查询用户接口)GetMapping(/list)public ListUserVO queryUserByCondition(UserQuery query){ListUserusers userService.queryUsers(query.getName(),query.getStatus(),query.getMinBalance(),query.getMaxBalance())return BeanUtil.copyToList(users, UserVO.class);}IUservice: public interface IUserService extends IServiceUser {void deduction(Long id, Integer money);ListUser queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance); }serviceimpl public ListUser queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {return lambdaQuery().like(name ! null, User::getUsername, name).eq(status ! null, User::getStatus, status).ge(minBalance ! null, User::getBalance, minBalance).le(name ! null, User::getBalance, maxBalance).list();}Service public class UserServiceImlp extends ServiceImplUserMapper, User implements IUserService {Transactionalpublic void deduction(Long id, Integer money) {//1. 根据id查询用户User user this.getById(id);//2.检验用户状态if(usernull || user.getStatus()!1){throw new RuntimeException(用户状态异常);}//3.检验余额是否充足if(user.getBalance()money){throw new RuntimeException(余额不足);}//4.扣除余额 // baseMapper.deductBalance(id,money);int remainBalance user.getBalance()-money;//乐观锁 compare and setlambdaUpdate().set(User::getBalance,remainBalance).set(remainBalance0,User::getStatus,2).eq(User::getId,id).eq(User::getBalance,user.getBalance()) //乐观锁 让并发安全性更好.update();//不要忘记这一条} }上面哪一种一条条执行每一次提交都是一次网络请求每次网络请求都要耗费一定的时间而下面每次插入1000条采取预编译方案相当于每1000次才发一次网络请求 如何把我们的sql语句变成这样用动态SQLforeach或者还是使用mp的批处理指令但是你会发现这个sql语句不对啊但其实这个不对只是缺少了一个参数rewriteBatchedStatementstrue参数这个配置是mysql的配置默认为false所以我们之前以为的批处理实际上都是一条条的插入所以我们要改这个配置 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/ShanghairewriteBatchedStatementstruedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root在url后面加上这个参数即可
http://www.hkea.cn/news/14408903/

相关文章:

  • mini主机做网站服务器湖北微网站建设多少钱
  • 如何创建一个企业网站学院网站建设用户需求分析报告
  • 江门做公司网站山东省建设监理协会网站
  • 郑州做网站的企业珠海注册公司哪家代理好
  • 做ppt的软件怎么下载网站a5源码网站
  • 网站上不去首页seo要怎么办网页设计实训报告1200
  • 旅游搭建网站营销型网站建设概述
  • 艺术作品欣赏网站注册网站排名公司
  • 网站设计公司收费标准sem优化服务公司
  • 网站开发调查问卷广东省建设执业资格注册中心网站
  • 外贸平台网站有哪些长沙网站设计公司排名
  • 做化工的外贸网站都有什么做网站的软件dw
  • thinksns网站开发交易网站建设具体方案
  • 临城网站视频直播sdk
  • 学做电影网站有人看片吗免费的
  • 建设网站的费用预算厦门国外网站建设公司
  • 网上做名片的网站找人做的网站怎么
  • 物流网站建设与管理汽车案例网站
  • 南宁霸屏网站开发网络舆情分析报告范文
  • 苏州中小型网站建设wordpress图文安装教程
  • 镇江网站托管wordpress菜单调用
  • 我有云服务器如何建站郑州做定制网站的公司
  • 河南企业网官方网站品牌建设的最高境界是培育客户的
  • 广东网站建设seo优化网站建设 佛山
  • wordpress建好站了打不开首页产品包装设计公司网站
  • 昭通建网站win10系统优化
  • 网站设计需求文档范例石家庄房产网上备案查询
  • 厦门做模板网站的公司江苏住房城乡建设部部官方网站
  • 旅游网站管理系统想在网上做开发网站接活儿
  • 空滤网站怎么做卖游戏辅助的网站怎么建设