Mybatis-plus笔记整理(二)

本文记录了MyBatis-plus的ActiveRecord(AR)模式相关内容。介绍了AR模式是一种领域模型模式,可通过操作实体完成表的增删改查。详细说明了实现AR模式的条件,以及在该模式下进行新增、修改、删除、查找操作的方法和特点,还提及操作结果类型等注意事项。

前言

在第一篇整理笔记中,从mybatis-plus基本搭建,到通用mapper的基本使用,都做了一个介绍,也留下了不少坑。

有同事问我说,为啥要用Oracle 数据库来讲解Mybatis-plus,而不是用MySQL;两个原因:

  1. 日常开始中一直在用Oracle;
  2. 网站上很多讲解Mybatis-plus教程,大部分都是基于MySQL的,Oracle的占比很少,用Mybatis-plus连接MySQL 和连接Oracle,其实都是一样的操作,但是会存在不同之处,毕竟是趟过几个坑的菜鸟;

本篇博客中,将记录如下内容:

        MyBatis-plus的ActiveRecord(AR)模式;

AR 模式

简介

   ActiveRecord(AR)模式,是一种 领域模型模式,一个模型类就代表了一个表。AR模式可以帮我们通过操作一个实体,来完成对一个表的增删改查。AR模式并不是Mybatis-plus所独有的,java作为一种准动态语言,并没有对AR模式进行良好的探索,而Mybatis-plus,则在这一方面,走出了一大步。

 

实现AR模式

这里需要用到在第一篇文章中创建的数据表pub_users和实体类Users;不需要改变数据表,只需要针对实体类做改变。

import com.baomidou.mybatisplus.extension.activerecord.Model;

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.ToString;

@Data

@EqualsAndHashCode(callSuper = false)

@TableName("PUB_USERS")

@ToString

public class Users extends Model<Users> {

 

    private static final long serialVersionUID = 1L;

    private Integer id;

 

    @TableField(value = "code")

    private String code;

 

    private String name;

 

    private String pwd;

 

    private String adminPwd;

}

 

Mybatis-plus 使用它自带的AR模式,需要做如下操作:

  1. 需要继承Model接口,并填写对应的泛型;
  2. 必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下 才能使用此 AR 模式 (接口中不需要实现任何方法) 

 

     3. 对EqualsAndHashCode进行设置是否调用父类,可设置不调,设置属性callSuper为False;

 

当满足以上三点时,才可以使用AR模式;

当我们真正使用AR模式时,对象会成为我们操作数据库的主体,对象中的内容会成为我们增删改查的使用到的内容;

当我们继承了Model类之后,我们就拥有了Model对象中的增删改查方法;

 

AR模式新增

----- insert 方法

@RequestMapping("/ar/insert")

    public void insertAR(){

        Users users = new Users();

        users.setId(18);

        users.setName("钟馗");

        users.setPwd("123");

        users.setCode("111119");

        users.setAdminPwd("456");

        users.insert();

    }

 

 

 

-----insertOrUpdate

此方法不同于insert方法,insert方法会直接针对数据进行插入;insertOrUpdate 方法会根据操作id进行验证,如果当前id已经存在的情况下,就针对当前数据进行修改而不是新增;

如下代码所示,我针对已经存在的id(id=18)进行操作;

@RequestMapping("/ar/insertOrUpdate")

    public void insertOrUpdate(){

        Users users = new Users();

        users.setId(18);

        users.setName("钟馗");

        users.setPwd("123");

        users.setCode("111119");

        users.setAdminPwd("789");

        users.insertOrUpdate();

    }

 

可以看到,此方法会首先根据id执行查询操作;如果当前对应id的数据存在,则根据id,对当前数据的内容进行修改;

如果当前id不存在,则会执行insert方法;

如下所示:

@RequestMapping("/ar/insertOrUpdate")

    public void insertOrUpdate(){

        Users users = new Users();

        users.setId(19);

        users.setName("鲁班大师");

        users.setPwd("124");

        users.setCode("111120");

        users.setAdminPwd("780");

        users.insertOrUpdate();

   }

 

AR模式修改

-----updateById

根据id修改数据内容;

@RequestMapping("/ar/updateById")

    public void updateByIdAR(){

        Users user = new Users();

        user.setId(18);

        user.setName("高渐离"); // 需要修改的内容

        user.updateById();// 设置内容

    }

 

这里我们通过user对象的方式进行修改,需要为user对象设置id值,并为user设置需要修改的内容;

 

----- update

自定义查询条件,修改数据;这里的条件,是我们在上一篇博文中提到过的

Wrapper<T> updateWrapper;

这里我们将id=18的数据的名字修改为“杨玉环”

@RequestMapping("/ar/update")

    public void  updateAR(){

        Users users = new Users();

        users.setName("杨玉环");

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("id",18);

        users.update(queryWrapper);

    }

 

AR模式删除

----deleteById

AR模式下,deleteById 删除数据的操作有两种,一种是带参的deleteById(Serializable id),一种是不带参的deleteById();

无参的:

