网站注册费用需要多钱,百度高级搜索功能,怎么样制作一个公众号,设计有什么网站推荐3.扩展 代码生成 逻辑删除 枚举处理器 json处理器 配置加密 分页插件 3.1 代码生成 https://blog.csdn.net/weixin_41957626/article/details/132651552 下载下面的插件    红色的是刚刚生成的。  我觉得不如官方的那个好用#xff0c;唯一的好处就是勾选的选项能够看的懂得。…3.扩展 代码生成 逻辑删除 枚举处理器 json处理器 配置加密 分页插件 3.1 代码生成 https://blog.csdn.net/weixin_41957626/article/details/132651552 下载下面的插件    红色的是刚刚生成的。  我觉得不如官方的那个好用唯一的好处就是勾选的选项能够看的懂得。 
3.2逻辑删除 不是真的删除是进行uupdate的操作把对应的标志位设置为对应的标志就可以的 mp中可以采用全局的配置设置对应的逻辑删除的操作达到和原先逻辑删除一样的方式。 
下面是全局的配置。 global-config:db-config:logic-delete-field: flag #全局删除的实体的字段名logic-delete-value: 1 #逻辑删除值logic-not-delete-value: 0 #逻辑未删除的值说明所有的 表的都是基于下面的格式的。 
可以在指定的表的字段上进行设置逻辑删除的字段需要进行单独的设置的。 
在数据库中添加逻辑删除的字段。  测试对address的逻辑删除 Testvoid tes61(){boolean flag  addressService.removeById(59L);System.out.println(删除的结果flag);} 
删除的结果 
JDBC Connection [HikariProxyConnection118887511 wrapping com.mysql.cj.jdbc.ConnectionImpl38ee7a9d] will not be managed by SpringPreparing: UPDATE address SET deleted1 WHERE id? AND deleted0Parameters: 59(Long)Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession39c96e48]
删除的结果true 此时进行查询的时候查询不到 Testvoid tes62(){Address address  addressService.getById(59L);System.out.println(addressaddress);}查询的结果 
JDBC Connection [HikariProxyConnection571251299 wrapping com.mysql.cj.jdbc.ConnectionImpl55b5cd2b] will not be managed by SpringPreparing: SELECT id,user_id,province,city,town,mobile,street,contact,is_default,notes,deleted FROM address WHERE id? AND deleted0Parameters: 59(Long)Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSessionebe067d]
addressnull此时我们进行逻辑删除的内容找不到了 
数据库中的逻辑删除字段类型的设置 
可以采用位的方式也可以采用int的类型。 
采用这两种方式的显示的方式是不一样的 
采用int的类型  此时在idea中显示的就是0和1在代码的设计上需要注意一个问题false需要和0进行对应1需要和true进行对应。 
采用位的类型也是相似的道理但是直接显示的时候是不同的。   采用位的时候需要进行转义。 Testvoid tes63(){Address address  addressService.getById(60L);System.out.println(addressaddress);} Preparing: SELECT id,user_id,province,city,town,mobile,street,contact,is_default,notes,deleted FROM address WHERE id? AND deleted0Parameters: 60(Long)Columns: id, user_id, province, city, town, mobile, street, contact, is_default, notes, deletedRow: 60, 1, 北京, 北京, 朝阳区, 13700221122, 修正大厦, Jack, 0, null, 0Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession205df5dc]
addressAddress(id60, userId1, province北京, city北京, town朝阳区, mobile13700221122, street修正大厦, contactJack, isDefaultfalse, notesnull, deletedfalse)3.3枚举处理器 像是状态的字段可以采用对应的状态转换器进行转换。 枚举类型是比常量更加标准的数据的类型。 /*** 使用状态1正常 2冻结*/private Integer status;从枚举类中进行插入的时候需要时候不推荐间接调用的方式。有没有一种方式可以直接枚举类型的转换呢。 
mp原先就帮我们定义好了对应的枚举类型的处理器。我们直接进行调用就可以了。 
下面是原先类的属性和枚举类的对应的关系。 基本操作 
定义一个枚举类 
//用户状态信息
AllArgsConstructor
Getter
public enum UserStatus {NORMAL(1,正常),FREEZE(2,冻结);EnumValueprivate final int value;private final String desc;
}配置mp设置一个枚举类型的处理器 
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler修改实体类 
//    private Integer status;private UserStatus status;测试 
Test
void tes64(){User usernew User();user.setUsername(赵天);user.setPassword(123456);user.setPhone(102);JSONObject jsonObjectnew JSONObject();//hutool中的jsonObject.set(age,20);jsonObject.set(intro,伏地魔);jsonObject.set(gender,female);user.setInfo(jsonObject.toString());user.setStatus(UserStatus.NORMAL);user.setBalance(2000);user.setCreateTime(DateTime.now());user.setUpdateTime(DateTime.now());boolean flag userService.save(user);System.out.println(是否插入成功flag);
}结果 
JDBC Connection [HikariProxyConnection1844349670 wrapping com.mysql.cj.jdbc.ConnectionImpl5af64ce0] will not be managed by SpringPreparing: INSERT INTO user ( username, password, phone, info, status, balance, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )Parameters: 赵天(String), 123456(String), 102(String), {age:20,intro:伏地魔,gender:female}(String), 1(Integer), 2000(Integer), 2023-09-03 16:55:18.777(Timestamp), 2023-09-03 16:55:18.778(Timestamp)Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession345d053b]
是否插入成功trueTest
void tes65(){User useruserService.lambdaQuery().eq(User::getUsername,赵天).one();System.out.println(user.toString());
}查询出来的结果
User(id1674613593516396924, username赵天, password123456, phone102, info{age: 20, intro: 伏地魔, gender: female}, statusNORMAL, balance2000, createTimeSun Sep 03 16:55:19 CST 2023, updateTimeSun Sep 03 16:55:19 CST 2023)3.4JSON处理器 如何将json字符串转换成对应的类的对象 数据库info的字段类型就是json 这个不是全局的。mvc底层最长用的就是jackson的不是json的类型处理器。 
原先采用的是下面的数据类型 private Object info;现在需要改成下面的数据类型并添加对应的类型处理器 TableField(typeHandler  JacksonTypeHandler.class)private UserInfo info;创建一个实体类 
Data
AllArgsConstructor
NoArgsConstructor
Accessors(chain  true)
public class UserInfo implements Serializable {private Integer age;private String intro;private String gender;
} 
此时进行查询的操作 Testvoid tes65(){User useruserService.lambdaQuery().eq(User::getUsername,赵天).one();System.out.println(user.toString());}结果此时查询出来的info的值是null。 
JDBC Connection [HikariProxyConnection1451516720 wrapping com.mysql.cj.jdbc.ConnectionImpl49f3ff41] will not be managed by SpringPreparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM user WHERE (username  ?)Parameters: 赵天(String)Columns: id, username, password, phone, info, status, balance, create_time, update_timeRow: 1674613593516396924, 赵天, 123456, 102, BLOB, 1, 2000, 2023-09-03 16:55:19, 2023-09-03 16:55:19Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession6d099323]
User(id1674613593516396924, username赵天, password123456, phone102, infonull, statusNORMAL, balance2000, createTimeSun Sep 03 16:55:19 CST 2023, updateTimeSun Sep 03 16:55:19 CST 2023) 
出现上面的原因是我们没有设置resultMap的值 
最简单的解决的方式设置自动映射。 
TableName(value user,autoResultMap  true)此时查询的值就出现了。 
JDBC Connection [HikariProxyConnection998015174 wrapping com.mysql.cj.jdbc.ConnectionImpl3b2e5c0d] will not be managed by SpringPreparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM user WHERE (username  ?)Parameters: 赵天(String)Columns: id, username, password, phone, info, status, balance, create_time, update_timeRow: 1674613593516396924, 赵天, 123456, 102, BLOB, 1, 2000, 2023-09-03 16:55:19, 2023-09-03 16:55:19Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession7c1447b5]
User(id1674613593516396924, username赵天, password123456, phone102, infoUserInfo(age20, intro伏地魔, genderfemale), statusNORMAL, balance2000, createTimeSun Sep 03 16:55:19 CST 2023, updateTimeSun Sep 03 16:55:19 CST 2023) 
或者是采用自己指定的方式 
TableName(value user,resultMap  BaseResultMap)resultMap idBaseResultMap typecom.lxz.demo.domain.Userid propertyid columnid jdbcTypeBIGINT/result propertyusername columnusername jdbcTypeVARCHAR/result propertypassword columnpassword jdbcTypeVARCHAR/result propertyphone columnphone jdbcTypeVARCHAR/result propertyinfo columninfo jdbcTypeOTHER typeHandlercom.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler/result propertystatus columnstatus jdbcTypeINTEGER/result propertybalance columnbalance jdbcTypeINTEGER/result propertycreateTime columncreate_time jdbcTypeTIMESTAMP/result propertyupdateTime columnupdate_time jdbcTypeTIMESTAMP/
/resultMap3.5配置加密 mp默认是提供一个aes算法的加密的工具对配置中的敏感信息做加密处理 生成加密的账号和密码 Testpublic void test1(){//生成16位随机aes密钥String randomKey AES.generateRandomKey();System.out.println(randomKeyrandomKey);//利用密钥对用户名和密码进行加密String usernameAES.encrypt(root,randomKey);System.out.println(usernameusername);//利用密钥对密码加密String passwordAES.encrypt(root,randomKey);System.out.println(passwordpassword);}下面是生成的加密的账号和密码以及用于加密和解密的密钥 
randomKey19cb291382b38782
usernameebMDrqWwkpNR9jkM2x5Iw
passwordebMDrqWwkpNR9jkM2x5Iw将加密之后的配置到配置文件中 
spring:datasource:url: jdbc:mysql://localhost:3306/mp?useSSLfalseserverTimezoneAsia/ShanghairewriteBatchedStatementstrueusername: mpw:ebMDrqWwkpNR9jkM2x5Iw #加密password: mpw:ebMDrqWwkpNR9jkM2x5Iw #加密driver-class-name: com.mysql.cj.jdbc.Driver启动的时候加上对应的启动的参数 
要是单元测试的话就在下面设置上下面的内容 
SpringBootTest(args  --mpw.key19cb291382b38782)不是单元测试的话需要设置下面的内容 测试代码 Testvoid tes65(){User useruserService.lambdaQuery().eq(User::getUsername,赵天).one();System.out.println(user.toString());}查询结果
JDBC Connection [HikariProxyConnection180949634 wrapping com.mysql.cj.jdbc.ConnectionImpl7f79edee] will not be managed by SpringPreparing: SELECT * FROM user WHERE (username  ?)Parameters: 赵天(String)Columns: id, username, password, phone, info, status, balance, create_time, update_timeRow: 1674613593516396924, 赵天, 123456, 102, BLOB, 1, 2000, 2023-09-03 16:55:19, 2023-09-03 16:55:19Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession568750b7]
User(id1674613593516396924, username赵天, password123456, phone102, infoUserInfo(age20, intro伏地魔, genderfemale), statusNORMAL, balance2000, createTimeSun Sep 03 16:55:19 CST 2023, updateTimeSun Sep 03 16:55:19 CST 2023) 
说明解密的密码成功了。 
4.插件功能 本质是拦截器功能 4.1分页插件 
下面是常见的内容  编写配置类 
Configuration
//MapperScan(com.lxz.demo.mapper)
public class MybatisPlusConfig {/*** 添加分页插件*/Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor  new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}测试简单的分页 Testvoid tes65(){//分页参数Integer pageNum1;Integer pageSize10;//分页对象PageUser pagenew PageUser(pageNum, pageSize);//排序page.addOrder(new OrderItem(username,false));//其他参数pageuserService.page(page);Long countpage.getTotal();ListUser resultpage.getRecords();System.out.println(countcount);result.forEach(System.out::println);}//排序 这个是升序page.addOrder(new OrderItem(username,true));有查询条件的 pageuserService.page(page,null);4.2分页案例 
接口内容 补全实体 
请求参数 
package com.lxz.demo.domain.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.List;//返回结果
Data
AllArgsConstructor
NoArgsConstructor
public class PageVoT implements Serializable {private Long total;private Long pages;/** 采用泛型是最好的* */private ListT list;} 
返回参数 
package com.lxz.demo.domain.vo;import com.lxz.demo.domain.UserInfo;
import com.lxz.demo.enums.UserStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;//返回结果
Data
AllArgsConstructor
NoArgsConstructor
public class UserVo implements Serializable {private Long id;private String username;private UserInfo info;private UserStatus status;private Long balance;} 
接口类 
RestController
RequestMapping(/users)
public class UserController {Autowiredprivate UserService userService;PostMapping(/page)public PageVoUserVo queryUserByPage(RequestBody  PageQuery query){return userService.queryUserByPage(query);}} 
或者 区别在于注入的方式是不同的 RestController
RequestMapping(/users2)
RequiredArgsConstructor
public class UserController2 {private final UserService userService;PostMapping(/page)public PageVoUserVo queryUserByPage(RequestBody  PageQuery query){return userService.queryUserByPage(query);}
} 
服务层 
public interface UserService extends IServiceUser {PageVoUserVo queryUserByPage(PageQuery query);
} Autowiredprivate UserMapper userMapper;Overridepublic PageVoUserVo queryUserByPage(PageQuery query) {// mapper.selectPage() 都是可以的PageUser pagePage.of(query.getPageNo(),query.getPageSize());if (!StrUtil.isBlank(query.getSortBy())){page.addOrder(new OrderItem(query.getSortBy(),query.getIsAsc()));}pageuserMapper.selectPage(page,null);Long pagespage.getPages();Long totalpage.getTotal();ListUser listpage.getRecords();PageVo pageVonew PageVo();pageVo.setPages(pages);pageVo.setTotal(total);pageVo.setList(list);if (CollUtil.isEmpty(list)){//没有数据直接返回return new PageVo(page.getTotal(),page.getPages(), Collections.emptyList());}else {//转换Vo的方法ListUserVo userVos BeanUtil.copyToList(list,UserVo.class);return new PageVo(page.getTotal(),page.getPages(), userVos);}}测试接口 
localhost:8081/users/page{pageNo:1,pageSize:5,sortBy:username,isAsc:false
}查询结果 
{total: 100005,pages: 20001,list: [{id: 1674613593516396800,username: 赵天,info: {age: 20,intro: 伏地魔,gender: female},status: NORMAL,balance: 2000},{id: 1674613593516396800,username: 赵六99999,info: {age: 99999,intro: 99999伏地魔,gender: female},status: NORMAL,balance: 2000},{id: 1674613593516396800,username: 赵六99998,info: {age: 99998,intro: 99998伏地魔,gender: female},status: NORMAL,balance: 2000},{id: 1674613593516396800,username: 赵六99997,info: {age: 99997,intro: 99997伏地魔,gender: female},status: NORMAL,balance: 2000},{id: 1674613593516396800,username: 赵六99996,info: {age: 99996,intro: 99996伏地魔,gender: female},status: NORMAL,balance: 2000}]
}但是此时的枚举不是我们需要的类型 
{id: 2,username: Rose,info: {age: 19,intro: 青涩少女,gender: female},status: NORMAL,balance: 300},在原先的枚举类上加上对应的 JsonValue注解 
//用户状态信息
AllArgsConstructor
Getter
public enum UserStatus {NORMAL(1,正常),FREEZE(2,冻结);EnumValueprivate final int value;JsonValueprivate final String desc;
} 
此时返回的内容就是下面的内容 此时把 JsonValue注解加载desc上 {id: 3,username: Hope,info: {age: 25,intro: 上进青年,gender: male},status: 正常,balance: 99800},要是在value上加上对应的注解的话返回的就是下面的格式的内容 
//用户状态信息
AllArgsConstructor
Getter
public enum UserStatus {NORMAL(1,正常),FREEZE(2,冻结);EnumValueJsonValueprivate final int value;
//    JsonValueprivate final String desc;
}{id: 1,username: Jack,info: {age: 20,intro: 佛系青年,gender: male},status: 2,balance: 0},4.3简化4.2操作 
封装分页 publicT PageT getPage(String defaultSort, Boolean defaultIsAsc){//分页插件PageT pnew PageT(pageNo,pageSize);if (!StrUtil.isBlank(sortBy)){//排序条件p.addOrder(new OrderItem(sortBy,isAsc));}else { //可以不设置排序可以设置默认的排序//默认排序p.addOrder(new OrderItem(defaultSort,defaultIsAsc));}return p;}}