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

济南手机网站建设做网站找谁好

济南手机网站建设,做网站找谁好,给我一个网站好吗,网站必须做电子认证吗四#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作#xff1a;2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算…四MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算法 2.4 NONE 策略2.5 ASSIGN_UUID 策略 3. 分页3.1 分页插件3.2 自定义分页插件 4. 总结5. 最后 1. 主键策略 1.1 主键生成策略介绍 首先大家先要指定什么是主键主键的作用就是唯一标识我们可以通过这个唯一标识来定位到这条数据。 当然对于表数据中的主键我们可以自己设计生成规则生成主键。但是在更多的场景中没有特殊要求的话我们每次自己手动生成的比较麻烦我们可以借助框架提供好的主键生成策略来生成主键。这样比较方便快捷。 在MyBatis Plus 中提供了一个注解是 TeableId 。 该注解提供了各种的主键生成策略我们可以通过使用该注解来对于新增的数据指定主键生成策略。那么在以后新增数据的时候数据就会按照我们指定的主键生成策略来生成对应的主键。 2. 准备工作 特别说明 需要导入的相关 jar 依赖。如下 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.3/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.rainbowsea/groupIdartifactIdmp03/artifactIdversion0.0.1-SNAPSHOT/versionnamemp03/namedescriptionmp03/descriptionurl/licenseslicense//licensesdevelopersdeveloper//developersscmconnection/developerConnection/tag/url//scmpropertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!-- spring boot web 依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- mysql 驱动依赖--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- lombok 的依赖--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!-- druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.8/version/dependency!-- mybatis-plus 的依赖--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/buildrepositoriesrepositoryidspring-snapshots/idnameSpring Snapshots/nameurlhttps://repo.spring.io/snapshot/urlreleasesenabledfalse/enabled/releases/repository/repositoriespluginRepositoriespluginRepositoryidspring-snapshots/idnameSpring Snapshots/nameurlhttps://repo.spring.io/snapshot/urlreleasesenabledfalse/enabled/releases/pluginRepository/pluginRepositories/project 对应的 application.yaml 文件的配置的编写 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisplus?serverTimezoneUTCcharacterEncodingutf8useUnicodetrueuseSSLfalseusername: rootpassword: MySQL123main:banner-mode: off #关闭 spring boot 在命令行当中的图标显示mybatis-plus:global-config:banner: false # 关闭 mybatis-plus 在命令行当中的图标显示db-config:table-prefix: rainbowsea_ # 还可以通过统一添加前缀的方式configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 Log 日志信息打印map-underscore-to-camel-case: true # 开启驼峰下划线映射规则 编写对应的 DataSource 数据源这里我们通过配置类的方式将Spring Boot 的数据库连接池换为 Druid 数据库连接池。如下 package com.rainbowsea.config;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;Configuration // 标注配置类 public class DruidDataSourceConfig {BeanConfigurationProperties(value spring.datasource)public DataSource getDataSource() {DruidDataSource druidDataSource new DruidDataSource();return druidDataSource;} } 运行测试看看是否换为了 Druid 数据库连接池。 编写场景启动器 2.1 AUTO 策略 该策略为跟随数据库表的主键递增策略前提是数据库表的主键要设置为自增。 实体类添加注解指定主键生成策略。 运行测试 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rainbowsea.bean.User; import com.rainbowsea.mapper.UserMapper; //import com.rainbowsea.mapper.UserMapper2; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;SpringBootTest public class PrimaryKeyTest {Autowired//Resourceprivate UserMapper userMapper;Testvoid primary() {User user new User();user.setName(张三);user.setAge(19);user.setEmail(maryrainbowsea.com);userMapper.insert(user);} }2.2 INPUT 策略 该策略表示必须由我们手动的插入id,否则无法添加数据 // 该策略表示必须由我们手动的插入id,否则无法添加数据前提是需要去掉数据表的自增策略import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.Version; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import com.rainbowsea.enums.GenderEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.Date; import java.util.Map;Data NoArgsConstructor AllArgsConstructor TableName(autoResultMap true,value rainbowsea_user2)//查询时将json字符串封装为Map集合 public class User extends ModelUser {TableId(type IdType.INPUT) // 该策略表示必须由我们手动的插入id,否则无法添加数据前提是需要去掉数据表的自增策略private String id;private String name;private Integer age;private String email; }这里如果我们省略不写id,会发现无法插入数据 Test void primaryKey(){User user new User();user.setName(Jerry);user.setAge(38);user.setEmail(test8powernode.com);userMapper.insert(user); } 但是我们自己指定了id,发现可以添加成功 2.3 ASSIGN_ID 策略 我们来思考一下像之前这种自动递增的方式有什么问题 如果我们将来一张表的数据量很大我们需要进行分表。 常见的分表策略有两种水平拆分垂直拆分 水平拆分水平拆分就是将一个大的表按照数据量进行拆分 垂直拆分 垂直拆分就是将一个大的表按照字段进行拆分 其实我们对于拆分后的数据有三点需求就拿水平拆分类说 之前的表的主键是有序的拆分后还是有序的。 虽然做了表的拆分但是每条数据还需要保证主键的唯一性。 主键最好不要直接暴露数据的数量这样容易被外界知道关键信息。 那就需要有一种算法能够实现这三个需求这个算法就是雪花算法。 2.3.1 雪花算法 雪花算法是由一个 64 位的二进制组成的最终就是一个 Long 类型的数据。 主要分为四部分存储 。 1位 的符号位固定值为 041位 的时间戳10位的机器码包含 5位 机器 id 和 5位 服务 id12位 的序列号 **使用雪花算法可以实现有序、唯一、且不直接暴露排序的数字。 ** import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.Version; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import com.rainbowsea.enums.GenderEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.Date; import java.util.Map;Data NoArgsConstructor AllArgsConstructor TableName(autoResultMap true,value rainbowsea_user2)//查询时将json字符串封装为Map集合 public class User extends ModelUser {TableId(type IdType.ASSIGN_ID) // 雪花算法,就算数据表没有设置自增策略也可以成功的自增策略private String id;private String name;private Integer age;private String email;}运行测试 我们可以在插入后发现一个19位长度的id,该id就是雪花算法生成的id,这是二级制的十进制表示形式 2.4 NONE 策略 NONE策略表示不指定主键生成策略当我们没有指定主键生成策略或者主键策略为NONE的时候他跟随的是全局策略那我们来看一下他的全局策略默认是什么 是在application.yaml 文件当中配置 id-type 属性。全局配置中 id-type是用于配置主键生成策略的我们可以看一下id-type的默认值 通过查看源码发现id-type的默认值就是雪花算法。 也就是说就算我们不采用任何的了主键策略**在全局配置当中默认就是采用了雪花算法 ASSIGN_ID策略 ** 2.5 ASSIGN_UUID 策略 UUIDUniversally Unique Identifier全局唯一标识符定义为一个字符串主键 (注意这里是字符串也就是说你的数据表的id 的主键要为字符串类型才可以使用这个ASSIGN_UUID策略)采用32位数字组成编码采用 16进制定义了在时间和空间都完成唯一的系统信息。 UUID的编码规则 1~8 位采用系统时间在系统时间上精确到毫秒级保证时间上的唯一性。9~16 位采用底层的 IP地址在服务器集群中的唯一性。17~24 位采用当前对象的 HashCode 值在一个内部对象上的唯一性。25~32 位采用调用方法的一个随机数在一个对象内的毫秒级的唯一性。 通过上述以上4中策略可以保证数据的唯一性 。在系统中需要用到随机数的地方都可以考虑采用UUID 算法。 我们想要演示UUID的效果需要改变一下表的字段类型和实体类的属性类型 将数据库表的字段类型改为 varchar(50) 将实体类的属性类型改为String,并指定主键生成策略为 IdType.ASSIGN_UUID 完成数据的添加。我们会发现成功添加了一条数据id为uuid类型 3. 分页 在大部分场景下如果我们的SQL没有这么复杂是可以直接通过MybatisPlus提供的方法来实现查询的在这种情况下我们可以通过配置分页插件来实现分页效果 分页的本质就是需要设置一个拦截器通过拦截器拦截了SQL通过在SQL语句的结尾添加limit关键字来实现分页的效果 3.1 分页插件 接下来看一下配置的步骤配置分页插件 通过配置类来指定一个具体数据库的分页插件因为不同的数据库的方言不同具体生成的分页语句也会不同这里我们指定数据库为Mysql数据库。 import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.apache.ibatis.plugin.Interceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor new MybatisPlusInterceptor();/*通过配置类来指定一个具体数据库的分页插件因为不同的数据库的方言不同具体涩会给你从的分页语句也会不同这里我们指定数据库为 MySQL数据库*/mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return mybatisPlusInterceptor;}}实现分页查询效果: import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rainbowsea.bean.User; import com.rainbowsea.mapper.UserMapper; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;SpringBootTest public class PageTest {Resourceprivate UserMapper userMapper;Testvoid selectPage() {LambdaQueryWrapperUser lambdaQueryWrapper new LambdaQueryWrapper();// 指定分页对象分页对象包含分页信息 IPageIPageUser userPage new Page(1,3);//PageUser userPage new Page(2, 3);// 执行查询userMapper.selectPage(userPage, lambdaQueryWrapper);// 获取分页查询的信息System.out.println(当前页: userPage.getCurrent());System.out.println(每页显示条数: userPage.getSize());System.out.println(总页数: userPage.getPages());System.out.println(总条数: userPage.getTotal());System.out.println(分页数据: userPage.getRecords());} }3.2 自定义分页插件 在某些场景下我们需要自定义SQL语句来进行查询。接下来我们来演示一下自定义SQL的分页操作 在Mapper接口中提供对应的方法方法中将IPage对象作为参数传入 package com.rainbowsea.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.rainbowsea.bean.User; import org.apache.ibatis.annotations.Mapper;Mapper // 包路径扫描 public interface UserMapper extends BaseMapperUser {IPageUser selectByName(IPageUser page, String name); } 在UserMapper.xml映射配置文件中提供查询语句。 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.rainbowsea.mapper.UserMapperselect idselectByName resultTypecom.rainbowsea.bean.Userselect * from rainbowsea_user where name #{name}/select/mapper实现分页查询效果: import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rainbowsea.bean.User; import com.rainbowsea.mapper.UserMapper; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;SpringBootTest public class PageTest {Resourceprivate UserMapper userMapper;Testvoid selectPage2() {IPageUser userPage new Page(1,3);userMapper.selectByName(userPage,Mary);// 获取分页查询的信息System.out.println(当前页: userPage.getCurrent());System.out.println(每页显示条数: userPage.getSize());System.out.println(总页数: userPage.getPages());System.out.println(总条数: userPage.getTotal());System.out.println(分页数据: userPage.getRecords());} }4. 总结 主键策略 AUTO 策略自动添加主键前提是要设置数据表的自增。INPUT 策略该策略表示必须由我们手动的插入id,否则无法添加数据前提是需要去掉数据表的自增策略。ASSIGN_ID 策略运用了雪花算法为主键的id 加密的同时自增了。NONE策略默认的策略该策略默认就是默认设置默认就是雪花算法数据表没有设置自增策略也可以成功。ASSIGU_UUID策略采用UUID的编码加密主键同时自增主键全局唯一标识符定义为一个字符串主键,注意是字符串所以数据表的主键要为字符串类型才行对应的 Java bean 对象当中的属性值也要为 字符串类型 分页的本质就是需要设置一个拦截器通过拦截器拦截了SQL通过在SQL语句的结尾添加limit关键字来实现分页的效果 5. 最后 “在这个最后的篇章中我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底继续在其他的领域奋斗。感谢你们我们总会在某个时刻再次相遇。”
http://www.w-s-a.com/news/325611/

