MyBatis |
您所在的位置:网站首页 › java基本语法大全 › MyBatis |
文章目录
一、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插件: 步骤: 建库建表===>引入依赖===>配置===>编码===>测试 建一个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); } }查看效果: 相信对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); }运行结果: 原来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 |