我自信,故我成功。
需要的基础:
ssm
javaweb
mysql
javaSE
必须会的知识点
为什么学他?mybatis不够嘛?
mybatis以及很便捷了,plus肯定会更加的便捷
mybatis简化了jdbc,mybatisplus简化了mybatis
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
文档地址:https://mp.baomidou.com/guide/quick-start.html
使用第三方组件呢:
我们所有的sql是不可见的,我们希望知道他是如何执行的,这十分重要
配置文件中加入默认的日志先查看效果,如果有需求导入相关依赖即可
#日志的配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
结果:
配置完毕之后,我们就可以查看日志了,日后的学习也要多观察自动生成的日志,慢慢的你会发现,mybatis-plus是很好用的一个工具,
测试插入放的时候有一个神奇的东西,它会自动帮我们生成id,
测试方法:
user user = new user();
user.setAge(3);
user.setName("hyc");
user.setEmail("3132774018@qq.com");
int result = usermapper.insert(user);
System.out.println(result);
System.out.println(user);
我们没有setid但是id却自动生成了,思考
![image-20210723150421869]
我们都知道。数据库插入id为:全局唯一的id
这个时候我们就要来了解一下,
我们的实体类,中的
id -----》对应我们的主键
我们这个时候要了解一个东西:雪花算法
之前的学习中我们使用过什么? uuid来生成全局唯一id
接下来从内容借鉴博客
分布式系统唯一id生成方案:https://www.cnblogs.com/haoxinyue/p/5208136.html
默认唯一id:默认是ID_worker(全局唯一) 在新版本已经过时
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake。雪花算法支持的TPS可以达到419万左右(2^22*1000)。
雪花算法在工程实现上有单机版本和分布式版本。单机版本如下,分布式版本可以参看美团leaf算法:https://github.com/Meituan-Dianping/Leaf
接下来有几个主键的策略
源码解释: AUTO(0), 自增 NONE(1), 无 INPUT(2), 手动输入 ID_WORKER(3), 全局唯一 UUID(4), 全局为一 ID_WORKER_STR(5); 截取字符串表示,ID_WORKER的字符串表示法
AUTO(0), 自增
首先是自增:
@TableId(type = IdType.AUTO)
测试更新操作
测试:
user user = new user();
user.setAge(3);
user.setName("保证我一路畅通无阻");
user.setEmail("3132774018@qq.com");
int result = usermapper.updateById(user);
System.out.println(result);
System.out.println(user);
我测试了两次
有细节的出现,就是随着需求不同mybatisplus做了动态sql的处理,所有的自动生成sql都是动态配置的
创建时间,修改时间,这些操作一般都是自动化完成的,我们需推荐手动更新
阿里巴巴的开发手册:gmt_create,创建时间,gmt_modified,修改时间几乎所有的表,配置上,而且需要自动化
方式一:数据库级别(工作中不允许你修改数据)
方式二:代码级别
在面试过程中,我们经常会被问道乐观锁,悲观锁,这个起始是非常简单
乐观锁:顾名思义乐观锁。他总是认为不会出现问题,无论干什么都会不上锁,如果出现了问题,再次更新值的测试 悲观锁:顾名思义,他总是认为会出现问题,什么时候先上锁,再去操作
我们主要理解乐观锁机制
乐观锁实现方式:
乐观锁:1.先查询获得版本号 version = version+1
-- A
update user set name = hyc, version = version+1\
where id = 2 and vsersion=1
-- B如果b线程抢先完成,这个时候 vsersion =2 会导致A修改失败
update user set name = hyc, version = version+1
where id = 2 and vsersion=1
测试一下,MP的乐观锁插件
代码示例
单个查询
user userSel = usermapper.selectById(1l);
System.out.println(userSel);
批量查询
List<user> userList = usermapper.selectBatchIds(Arrays.asList(1, 2, 3));
userList.forEach(System.out::println);
条件查询
HashMap<String,Object> map = new HashMap<>();
map.put("name","保证我一路畅通无阻");
List<user> users = usermapper.selectByMap(map);
users.forEach(System.out::println);
分页在网站使用的·十分之多
怎么使用的?
1、MP分页插件组件导入
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
2、直接使用Page对象即可!
//测试分页查询
@Test
void selectByPage(){
//参数一:当前页,参数二:页面条数大小
Page page = new Page<>(1,5);
usermapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
System.out.println(page.getTotal());
}
代码示例:
//删除
@Test
void deleteByid(){
usermapper.deleteById(1l);
}
//批量按id删除
@Test
void deleteBybatchid(){
usermapper.deleteBatchIds(Arrays.asList(1419289393067204612l,1419289393067204613l));
}
//根据map条件删除
@Test
void deleteBymapid(){
HashMap<String, Object> map = new HashMap<>();
map.put("id","1419289393067204614");
usermapper.deleteByMap(map);
}
在工作中会遇到一些问题,逻辑删除
物理删除:从数据库直接移除 逻辑删除:再数据库中没有溢出,而是通过一个变量来让他失效!
常见功能:管理员可以查看被删除的记录,防止数据的丢失,类似于回收站
测试一下:
我们再查看数据库,记录还在,只是字段被更新了;逻辑删除的字段
我们再去查寻的时候,deleted为1就是被删除后,他会自动拼接到之后的sql中,加入只查询deleted为0的字段
我们在平时的开发中,会遇到一些慢sql。测试,druid
MP也提供了性能分析插件,如果超过了时间就停止运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fKKWeBI-1629731482783)(mybatisplus.assets/image-20210726092011898.png)]
导入之后执行sql就会有相应的东西了
只要超过了规定的执行的时间,就抛出异常
好处:
十分重要,:warpper
我们写一些复杂的sql就可以用它来代替
我们的所有条件都可以用这个构造器来使用
PS: 记得查看输出的sql进行分析
测试一,
@Test
void contextLoads() {
QueryWrapper wrapper = new QueryWrapper();
wrapper
.isNotNull("name")
.isNotNull("email")
.ge("age",12);
usermapper.selectList(wrapper).forEach(System.out::println);
}
测试二
@Test
void Test2(){
//right和left的区别 %t,t%
QueryWrapper wrapper = new QueryWrapper();
wrapper
.notLike("name","e")
.likeRight("email","t");
List> maps = usermapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
剩下的自己测试
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
需要依赖
com.baomidou
mybatis-plus-generator
3.4.1
记得导入自己的模版引擎需要的依赖,这里我们测试使用的是默认的
org.apache.velocity
velocity-engine-core
latest-velocity-version
测试:配置好的代码生成器
//构建一个代码生成器对象
AutoGenerator generator = new AutoGenerator();
//配置策略
//1.全局配置
GlobalConfig gc = new GlobalConfig();
String projectpath = System.getProperty("user.dir");//项目地址
gc.setOutputDir(projectpath+"/src/main/java");
gc.setAuthor("hyc");
gc.setOpen(false);
gc.setFileOverride(false);//是否覆盖
gc.setServiceImplName("%sService");//接口前缀,不要
gc.setIdType(IdType.ID_WORKER);//策略id
gc.setDateType(DateType.ONLY_DATE);//时间类型
gc.setSwagger2(true);//开启Swagger
generator.setGlobalConfig(gc);
//2.数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?userSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dsc.setDbType(DbType.MYSQL);//这只数据库
generator.setDataSource(dsc);
//3.包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("blog");
pc.setParent("com.hyc");
pc.setEntity("pojo");
pc.setMapper("mapper");
pc.setService("Service");
pc.setController("controller");
generator.setPackageInfo(pc);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user");//配置映射的表名可以写很多个比如:user,role,region
strategy.setNaming(NamingStrategy.underline_to_camel);//驼峰
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库的名字转换
strategy.setEntityLombokModel(true);//是否开启lombok
strategy.setRestControllerStyle(true);
//逻辑删除
strategy.setLogicDeleteFieldName("deleted");
//自动填充
TableFill gmtcreate =new TableFill("create_time", FieldFill.INSERT);//再新增的时候填充
TableFill gmtupd=new TableFill("update_time", FieldFill.INSERT_UPDATE);//再新增和更新的时候填充
ArrayList tablefill = new ArrayList<>();
tablefill.add(gmtcreate);
tablefill.add(gmtupd);
strategy.setTableFillList(tablefill);
//乐观锁
strategy.setVersionFieldName("version");//sersion叫变量
strategy.setRestControllerStyle(true);//开启restful风格接口
strategy.setControllerMappingHyphenStyle(true);//请求风格,localhost/v1/id_ps_..
generator.setStrategy(strategy);
generator.execute();
效果:
完结撒花,这个mp确实太猛了,大幅度的减少了,一些操作,自动化帮你做了很多东西,十分可靠的一个提升效率的工具!!!完事