技术标签: java spring学习笔记 mybatis 数据库
模型类:
@Data
@TableName("tbl_user")
public class User {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.NONE)
@TableId(type = IdType.INPUT)
@TableId(type = IdType.ASSIGN_ID)
@TableId(type = IdType.ASSIGN_UUID)
private Long id;
private String name;
@TableField(value="pwd",select=false)
private String password;
private Integer age;
private String tel;
@TableField(exist=false)
private Integer online;
}
配置文件:
# dataSource
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
# mp日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
UserDao接口:
@Mapper
public interface UserDao extends BaseMapper<User> {
}
测试:
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testSave(){
User user = new User();
user.setName("黑马程序员");
user.setPassword("itheima");
user.setAge(12);
user.setTel("4006184000");
userDao.insert(user);
}
}
分布式策略ID:
当数据量足够大的时候,一台数据库服务器存储不下,这个时候就需要多台数据库服务器进行存储。比如订单表就有可能被存储在不同的服务器上。如果用数据库表的自增主键,因为在两台服务器上所以会出现冲突。这个时候就需要一个全局唯一ID,这个ID就是分布式ID。
1.AUTO策略
AUTO的作用是使用数据库ID自增,在使用该策略的时候一定要确保对应的数据库表设置了ID主键自增,否则无效。
2.NONE策略
不设置id生成策略
3.INPUT策略
用户手工输入id,需要将表的自增策略删除掉
如果没有设置主键ID的值,则会报错,错误提示就是主键ID没有给值
4.ASSIGN_ID策略
雪花算法生成id(可兼容数值型与字符串型)。这种生成策略,不需要手动设置ID,如果手动设置ID,则会使用自己设置的值。
生成的ID就是一个Long类型的数据。
5.ASSIGN_UUID策略
以UUID生成算法作为id生成策略。主键的类型不能是Long,而应该改成String类型。
主键类型设置为varchar,长度要大于32,因为UUID生成的主键为32位,如果长度小的话就会导致插入失败。
6.策略对比
1.ID策略全局优化
如何让所有的模型类都可以使用同一个主键ID策略呢?
要在配置文件中添加如下内容:
mybatis-plus:
global-config:
db-config:
id-type: assign_id
配置完成后,每个模型类的主键ID策略都将成为assign_id
2.数据库表与模型类的映射关系全局优化
MP会默认将模型类的类名名首字母小写作为表名使用,假如数据库表的名称都以tbl_开头,那么我们就需要将所有的模型类上添加@TableName
,如何让所有的模型类都可以使用同一个数据库表映射策略呢?
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
设置表的前缀内容,这样MP就会拿 tbl_加上模型类的首字母小写,就刚好组装成数据库的表名
1.多条删除的实现
//删除(根据ID 批量删除),参数是一个集合,可以存放多个id
//int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete(){
//删除指定多条数据
List<Long> list = new ArrayList<>();
list.add(1402551342481838081L);
list.add(1402553134049501186L);
list.add(1402553619611430913L);
userDao.deleteBatchIds(list);
}
}
2.批量查询的实现
//查询(根据ID 批量查询),参数是一个集合,可以存放多个id值。
//List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetByIds(){
//查询指定多条数据
List<Long> list = new ArrayList<>();
list.add(1L);
list.add(3L);
list.add(4L);
userDao.selectBatchIds(list);
}
}
所以对于删除操作业务问题来说有:
物理删除
:业务数据从数据库中丢弃,执行的是delete
操作
逻辑删除:
为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中,执行的是update
操作
数据库表添加列:
新的实体类:
@Data
//@TableName("tbl_user") 可以不写是因为配置了全局配置
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
@TableField(value="pwd",select=false)
private String password;
private Integer age;
private String tel;
@TableField(exist=false)
private Integer online;
@TableLogic(value="0",delval="1")
//value为正常数据的值,delval为删除数据的值
private Integer deleted;
}
新的删除方法:
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete(){
userDao.deleteById(1L);
}
}
从测试结果来看,逻辑删除最后走的是update操作,会将指定的字段修改成删除状态对应的值。
执行查询操作:
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testFind(){
System.out.println(userDao.selectList(null));
}
}
可想而知,MP的逻辑删除会将所有的查询都添加一个未被删除的条件,也就是已经被删除的数据是不应该被查询出来的。
全部查询
@Mapper
public interface UserDao extends BaseMapper<User> {
//查询所有数据包含已经被删除的数据
@Select("select * from tbl_user")
public List<User> selectAll();
}
全局配置优化
全局配置:
mybatis-plus:
global-config:
db-config:
# 逻辑删除字段名
logic-delete-field: deleted
# 逻辑删除字面值:未删除为0
logic-not-delete-value: 0
# 逻辑删除字面值:删除为1
logic-delete-value: 1
业务并发现象带来的问题:
实现思路
数据库表添加列:
新的模型类:
@Data
//@TableName("tbl_user") 可以不写是因为配置了全局配置
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
@TableField(value="pwd",select=false)
private String password;
private Integer age;
private String tel;
@TableField(exist=false)
private Integer online;
private Integer deleted;
@Version
private Integer version;
}
乐观锁拦截器:
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
//1.定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
//2.添加乐观锁拦截器
mpInterceptor.addInnerInterceptor(new
OptimisticLockerInnerInterceptor());
return mpInterceptor;
}
}
执行更新操作:
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testUpdate(){
//1.先通过要修改的数据id将当前数据查询出来
User user = userDao.selectById(3L); //version=3
User user2 = userDao.selectById(3L); //version=3
//2.将要修改的属性逐一设置进去
user2.setName("Jock aaa");
userDao.updateById(user2); //version=>4
user.setName("Jock bbb");
userDao.updateById(user); //verion=3?条件还成立吗?
}
}
官方文档:
https://baomidou.com/pages/0d93c0/#optimisticlockerinnerinterceptor
文章浏览阅读446次,点赞14次,收藏14次。1.背景介绍智能制造控制是现代制造业中的一个重要领域,它涉及到制造过程中的自动化、智能化和优化。随着计算能力的提高和数据技术的发展,人工智能(AI)技术在智能制造控制中的应用也逐渐成为主流。本文将从背景、核心概念、算法原理、代码实例、未来趋势等多个方面进行深入探讨,以帮助读者更好地理解AI在智能制造控制中的应用和研究进展。1.1 背景介绍智能制造控制是制造业中的一个重要领域,涉及到制造...
文章浏览阅读5.4k次,点赞6次,收藏27次。文章目录写在前面题目1.E2.C3.B -D-4.C -E-5.C6. D7.D8. A9.A10.C11.E12.D13.D14.A15.D16.E17.D18.A19. B20.C21.E22.D23.A24.C25.C26.D27.D28.C29.D30.D31.C32.E33.D34.B -C-35. -E-36.A37.A38.D39.D -C-40.B41.C42.E -D-43.C44.B45.A46.C47.E48.B49.D50.CPS写在前面这是美亚杯2018个人赛的个人_2018美亚杯个人赛
文章浏览阅读6.2k次。公司要求使用ECS框架经行开发,没办法只能自己学习了。记录一下学习过程。框架的含义可以去其他地方查看,我这里写一点我的理解(新人,不对请谅解)。ECS即Entity-Component-System(实体-组件-系统) 的缩写。它做到了行为、数据分开,Component存数据。Entity用来就是由各个Component组成。System用来经行他们中间的通信。对于网上或者官方说速度更快、更容..._ecs框架 entitas
文章浏览阅读1.5w次,点赞10次,收藏35次。python内置函数。vars() 函数返回对象object的属性和属性值的字典对象。vars([对象])当函数不接收参数时,其功能和locals函数一样,返回当前作用域内的局部变量。当函数接收一个参数时,参数可以是模块、类、类实例,或者定义了__dict__属性的对象。#作用于模块&amp;gt;&amp;gt;&amp;gt; import time&amp;gt;&a_vars()
文章浏览阅读4.3k次,点赞3次,收藏14次。vue中实现文字超出横向滚动marquee组件<template> <div class="marquee-wrap" ref="marquee-wrap"> <div class="scroll" ref="scroll"> <p class="marquee">{{text}}</p> <p class="copy" ref="copy"></p> </div>_el-pagination超出屏幕
文章浏览阅读59次。一.利用代码加解密usingSystem.Web.Configuration;//加密web.Config中的指定节privatevoidProtectSection(stringsectionName){Configurationconfig=WebConfigurationManager.OpenWebConfigurat..._app.config代码加解密
文章浏览阅读9.2k次,点赞4次,收藏28次。手册里使用的词汇是 regexp 优点: 方便地完成字符串的一些处理操作,例如验证、查找、替换和分割等。类名称为QRegExp类,是基于Perl的正则表达式语言,支持Unicode。头文件:#include < QRegExp >//(尖括号中的空格是为了适应markdown而添加的,编程时不使用多余的空格)qmake:QT += core帮助文档中指出:All functions in_qt regex
文章浏览阅读151次。一、根据订旅馆建模文档,Asg-RH.pdf:1. 绘制用例图模型(到子用例)给出 make reservation 用例的活动图2、根据课程练习“投递员使用投递箱给收件人快递包裹”的业务场景分别用多泳道图建模三个场景的业务过程场景一x科技公司发明了投递柜,它们自建了投递柜以及远程控制系统。注册的投递员在推广期免费使用投递柜。由于缺乏资源,仅能使用y移动平台向客户发送短信通知。..._sdlc的第一阶段是分析。写一个简单的报告,包括: 分析新系统需要解决的问题 l可行
文章浏览阅读8k次,点赞2次,收藏18次。 以前没有做网页开发不知道的内容太多了,现在开始做了这一块,发现内容真多。 星期五接到一个资产核查的任务,时间紧,我对网页这一块的内容还不是很熟练,有些着急,在网上一搜,LayUI的模板,有很多好评和讲解,拿来一用,感觉很不错。 这个后台系统可以很快上手,界面部分不用操心太多,很多页面有实例,略微改动就可以直接使用。 写程序界面是个大问题,这下省事多了,虽然后期项目使用LayUI比较少,但做一些中小型的项目真的是很好的选择,最主要的就是快。..._layui后端模板
文章浏览阅读90次。常见数组_常见的数组
文章浏览阅读1.1k次,点赞28次,收藏24次。这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统。重要提示劝退说明Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程的基础Q:你的这些硬件/软件是开源的吗?A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文章中我会介绍怎么实现UWB定位系统,告诉你如何克服难点,但不会直接把PCB的Gerber文件给你去做板子,不会把软件的源代码给你,不会把编译好的固件给你。我不会给你任何直接的结果,我只是告诉你方法。_uwb_tdoa
文章浏览阅读10w+次,点赞2次,收藏13次。Visual Studio解决办法:报错原因:堆栈溢出,可能是定义的某个变量太大而没有修改栈保留大小所至。本人的问题是用ege画图的时候定义的地图面积太大导致。解决方法:项目→属性→链接器→系统→堆栈保留大小→设置成一个比较大的数并应用。即可完美解决,如果还没解决可能是设置的不够大。其实真正应该修改的是你的代码,问题就出现在为什么会有栈溢出问题,很简单,显然是数组或者开辟的指针空间太大!所以,解决办法就是将大数组定义在main()外部当作全局变量,全局变量放在数据区,空间足够使用。或者写在mai_vs未经处理的异常怎么处理