何夜息随笔录-快速入门MybatisPlus

文章目录

  • 何夜息随笔录-快速入门MybatisPlus
    • 简述
    • 快速构建项目
    • 常用注解介绍
    • 获取添加对象的id
    • 通用CRUD操作
      • insert
      • update
      • select
      • delete
    • 条件构造器
    • 代码生成器
    • 自定义SQL查询

简述

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

简单来说:mybatis简化了jdbc,mybatisPlus简化了mybatis的操作

快速构建项目

在Maven中导入主要依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.0.5</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.2</version>
</dependency>

弄完SpringBoot的基本配置后,我们创建实体类,然后创建mapper接口,但是这个mapper接口需要继承BaseMapper,然后CRUD就完成了,不需要写具体的实现,具体实现已经在BaseMapper找那个实现了。

package com.heyexi.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;@Repository
public interface DepartmentMapper extends BaseMapper<Department>
{}

然后需要在主程序入口中扫描这个mapper包

package com.heyexi;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan("com.heyexi.mapper")
@SpringBootApplication
public class SpringbootMybatisPlusApplication
{public static void main(String[] args){SpringApplication.run(SpringbootMybatisPlusApplication.class, args);}
}

配置数据库

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: url: jdbc:mysql://localhost:3307/sjk?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai

然后建立实体:需要注意表名和实体名要保持一致。

然后进行测试

package com.heyexi;import com.heyexi.mapper.DepartmentMapper;
import com.heyexi.pojo.Department;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class SpringbootMybatisPlusApplicationTests
{@Autowiredprivate DepartmentMapper departmentMapper;@Testvoid contextLoads(){List<Department> list = departmentMapper.selectList(null);System.out.println(list);}}

然后就报错了!

为什么SQL语句自动加了呢?数据库表中没有用下划线,难道是把首字母大写替换成了_加小写?这个应该如何防止它改,自己我们实体类中自定义的字段来查询呢?

这时候我们需要去配置文件中关闭自动驼峰转化的功能

spring.datasource.url=jdbc:mysql://localhost:3307/staff_salary?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=kingsley
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#关闭驼峰自动转换下划线功能
mybatis-plus.configuration.map-underscore-to-camel-case=false

然后就发现已经成功了!

常用注解介绍

  • 主键注解@TableId:给实体的主键添加,可以保证自动根据数据库的id自增。

  • @TableId(type = IdType.AUTO)
    private Long id;
    
  • @TableName:表名注解,默认情况下实体名就是表名,当实体名跟数据库表名不同时,可以通过这个注解指定数据库的表名。

  • @TableName(value = "t_user")
    public class user
    {}
    
  • @TableField:字段注解,当实体字段名跟表字段名不一致时,可以使用这个注解指定数据库的表名。还可以规定该实体字段名在数据库中是否存在,当设为不存在时,在插入时就不会进行插入。

  • @TableField(value = "u_id")
    private Long id;
    //指定字段在数据库不存在
    @TableField(exist = false)
    private String name;
    

获取添加对象的id

我们可以在添加一条记录后,立即获得该对象在数据库自增后的id,会自动回写到实体中。

User user = new User();
//获取添加后的对象id
user.setAge(11);
user.setName("何夜息");
userMapper.insert(user);
System.out.println(user.getId());输出:
2021-01-31 13:54:06.289  INFO 19536 --- [           main] com.fucai3d.ApplicationTest              : Started ApplicationTest in 4.161 seconds (JVM running for 5.82)
1

通用CRUD操作

继承BaseMapper后,提供了一些常用的方法可以直接使用,特别方便。

insert

先说插入语句,调用insert方法,需要注意的是,这个只会添加设置了的值,比如不设Name,那么insert里面就不会有这个字段。

user.setAge(11);
user.setName("何夜息");
userMapper.insert(user);
update

更新操作一般就用id来更新,这是一个很好的方法,需要注意调用更新方法时,它只会更新你设置了的实体内容的值,没有设置的就不会更新,保留原来的数据,这是一个做的很好的地方。

User user = new User();
//获取添加后的对象id
user.setId(Long.valueOf(1));
user.setAge(666);
//user.setName("何夜息"); //没有设置的就不会更新,保留原来的属性
userMapper.updateById(user);

select

查询操作是最常用的操作,需要熟练掌握。

根据id查询
System.out.println(userMapper.selectById(1));
输出
2021-01-31 14:15:45.389  INFO 28860 --- [           main] com.fucai3d.ApplicationTest              : Started ApplicationTest in 4.58 seconds (JVM running for 6.315)
User(id=1, name=何夜息, age=666)

根据多个列查询

当我们需要根据其他列查询时,可以直接设置要查询的列,然后通过selectOne方法查询,但是这个查到两个以上的时候就会报错。

User user = new User();
user.setName("何夜息");//sql的where条件变成where name='何夜息'
System.out.println(userMapper.selectOne(user));

我也可以通过多个id查询

