Dao层
1.在插入数据时,mybatisplus如果识别到实体类里面有个字段叫id,那么会默认把这个字段当成主键。当传入的实体id=null时,mp会自动生成一个全局唯一的主键
如:
==> Preparing: INSERT INTO table1_employee ( id, name, gender, email, dept_id ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: 478154753(Integer), 王麻子(String), 1(String), 578223@qq.com(String), 2(Integer)
<== Updates: 1
//478154753即为生成的主键
如果在表中已经设置了主键自增长,如果想关闭这个功能,在id字段上面添加注解:
@TableId(value = “id”, type = IdType.AUTO):自增 —开启这个
@TableId(value = “id”, type = IdType.ID_WORKER_STR):分布式全局唯一ID字符串类型
@TableId(value = “id”, type = IdType.INPUT):自行输入 @TableId(value = “id”, type =IdType.ID_WORKER):分布式全局唯一ID 长整型类型 —默认是这个 @TableId(value = “id”,
type = IdType.UUID):32位UUID字符串 @TableId(value = “id”, type = IdType.NONE):无状态
当然也可以在配置文件里面开启全局的设置:
如果想获取插入的主键,插入的主键id就在原来传入的实体类的id字段里面,取出来即可。
Employee employee = new Employee(null, "王麻子", "1", "578223@qq.com", 2);
int i = myDao.insert(employee);
System.out.println(employee.getId());
Service层
service写法;
public interface MyService extends IService<Employee> {
//泛型里面是数据库对应的pojo
}
serviceImpl的写法:
@Service
public class MyServiceImpl extends ServiceImpl<MyDao, Employee> implements MyService {
//泛型:第一个是mapper类,第二个操作的实体类
//因为service层本质上还是整合的Dao层,因此传入mapper类是必不可少的。
}
如果只有implements MyService,那么就必须实现里面的很多抽象方法,再extends ServiceImpl<MyDao, Employee>就可以避免重写。
写完后一些基础的用法可在https://baomidou.com/guide/crud-interface.html#service-crud-%E6%8E%A5%E5%8F%A3查询得到。
Page 分页功能
1.在上述已经完成Service层的基础上,如果mybatis-plus想实现分页功能:需要用到
如果不实现page插件的话,演示:
@Test
void contextLoads4() {
IPage<Employee> page =new Page<Employee>(1,2);
IPage<Employee> employeeIPage = myService.page(page);
List<Employee> records = employeeIPage.getRecords();
System.out.println(records);
}
查看控制台的sql语句,开启控制台日志的方法:在springboot配置文件中写入
#打开log日志--->用来观察mybatisplus调用的sql语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
再具体的看:https://blog.csdn.net/qq_36407469/article/details/119003229
可以看到sql语句为;==> Preparing: SELECT id,name,gender,email,dept_id FROM table1_employee
没有limit说明没有分页,page没用。
需要注册page插件才能起作用(详见:https://baomidou.com/guide/page.html)注意因为使用的mysql,所以需要修改为DbType.MYSQL
:
因此在上述操作后,再次运行page就会生效了
==> Preparing: SELECT COUNT(*) AS total FROM table1_employee
==> Parameters:
<== Columns: total
<== Row: 10
<== Total: 1
==> Preparing: SELECT id,name,gender,email,dept_id FROM table1_employee LIMIT ?
==> Parameters: 2(Long)
<== Columns: id, name, gender, email, dept_id
<== Row: 1, 王地爆, 1, <<BLOB>>, 1
<== Row: 4, 王天宝, 0, <<BLOB>>, 2
<== Total: 2
2.page也可以用于xml文件的的分页
mp实现了一些基础功能,也有条件查询器可以帮助查询,但是有时候很复杂的sql还是会写在mapper.xml文件里面的。
是真的智能,只需要在定义方法的时候把page对象放在第一位,然后返回值由mybatis的list<实体>改为IPage<实体>就可以实现自动分页,最基本的page实现在上面已经说明。
而且神奇的是好像不用再SBoot配置文件里面写mapper.xml文件的位置都可以自动去找了,因为mp默认认的mapper.xml文件位置为:classpath*:/mapper/**/*.xml
。
Wrapper 条件构造器
Lambda方式使用QueryWrapper:
@Test
void contextLoads5() {
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
LambdaQueryWrapper<Employee> wrapper = queryWrapper.lambda().ge(Employee::getId, 1);
List<Employee> list = myService.list(wrapper);
System.out.println(list);
}
拓展
逻辑/物理删除
使用方法:
https://baomidou.com/guide/logic-delete.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
自动填充
一般来说是在数据表字段中自动填充创建表的时间和修改的时间(mysql5.7以上版本才支持自动填充时间)
https://baomidou.com/guide/auto-fill-metainfo.html
SQL打印分析
https://baomidou.com/guide/p6spy.html
数据安全保护
https://baomidou.com/guide/safety.html
乐观/悲观锁
乐观锁的mp实现:https://baomidou.com/guide/interceptor-optimistic-locker.html#optimisticlockerinnerinterceptor —乐观锁的bean可以和前面的page分页写在一起,就不用配多个bean了,add就行
事务的隔离级别
悲观锁:悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。假设功能并发量非常大,就需要使用如:synchronized来处理高并发下产生线程不安全问题, 会使其他线程进行挂起等待从而影响系统吞吐量。
乐观锁(CAS):乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。 假设功能产生并发几率极少,采用乐观锁版本机制对比, 如果有冲突 返回给用户错误的信息。(在有可能会产生不可重复读的问题的时候产生冲突,数据不入库,返回错误信息)
代码生成器
最后一个视频一个小时未看。。。
https://www.bilibili.com/video/BV1Tr4y1A7jf?p=13