MyBatis

您所在的位置:网站首页 java基本语法大全 MyBatis

MyBatis

2023-08-07 06:22| 来源: 网络整理| 查看: 265

文章目录 一、MyBatis VS JPA二、MyBatis-Plus简介三、MyBatis-Plus快速入门1、lombok简介及安装2、入门小案例 四、基本使用1、通用传统模式简介及通用mapper新增方法2、常用注解3、排除非表字段的三种方式 五、MyBatis-Plus查询方法1、普通查询2、条件构造器查询3、select不列出全部字段4、condition作用5、实体作为条件构造器构造方法的参数6、AllEq用法7、其他使用条件构造器的方法8、lambda条件构造器 六、自定义SQL及分页查询1、使用条件构造器的自定义sql2、分页查询 七、更新与删除1、mybatis-plus更新2、mybatis-plus删除方法 八、AR模式、主键策略和基本配置1、ActiveRecord模式2、主键策略3、基本配置 九、通用的Service1、基本方法2、批量操作操作3、链式调用方法

一、MyBatis VS JPA

JPA: java持久层API,可以理解为一种规范,Hibernate就是其具体一个实现。(目前比较常用的是SpringDataJpa,它是Spring提供的一套简化开发的框架,按照约定好的方法命名规则,编写dao层接口,就可以在不编写实现情况下执行数据库操作,还提供了除CRUD以外的功能,例如分页、排序、复杂查询等等,SpringDataJpa可以理解为对JPA的再次封装,底层仍旧是Hibernate)

Mybatis优势: 1、SQL语句可以自由控制,更灵活、性能较高。 2、SQL与代码分离,易于阅读和维护。 3、提供XML标签,支持编写动态SQL语句。

JPA优势: JPA移植性比较好(Hibernate方言) 提供了很多CRUD方法、开发效率高(不用编写sql语句) 对象化程度更高(面向对象开发思想)

Mybatis劣势: 简单CRUD操作需要编写SQL语句(单表仍需要编写Mapper接口方法和xml的sql) XML中有大量sql需维护 mybatis自身功能有限

二、MyBatis-Plus简介

Mybatis-plus简介:Mybatis增强工具,只做增强,不作改变,简化开发,提高效率。 在这里插入图片描述

MP在mybatis启动的时候,它在mybatis的xml和注解注入之后,紧接着反射分析实体,然后注入到底层容器中。就是注入crud之类的。注入之前MP会进行判断,是否已经注入同样的方法,如果已经注入,就不在注入。它的注入时机在容器启动时,所以MP使用crud、本身是无性能损耗的。

官网地址:https://mybatis.plus/

1、Crab:Mybatisplus3.0教学版。(MP核心程序员作品)

2、Crab:WEB极速开发框架。(MP项目负责人作品)

github项目地址:https://github.com/baomidou/mybatis-plus

码云项目地址:https://gitee.com/baomidou/mybatis-plus

Mybatis-plus特点:

1、无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性

2、依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring

3、损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作

4、通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

5、多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题

6、支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作

7、支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!) 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

8、内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询

9、内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询

10、内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

三、MyBatis-Plus快速入门 1、lombok简介及安装

lombok作用:提高开发效率,通过注解形式使javabean生成get、set、有参数、无参数、toString等方法,无需手动实现。

倘若不使用lombok可以使用的注解有: 注解介绍: 下面只是介绍了几个常用的注解,更多的请参见: https://projectlombok.org/features/index.html

@Getter / @Setter

可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

@EqualsAndHashCode

默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。

@ToString

生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。

@Data

@ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,我们使用这个注解就足够了。

IDEA安装lombok插件: 在这里插入图片描述 在这里插入图片描述 然后在maven的pom.xml引入依赖:

org.projectlombok lombok 1.16.10 2、入门小案例

步骤: 建库建表===>引入依赖===>配置===>编码===>测试

建一个mp名的数据库,在建一个user表:

#创建数据库 #使用查看全文 create table user ( id BIGINT(20) PRIMARY key not null comment '主键', name varchar(30) default null comment '姓名', age int(11) default null comment '年龄', email varchar(50) default null comment '邮箱', manager_id BIGINT(20) default null comment '直属上级id', create_time DATETIME default null comment '创建时间', CONSTRAINT manager_fk foreign key (manager_id) REFERENCES user (id)) ENGINE=INNODB CHARSET=UTF8; #数据初始化 INSERT INTO user (id,name,age,email,manager_id,create_time) VALUES (1087982257332887553, '猪头', 20, '[email protected]', NULL, '2019-01-11 14:20:20'), (1088248166370832385,'小懒猪',20,'[email protected]', 1087982257332887553, '2019-02-05 11:12:22'), (1088250446457389058,'小白',18,'[email protected]', 1088248166370832385, '2019-02-14 08:31:16'), (1094590409767661570,'小黑',21,'[email protected]', 1088248166370832385, '2019-01-14 09:15:15'), (1094592041087729666,'小可耐',22,'[email protected]', 1088248166370832385, '2019-01-14 09:48:16');