List u_ids = new ArrayList();
u_ids.add(1);
u_ids.add(2);List list = userMapper.selectBatchIds(u_ids);
System.out.println(list);输出
[User(id=1, name=何夜息, age=666), User(id=2, name=sa, age=112)]

使用selectOne查询时有多个返回值就会报错,这时候我们可以使用selectByMap来查询,map里还是查询的字段和条件,返回就是list,简直太完美了。

Map<String,Object> map = new HashMap<>();
map.put("age",666);//key是字段名,val是值
List list = userMapper.selectByMap(map);
System.out.println(list);输出
[User(id=1, name=何夜息, age=666), User(id=4, name=张三, age=666)]
delete

删除基本不用,需要再使用即可,和查询一样。

User user = new User();
user.setId(112);
userMapper.deleteById(user);

可以用map多个条件删除

Map<String,Object> map = new HashMap<>();
map.put("age",666);//key是字段名,val是值
userMapper.deleteByMap(map);

还可以根据多个id删除

List u_ids = new ArrayList();
u_ids.add(1);
u_ids.add(2);
userMapper.deleteBatchIds(u_ids);//返回受影响行数

条件构造器

条件构造器就是我们需要使用其他自定义的查询条件,或者一些复杂的语句的时候,可以使用Wrapper来包装。

https://mp.baomidou.com/guide/wrapper.html#abstractwrapper

​ 比如查询一下名字里带"三"的,age在500以上的,需要用到QueryWrapper来实现。

注意条件里面是数据库的列名,后面是值。

List<User> users = userMapper.selectList(new QueryWrapper<User>().gt("age",500).like("name","%三%")
);
System.out.println(users);
输出
[User(id=4, name=张三, age=666), User(id=5, name=三人, age=502)]

这个很像链式编程,很方便。

更新删除操作也是一样的道理,都可以使用条件构造器设置条件进行更新删除。

//更新姓名带“何”或者年龄在500到1000之内的数据
User user = new User();
user.setName("修改了");
//第一个参数是要修改成什么样子,第二个是条件构造器
Integer res = userMapper.update(user,new UpdateWrapper<User>().like("name","%何%").or()//使用or后后面的都是Or的条件.between("age",500,1000)
);
System.out.println(res);
输出:
WARNING: All illegal access operations will be denied in a future release
4

可以看到没有set的值age并没有修改哦!

代码生成器

使用mybatis-plus的代码生成器可以自动生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

添加 代码生成器 依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.0.5</version>
</dependency>

添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。

<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.2</version>
</dependency>

然后可以直接运行生成

//代码生成器
public class CodeGenerator
{public static void codeGenerator(String moudule_name,String t_name){// 1.全局配置GlobalConfig gc = new GlobalConfig();//获取项目路径,因为生成java文件需要文件路径String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java")//设置java文件的输出路径.setAuthor("何夜息")//作者.setOpen(false)// 是否打开输出目录.setFileOverride(true)//多次生成时文件覆盖.setIdType(IdType.AUTO)//主键ID策略.setBaseResultMap(true)// 生成ResultMap.setBaseColumnList(true)// 生成 sql片段.setOpen(false) // 自动打开生成后的文件夹.setServiceName("%sService") //service接口开头不带I,自动匹配实体.setMapperName("%sMapper").setXmlName("%sMapper").setXmlName("%sMapper");// 2.数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://ip:2037/zhenxiang?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");// dsc.setSchemaName("public");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("");//3. 包配置PackageConfig pc = new PackageConfig();pc.setModuleName(moudule_name)//模块名,就是父包下一级的包名.setParent("com.zhenxiang") //设置父包.setMapper("mapper") //设置mapper包.setService("service") //设置service包.setServiceImpl("service.impl").setEntity("pojo"); //设置实体包//4. 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.nochange) //表名生成实体名策略.setColumnNaming(NamingStrategy.nochange) //字段生成实体属性名称策略.setEntityLombokModel(true) //是否使用Lombok优化代码.setInclude(t_name) //需要生成的表.setTablePrefix("t_") //表前缀 可以保证生成的实体没有表的前缀.setRestControllerStyle(true);//控制器类型//5.整合配置// 代码生成器AutoGenerator mpg = new AutoGenerator();mpg.setGlobalConfig(gc).setDataSource(dsc).setPackageInfo(pc).setStrategy(strategy);try{//执行mpg.execute();System.out.println("执行成功");}catch (Exception e){System.out.println(e);}}
}

自定义SQL查询

使用定义语句我们可以使用mybatis中的方法,可以在mybatis-plus的XBase接口中,使用@Select注解,在mybatis中也一样,一种是将SQL语句写在XML配置文件中,如果我们不想写在配置文件中,可以直接写在注解中,这样其实还更方便。