@RequestMapping("/ar/deleteById")

    public  void deleteByIdAR(){

        Users users = new Users();

        users.setId(18);

        users.deleteById();

    }

 

带参的:

@RequestMapping("/ar/deleteByIds")

    public void deleteByIdARS(){

        Users users = new Users();

        users.setId(1);

        users.deleteById(10);

    }

 

不带参数的deleteById会以user对象中id为删除条件,带参数的deleteById会以参数为删除条件;

----- delete

自定义删除条件;

@RequestMapping("/ar/delete")

    public void  deleteAR(){

        Users users = new Users();

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("id",10);// 设置删除条件: 删除id为10的数据

        users.delete(queryWrapper);

    }

 

 

 

AR增删改后话

  1. AR模式下增加删除修改数据,得到的结果不再是Integer类型,而是Boolean 类型,操作成功,返回true;失败,则返回false;
  2. 带有Wrapper<T> updateWrapper 的方法,在执行结果中,会拼接操作条件;
  3. 所有的SQL都是经过预编译,然后才执行的;

 

AR查找操作

-----selectAll

 查询全部内容:

@RequestMapping("/ar/selectAll")

    public void selectAllAR(){

        Users user = new Users();

        List<Users> users = user.selectAll();

        users.forEach(System.out::println);

    }

 

----- selectById

根据主键记性查询;同deleteById类似,存在带参查询和不带参查询;

@RequestMapping("/ar/selectById")

    public void selectByIdAR(){

        Users users = new Users();

        users.setId(2);

        Users users1 = users.selectById();

        System.out.println(users1.toString());

    }


@RequestMapping("/ar/selectByIds")

    public void selectByIdsAR(){

        Users users = new Users();

        users.setId(2);

        Users users1 = users.selectById(7);

        System.out.println(users1.toString());

    }


带参的selectById,会根据参数来设置id查询条件,而不是在根据users对象中id来设置查询条件;

 

----- selectOne

自定义查询条件,返回查询结果,这里根据查询条件获取到的查询结果只有一个;

@RequestMapping("/ar/selectByOne")

    public void selectByOne(){

        Users users = new Users();

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.eq("id",7);

        Users user = users.selectOne(queryWrapper);

        System.out.println(user);

    }

 

----- selectList

自定义查询条件,返回查询结果,这里根据查询条件获取到的查询结果会封装成List集合;

 

@RequestMapping("/ar/selectByList")

    public void selectByList(){

        Users users = new Users();

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.like("code","1111");

        List<Users> usersList = users.selectList(queryWrapper);

        usersList.stream().forEach(System.out::println);

    }

 

 

 

 

----- selectCount

自定义查询条件,统计符合条件的数据的条数;

@RequestMapping("/ar/selectByCount")

    public void selectByCount(){

        Users users = new Users();

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.like("code","1111");

        Integer count = users.selectCount(queryWrapper);

        System.out.println("统计查询条数:"  + count);

    }

 

 

 

------ 分页查询

自定义查询条件,对数据进行分页查询;

@RequestMapping("/ar/selectByPage")

    public void selectByPage(){

        Users users = new Users();

        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();

        queryWrapper.like("code","1111");

        Page<Users> usersPage = users.selectPage(new Page<Users>(1, 2), queryWrapper);

        List<Users> userList = usersPage.getRecords();

        userList.stream().forEach(System.out::println);

    }

 

注意: 同第一篇博文中提到的selectPage效果一样,因为操作的数据库是oracle数据库,所以selectBypage方法并不能实现分页效果;

内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。
内容概要:本文围绕“考虑电动汽车灵活性的微网多时间尺度协调调度”展开研究,提出了一种基于Matlab代码实现的优化调度模型。该模型深入挖掘电动汽车作为灵活可控负荷与分布式储能单元的双重潜力,通过构建日前、日内及实时等多时间尺度的协调调度机制,有效应对光伏发电的间歇性与波动性,实现微电网内部功率的动态平衡。研究综合集成了电动汽车集群的有序充放电管理、储能系统协同优化与多种需求响应策略,建立了以系统运行成本最小化、可再生能源消纳最大化及供电可靠性最优化为目标的综合数学模型,并采用Matlab进行仿真求解。结果表明,所提方法能显著平抑功率波动,优化源--储资源的时空配置,提升微电网运行的经济性与稳定性。; 适合人群:电气工程、能源与动力工程、控制科学与工程、电力系统及其自动化等专业的研究生、高校科研人员,以及从事智能电网、微电网规划、电动汽车与电网互动(V2G)技术研发的工程技术人员。; 使用场景及目标:①研究高比例可再生能源接入背景下,含大规模电动汽车的微电网协同优化运行策略;②掌握多时间尺度滚动优化的建模思想与Matlab/Simulink仿真技术;③探索电动汽车聚合商参与电力市场辅助服务的可行路径与效益评估方法; 阅读建议:建议读者结合提供的Matlab代码进行复现与调试,深入理解目标函数构建、约束条件处理及求解器调用等关键技术环节,可尝试引入电池老化模型、用户出行行为不确定性等更贴近实际的因素,以深化研究的实用性与前瞻性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VogtZhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值