mybatisi - plus是MyBatis的一个强大的增强工具包,用于简化开发。这个工具包为MyBatis提供了一些高效、有用、开箱即用的特性,使用它可以有效地节省您的开发时间。
可以简化CRUD代码
希望了解sql执行
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #使用默认的控制台输出发现并没有问题
如果不插入id数字
@Test void test2() { User user = new User(); user.setAge(33); user.setEmail("2333@33.com"); user.setName("lyc2"); userMapper.insert(user); contextLoads(); } }mybatis-plus会自动插入一个id
创建时间,修改时间
gmt_create,gmt_modified
数据库级别
ALTER TABLE user ADD COLUMN `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER email, ADD COLUMN `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `create_time`;更新的时候会自动更改update_time
代码级别插入
@TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.UPDATE) private Date updateTime;编写自动填充器
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start fill"); this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("update fill"); this.setFieldValByName("updateTime",new Date(),metaObject); } }通过一个字段让它失效,delete=1
@TableLogic 字段注解
本质上执行update操作
查询的时候过滤掉delete字段等于1的字段
application.yaml
mybatis-plus: global-config: db-config: logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)uuid,自增id,雪花算法,redis生成
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增。
这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
第一个部分,是 1 个 bit:0,这个是无意义的。第二个部分是 41 个 bit:表示的是时间戳。第三个部分是 5 个 bit:表示的是机房 id,10001。第四个部分是 5 个 bit:表示的是机器 id,1 1001。第五个部分是 12 个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,0000 00000000。SnowFlake算法的优点: (1)高性能高可用:生成时不依赖于数据库,完全在内存中生成。
(2)容量大:每秒中能生成数百万的自增ID。
(3)ID自增:存入数据库中,索引效率高。
SnowFlake算法的缺点:
依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁总是认为不会出现问题,无论干什么都不去上锁,如果出现了问题,再次更新值测试
悲观锁:无论干什么都会出现问题,无论干什么都会上锁再去操作
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } update user set name="lyc", version = version +1 where id=2 and version =1; --如果其他线程修改了 version版本发生改变,导致这个线程修改失败,保证了线程的安全测试
void test3(){ User lyc=userMapper.selectById(5l); lyc.setId((long) 5); lyc.setName("xhc332"); if (userMapper.updateById(lyc)>0){ System.out.println("success"); }else { System.out.println("failure"); }; }测试
@Test void test4(){ //当前页 页面大小 Page<User> page = new Page<>(1, 5); userMapper.selectPage(page, null); for (User record : page.getRecords()) { System.out.println(record); } }一些复杂的sql可以使用它可以替代
实际拼接的sql语句
@Test void test2(){ //名字等于lyc userMapper.selectList(new QueryWrapper<User>().eq("name","lyc")); }具体的wrapper可以查看
https://baomidou.com/guide/wrapper.html#abstractwrapper
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
模板引擎
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> public class LycCode { public static void main(String[] args) { //构建代码自动生成器对象 AutoGenerator mpg = new AutoGenerator(); //配置策略 //1. 全局配置 GlobalConfig gc = new GlobalConfig(); //获取当前项目目录 String projectPath = System.getProperty("user.dir"); //输出目录 gc.setOutputDir(projectPath+"/src/main/java"); //设置作者 gc.setAuthor("lyc"); //设置swagger2 实体属性注解 gc.setSwagger2(true); //不打开资源管理器 gc.setOpen(false); //不覆盖原来代码 gc.setFileOverride(false); //去除service层前的i gc.setServiceName("%sService"); //主键策略 gc.setIdType(IdType.ID_WORKER); //设置日期类型 gc.setDateType(DateType.ONLY_DATE); //代码构造器设置全局配置 mpg.setGlobalConfig(gc); //2.数据源配置 DataSourceConfig dsc = new DataSourceConfig(); //设置密码 dsc.setPassword("123456"); //设置数据库类型 dsc.setDbType(DbType.MYSQL); //设置连接数据库的url dsc.setUrl(""); //设置驱动的名字 dsc.setDriverName("com.mysql.jdbc.Driver"); //设置用户名 dsc.setUsername("lyc"); //代码构造器设置数据源配置 mpg.setDataSource(dsc); //3.包配置 PackageConfig pc = new PackageConfig(); // pc.setModuleName("blog"); pc.setParent("com.lyc"); mpg.setPackageInfo(pc); //4.策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); //是否启用lombok插件 strategy.setEntityLombokModel(true); //驼峰命名 strategy.setRestControllerStyle(true); //逻辑删除字段 strategy.setLogicDeleteFieldName(); // 公共父类 strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); // 写于父类中的公共字段 strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));//设置映射的表 strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); //自动填充字段 TableFill tableFill = new TableFill("gmt_create", FieldFill.INSERT); strategy.setTableFillList(); mpg.setStrategy(strategy); //执行代码构造 mpg.execute(); } }