Mybatis

您所在的位置:网站首页 mybatis判断等于字符串 Mybatis

Mybatis

2023-03-11 15:51| 来源: 网络整理| 查看: 265

mybatisplus特性支持数据库框架结构创建spring boot工程lombok插件application.yml配置UserMapper接口测试加入日志功能mybatis-plus表的结构BaseMapper里的新增功能添加功能 (还可以获取生成的id)删除方法通过id进行删除修改方法查询方法自定义功能UserMapper接口UserMapper.xml测试通用service接口说明:关于mybstisplus提供的IService的使用UserService接口UserServiceImpl测试通用service的批量添加操作测试MyBatis-plus的常用注解@TableName 注解@TableIdTableId的value属性@TableId的type属性通过全局配置配置主键生成策略TableField@TableLogic雪花算法(mybatis-plus自动生成主键的默认策略)背景数据库分表介绍条件构造器简介(wapper介绍)组装查询条件组装排序条件组装删除条件实现修改功能条件的优先级组装select子句组装子查询使用updateWrapper实现修改功能模拟开发中组装条件的情况第一种方法(较复杂)简便写法LambdaQueryWrapperLambdaUpdateWrapper插件功能分页插件测试类分页相关数据获取自定义分页功能UserMapper接口userMapper.xml配置文件测试方法乐观锁和悲观锁乐观锁悲观锁模拟修改冲突使用MyBaatis-Plus提供的乐观锁插件来优化问题扫描通用枚举的包

mybatisplus

特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

支持数据库

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库

框架结构

创建spring boot工程

使用spring initalize 快速初始化一个spring boot工程

pom.xml配置

4.0.0 org.springframework.boot spring-boot-starter-parent 2.6.4 indi.yuluo mybatisplus 0.0.1-SNAPSHOT mybatisplus mybatisplus 1.8 org.springframework.boot spring-boot-starter com.baomidou mybatis-plus-boot-starter 3.5.1 org.projectlombok lombok true mysql mysql-connector-java runtime com.zaxxer HikariCP 3.3.1 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin

lombok插件

简化实体类的开发

使用@Data注解来完成实体类的有参和无参构造,hasCode和equals以及toStirng和getSet方法

application.yml配置spring: # 配置数据源信息 datasource: # 配置数据源类型 type: com.zaxxer.hikari.HikariDataSource # 配置连接数据库的各个信息 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis?severTimezone=GMT%2B8&characterEncoding=utf-8&ssl=false username: root password: root

UserMapper接口

@Repository 标记为持久层组件 解决测试类中的引用报红线问题

@MapperScan 扫描到的mapper。并不是将接口交给IOC容器进行管理,而是将UserMapper动态生成的代{过}{滤}理类交由IOC容器管理,所以IDEA在编译的时候认为UserMapper无法进行自动装配。 在运行阶段的时候是没有这个错误的

package indi.yuluo.mybatisplus.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import indi.yuluo.mybatisplus.pojo.User;import org.springframework.stereotype.Repository;@Repositorypublic interface UserMapper extends BaseMapper {}