    @Select("SELECT DISTINCT user_id FROM (SELECT * FROM expert_forecast WHERE DATE(create_time) >= DATE(#{start_time}) AND  DATE(create_time) < DATE(DATE_FORMAT(NOW(),'%Y-%m-%d'))) AS t1;")List<Long> get_user_id_100days(@Param("start_time") String start_time);

然后在service中定义相同的名字,注入Base接口进行调用就行了。

不得不学习的MybatisPlus教程相关推荐

  1. bootstrapt学习指南_Bootstrap 教程

    认识 Bootstrap: 在您学习完本教程后,您即可达到使用 Bootstrap 开发 Web 项目的中等水平.建议您进行Bootstrap实战练习来巩固您刚学到的新知识. 如果您觉得 Bootst ...

  2. Java 学习 系统 免费 教程 视频 链接

    Java 学习 系统 免费 教程 视频 链接 哔哩哔哩视频 01,<Java编程学习第一季>:av35556299 02,<Java编程学习第二季>:av37316788 03 ...

  3. 业余快速学习虚幻引擎教程

    仅用5小时学会虚幻引擎! 你会学到什么 专为希望在业余时间打造虚幻引擎技能的艺术家和开发人员量身定制的专业技术 从几何图形到材料,从照明到互动,所有方面的提示 探索如何创造建筑水的效果 如何使用顶点绘 ...

  4. 3Dmax+V-Ray学习建筑可视化教程

    3Dmax+V-Ray学习建筑可视化教程 视频:1920×1080,. mp4,25 fps |音频:AAC-LC,253 kb/s 2通道,48.0 KHz |流派:电子学习 软件:3Ds Max ...

  5. 鸟哥的linux 实训教程,鸟哥的Linux基础学习实训教程

    1.理想的Linux上机实践课程 每周一次.每次三小时的学与练 本书所有例题讲解,均经过鸟哥在大专院校实施多年来的测试,对于学生的理解具有相当满意的效果. 2. 提供一致性教学环境 让学习者不再有陌生 ...

  6. python自学平台-Python学习交流平台与教程推荐

    Python学习交流平台与教程推荐 目录 一.有编程问题怎么办? 1 Stack Overflow 2 Github 3 CSDN-专业IT技术社区 二.Python教程 1 跟我读Python文档 ...

  7. python难不难学-超级适合新手学习的python教程,入门其实不难?

    在互联网时代很多人都希望掌握一个与互联网相关的知识,比如Python的知识就非常重要,因为无论是操作新媒体平台还是去制作一些软件,我们都需要掌握一些Python的技巧,而且学习一些Python的知识, ...

  8. MatConvNet深度学习工具箱安装教程

    MatConvNet深度学习工具箱安装教程 方法1 方法2 安装成功测试方法 安装matlab2020a: 安装Visual Studio 2017: 方法1 步骤1: 到官网http://www.v ...

  9. python写脚本入门-学习Python的教程?:python 脚本菜鸟教程

    学习Python的教程? Python作为一门面向对象的性语言,其实它的学习也很简单 - 配置 - Python基础(语法..数据类型.高级变量.函数.Python高级特性) - 面向对象编程.面向对 ...

最新文章

  1. 工作以后如何有效学习
  2. 销售自己使用过的小汽车纳多少增值税
  3. Linux——Windows连接CentOS XRDP 错误信息(login failed for display 0)
  4. android 开源 数据库,Android开源数据库框架-LitePal的使用
  5. mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改
  6. Verilog实现2分频实例
  7. Hi3519V101开发环境搭建(二)
  8. Oracle Logminer 说明
  9. spring boot 学习之五(日志配置)
  10. 运行yum update出现一下错误信息
  11. 如何使用终端来调节Mac鼠标移动速度?
  12. openssl在arm下的交叉编译
  13. 第四章:mongodb 命令行操作进程控制性能优化
  14. ps 去除gif水印
  15. Python 爬虫入门的教程(2小时快速入门、简单易懂、快速上手)
  16. Android 自定义跑马灯文字
  17. mysql 磁盘已满_MySQL 磁盘满了,怎么办??
  18. k8s入坑之报错(11)添加node节点报错:error execution phase preflight: [preflight] Some fatal errors occurred:...
  19. 2020算法面经问题汇总
  20. 嵌入式linux启动信息完全注释

热门文章

  1. Java使用高德地图获取行驶距离等信息
  2. NodeNCU(ESP8266)刷MicroPython固件、连接WiFi并传输文件
  3. 2021年CFA二三级考试报名入口正式开放!附考试时间
  4. 家庭计算机网络的组网策略,如何组建一个家庭局域网
  5. 青岛市城阳区2019年信息技术结业考试题目
  6. 胸肌介绍:肌肉图示和英文名称
  7. 2022-2027年中国董青石轻质耐火砖行业市场全景评估及发展战略规划报告
  8. SecureCRT、Xmanager对Linux上传下载文件或文件夹
  9. 《乔布斯传》英文原著重点词汇笔记(十一)【 chapter nine】
  10. 三分法解决凸(凹)函数极值问题​​​​​​​