然后建一个Spring Initializr工程:

pom.xml依赖:

org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.4 org.projectlombok lombok true com.baomidou mybatis-plus-boot-starter 3.1.0 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test junit junit test

创一个application.yaml,进行配置:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp?useSSL=false&serverTimezone=GMT%2B8 username: root password: 1214

编写实体类: entity/User.java:

@Data @EqualsAndHashCode(callSuper = false) @TableName("user") public class User { /** * 主键 */ private Long id; /** * 姓名 */ @TableField(value = "name", condition = SqlCondition.LIKE) private String name; /** * 年龄 */ @TableField(condition = "%s;#{%s}") private Integer age; /** * 邮箱 */ private String email; /** * 直属上级id */ private Long managerId; /** * 创建时间 */ private Date createTime; /* * 备注(不与数据库字段对应) # transient 不参与序列化 */ @TableField(exist = false) private String remark; }

编写dao接口: UserMapper.java:

public interface UserMapper extends BaseMapper { }

在启动类中添加注解:@MapperScan(“com.mp.first_mp.dao”),进行扫描

最后就是编写测试类:

@RunWith(SpringRunner.class) @SpringBootTest public class SimpleTest { @Autowired private UserMapper userMapper; @Test public void select() { List list = userMapper.selectList(null); Assert.assertEquals(5, list.size()); list.forEach(System.out::println); } }

查看效果: 在这里插入图片描述 运行是成功的,我们可以发现相对于使用MyBatis来说,MyBatis-plus不用编写xml文件编写那些繁琐的SQL语句,简单快速的MyBatis-plus的就到这里,若还有兴趣就继续看下去吧ヾ(◍°∇°◍)ノ゙

四、基本使用 1、通用传统模式简介及通用mapper新增方法

相信对SSM比较熟系的小伙伴应该对SSM传统编程模式都比较熟系:

接口中写抽象方法===>XML或注解写SQL===>Service中调用接口===>Controller中调用

为了方便大家观察,在application.yaml多增加应该日志的输出:

logging: level: root: warn com.mp.first_mp.dao: trace pattern: console: '%p%m%n'

进行测试:

@Test public void insertTest() { User user = new User(); user.setName("小灰"); user.setAge(20); user.setEmail("[email protected]"); user.setManagerId(1088248166370832385L); user.setCreateTime(new Date()); int rows = userMapper.insert(user); System.out.println("影响记录数:" + rows); }

运行结果: 在这里插入图片描述 倘若大家观察得仔细可以发现主键id并没有设定自增,那为什么没有出现报错呢???

原来MP的默认主键策略是基于雪花算法的自增主键,在MP的源码中有雪花算法的实现代码。

额~~~可能有小伙伴不知道什么是雪花算法,大家可以看看这位博主写的文章:雪花算法的原理和实现Java

2、常用注解

mybatis-plus:

主键采用雪花算法生成值的前提是实体类的主键属性名称必须为id。

mybatis-plus:

数据表字段带有_的可以自动映射到驼峰式命名的属性上(t_user——》tUser)。

注解:

1.数据库名不同,在类上增加@TableName(“mp_user”) 2.主键ID的驼峰一般无法识别,在主键属性上增加@TableId 3.属性与字段名不相同,在属性上增加@TableField(“name”)

@TableName(“数据库表名”):

使用场景实体类名称和数据表名不一致时,通过它指定表名,此时就可以使用mp的单表操作。

@TableId(“主键名”):

使用场景实体类属性名称和数据表主键不是id时,通过它声明该属性为主键,就可以采用雪花算法生成主键值操作。

@TableField(“字段名”):

使用场景实体类属性名称和数据表字段名不一致时,通过它指定数据表字段名称,就可以和实体类属性对应。

3、排除非表字段的三种方式

使用场景: 实体类中的某个属性不对应表中的任何字段,只是用于保存临时数据,或者临时组装的数据。

使用方式

1、 transient修饰实体类属性(修饰的属性不会被序列化)。

缺陷:有些需求需要序列化该字段。

2、 static修饰属性(前提手动实现get、set方法,Lombok对静态属性不会提供get、set方法)。

缺陷:每个对象的属性值一致。

3、 @TableField(exist=false),这个注解用来表示数据表中不存在该字段,默认是true。

五、MyBatis-Plus查询方法 1、普通查询

普通查询:使用方式为实现BaseMapper接口对象调用该方法。

1、T selectById(Serializable id):使用场景为通过主键查询,只要该主键类型实现了Serialzable接口即可。

@Test public void selectById() { User user = userMapper.selectById(6); System.out.println(user); }

2、List selectBatchIds(@Param(Constants.COLLECTION) Collection



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3