测试package indi.yuluo.mybatisplus;import indi.yuluo.mybatisplus.mapper.UserMapper;import indi.yuluo.mybatisplus.pojo.User;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import java.util.List;/** * @author: yuluo * @createTime: 2022/3/15 22:30 * @File: MyBatisPlusTest.java * @Software: IntelliJ IDEA * @Description: */@SpringBootTestpublic class MyBatisPlusTest { @Autowired private UserMapper userMapper; /** * 用于测试:查询集合的方法 */ @Test public void testSelectList() { // 通过条件构造器来查询一个list集合,若没有条件,则可以设置null为参数 List list = userMapper.selectList(null); list.forEach(System.out::println); }}

加入日志功能

查看生成的sql语句

spring: # 配置数据源信息 datasource: # 配置数据源类型 type: com.zaxxer.hikari.HikariDataSource # 配置连接数据库的各个信息 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis?severTimezone=GMT%2B8&characterEncoding=utf-8&ssl=false username: root password: w082916xmybatis-plus: configuration: # mybatis-plus日志配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

mybatis-plus表的结构

mybatis-plus会先去扫描相对应的实体类,根据反射抽取出来里面的属性名,然后在分析要操作的表是谁,属性名(表中的字段)是谁,生成相对应的sql语句来交给IMC容器进行查询

BaseMapper里的新增功能

添加功能 (还可以获取生成的id)/*** 用于测试:BaseMapper里面的insert方法*/@Testpublic void testInsert() { // 准备参数 User user = new User(); user.setAge(20); user.setName("yuluo"); user.setEmail("[email protected]"); // 调用insert方法插入 返回值为受影响的行数 int insert = userMapper.insert(user); System.out.println("insert = " + insert); // 获取生成的id System.out.println("id : " + user.getId());}

执行的SQL语句

==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )==> Parameters: 1504020449580343298(Long), yuluo(String), 20(Integer), [email protected](String) Preparing: DELETE FROM user WHERE id=?==> Parameters: 1504020449580343298(Long) Preparing: DELETE FROM user WHERE name = ? AND age = ?==> Parameters: yuluo(String), 20(Integer) Preparing: DELETE FROM user WHERE id IN ( ? , ? )==> Parameters: 1(Long), 2(Long) Preparing: UPDATE user SET name=?, email=? WHERE id=?==> Parameters: huakai(String), [email protected](String), 3(Long) Preparing: SELECT id,name,age,email FROM user WHERE id=?==> Parameters: 3(Long) select id, name, age, email from user where id=#{id}

测试/*** 用于测试:自定义查询功能*/@Testpublic void test() { Map map = userMapper.selectById(4L); System.out.println(map);}

通用service接口

说明: 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类对象 Wrapper 为 条件构造器MyBatis-Plus中有一个接口IService接口和其实现类ServiceImpl,封装了常见的业务层逻辑

关于mybstisplus提供的IService的使用 建议编写自己的service,mybatiplus提供的IService不能完全适应复杂的业务场景,可以书写自己的service来继承mybatisplus的IService

UserService接口package indi.yuluo.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService;import indi.yuluo.mybatisplus.pojo.User;public interface UserService extends IService {}

UserServiceImplpackage indi.yuluo.mybatisplus.service.Impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import indi.yuluo.mybatisplus.mapper.UserMapper;import indi.yuluo.mybatisplus.pojo.User;import indi.yuluo.mybatisplus.service.UserService;import org.springframework.stereotype.Service;/** * @author: yuluo * @createTime: 2022/3/16 18:02 * @File: UserServieImpl.java * @Software: IntelliJ IDEA * @Description: */@Servicepublic class UserServieImpl extends ServiceImpl implements UserService {}

测试package indi.yuluo.mybatisplus;import indi.yuluo.mybatisplus.mapper.UserMapper;import indi.yuluo.mybatisplus.service.UserService;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;/** * @author: yuluo * @createTime: 2022/3/16 18:13 * @File: MyBatisPlusServiceTest.java * @Software: IntelliJ IDEA * @Description: */@SpringBootTestpublic class MyBatisPlusServiceTest { // 自动装配 @Autowired private UserService userService; /** * 用于测试: */ @Test public void testGetCount() { // 查询总记录数 long count = userService.count(); System.out.println("count = " + count); }} SQL语句 ==> Preparing: SELECT COUNT( * ) FROM user==> Parameters: Parameters: 1504040927553982466(Long), yuluo2(String), 22(Integer)==> Parameters: 1504040927553982467(Long), yuluo3(String), 23(Integer)==> Parameters: 1504040927553982468(Long), yuluo4(String), 24(Integer)==> Parameters: 1504040927553982469(Long), yuluo5(String), 25(Integer)==> Parameters: 1504040927553982470(Long), yuluo6(String), 26(Integer)==> Parameters: 1504040927553982471(Long), yuluo7(String), 27(Integer)==> Parameters: 1504040927553982472(Long), yuluo8(String), 28(Integer)==> Parameters: 1504040927553982473(Long), yuluo9(String), 29(Integer)b = true

MyBatis-plus的常用注解

表名由BaseMapper的泛型类型决定

@TableName 注解 处理数据库的表名和实体类名不一致的情况数据库中的表名为t_user package indi.yuluo.mybatisplus.pojo;import lombok.Data;import lombok.NoArgsConstructor;/** * @author: yuluo * @createTime: 2022/3/15 22:19 * @File: User.java * @Software: IntelliJ IDEA * @Description: */@Data@TableName("t_user")public class User { private Long id; private String name; private Integer age; private String email;}

当所有的表名前面都有一个一致的前缀的时候,可以在yml配置文件中通过配置给所有的实体类加上同一个前缀

数据库中的表名为t_user mybatis-plus: configuration: # mybatis-plus日志配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 设置MyBatis-Plus的全局配置 global-config: db-config: # 设置实体类所对应的表的统一前缀 table-prefix: t_

@TableId

将属性所对应的字段指定为主键

package indi.yuluo.mybatisplus.pojo;import lombok.Data;import lombok.NoArgsConstructor;/** * @author: yuluo * @createTime: 2022/3/15 22:19 * @File: User.java * @Software: IntelliJ IDEA * @Description: */@Data@TableName("t_user")public class User { @TableId private Long id; private String name; private Integer age; private String email;}

TableId的value属性

作用:用于指定主键的字段

数据库中的主键字段为uId时 package indi.yuluo.mybatisplus.pojo;import lombok.Data;import lombok.NoArgsConstructor;/** * @author: yuluo * @createTime: 2022/3/15 22:19 * @File: User.java * @Software: IntelliJ IDEA * @Description: */@Data@TableName("t_user")public class User { // value可以省略 @TableId(value="uId") private Long id; private String name; private Integer age; private String email;}

@TableId的type属性 设置主键生成策略 (自动递增和雪花算法) 默认为雪花算法条件: 数据库中的主键设置为自动递增,否则无效 package indi.yuluo.mybatisplus.pojo;import lombok.Data;import lombok.NoArgsConstructor;/** * @author: yuluo * @createTime: 2022/3/15 22:19 * @File: User.java * @Software: IntelliJ IDEA * @Description: */@Data@TableName("t_user")public class User { @TableId(value = "uId", type = IdType.AUTO) private Long id; private String name; private Integer age; private String email;}

通过全局配置配置主键生成策略spring: # 配置数据源信息 datasource: # 配置数据源类型 type: com.zaxxer.hikari.HikariDataSource # 配置连接数据库的各个信息 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis?severTimezone=GMT%2B8&characterEncoding=utf-8&ssl=false username: root password: w082916xmybatis-plus: configuration: # mybatis-plus日志配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 设置MyBatis-Plus的全局配置 global-config: db-config: # 设置实体类所对应的表的统一前缀 table-prefix: t_ # 设置统一的主键生成策略 id-type: auto

TableField

指定属性对应的字段名

@TableField("user_name")

@TableLogic 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”。此后在数据库中任然可以看见此条数据记录使用场景:可以进行数据恢复

逻辑删除的实现步骤:

在数据库中新建一个字段,默认值设置为0,在User实体类中设置isDeleted属性,加上@TableLogic注解 package indi.yuluo.mybatisplus.pojo;import com.baomidou.mybatisplus.annotation.TableLogic;import lombok.Data;/** * @author: yuluo * @createTime: 2022/3/15 22:19 * @File: User.java * @Software: IntelliJ IDEA * @Description: */@Datapublic class User { private Long id; private String name; private Integer age; private String email; @TableLogic private Integer isDeleted;}

雪花算法(mybatis-plus自动生成主键的默认策略)

背景

需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量

数据库的扩展方式主要包括:业务分库,主从复制,数据库分表

数据库分表

将不同业务数据分撒存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈

单表数据拆分的形式有两种: 垂直分表:将表中某些不常用且占了大量空间的列拆分出去水平分表:适合表行数特别大的表

介绍

雪花算法是由Twitier公布的分布式主键生成算法,能够保证不同表的主键的不重复性,以及相同表的主键的有序性

核心思想 长度共64bit(一个long型)41bit时间戳(毫秒级)存储的是时间戳的差值(当前时间戳 - 开始时间戳)结果约等于69.73年10bit作为机器的id,(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID) 优点: 整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高

条件构造器简介(wapper介绍) Wrapper条件构造器,最顶端父类 AbstractWrapper:用于查询条件封装,生成sql的where条件QueryWrapper:查询条件封装UpdateWrapper:Update条件封装AbstractLambdaWrapper:使用lambda语法 LambdaQueryWrapper: 用于Lambda语法使用额查询WrapperLambdaUpdateWrapper:Lambda更新封装Wrapper

组装查询条件/** * 用于测试:wrapper条件构造器 */@Testpublic void test1() { // 查询条件: 用户名包含a,年两在20到30之间并且邮箱不为空的用户信息 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.like("name", "a") .between("age", 20, 30) .isNotNull("email"); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::print);} sql语句 ==> Preparing: SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)==> Parameters: %a%(String), 20(Integer), 30(Integer)


【本文地址】


今日新闻


推荐新闻


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