相关文章:

  • 学校网站建设与管理porto wordpress模板
  • 余姚做网站公司网站建设有哪些基本流程
  • 门户网站建设的报价百度医生在线问诊
  • 北京公司注册在哪个网站浏览器打开网址404
  • 廊坊做网站公司绣花图案设计网站
  • 网站空间租用哪个好购物网站建设模板图片
  • 建设银行包头分行网站泰安网签成交量最新
  • 手机微网站与微官网现在去成都需要隔离吗
  • 学校的二级网站怎么建设深圳企业网站制作设计
  • 自己做qq头像静态的网站网站建设是属于软件开发费吗
  • 举报网站建设做网站之前的工作
  • 用QQ群做网站排名个人网站制作协议
  • 做茶叶网站的素材天津网站营销
  • 网站设计建设流程图微信端的网站开发python
  • 湖州网站seo优化网站改域名备案
  • dedecms怎么制作网站合肥电商网站开发
  • 网站开发通用流程图做flash的网站
  • 营销型网站有哪些平台网站建设藤设计
  • 网站需求分析网站建设美食网站建设多少钱
  • 有专门做网站的吗建德网站
  • 做网站要买服务器吗单页设计思路
  • 一 电子商务网站建设规划网站开发前端框架和后端框架
  • 自助网站建设系统软件自己免费建设网站
  • 百度微建站access如何与网站连接数据库
  • ppt素材免费网站网站正能量晚上免费软件
  • 个人淘宝客网站如何备案搭建一个平台要多少钱
  • nginx 网站建设淘客网站怎么做首页
  • 网站制作的基本步骤是手机网站建设 新闻
  • 水墨 网站源码工装
  • 任丘网站建设服务网站 建设原则