现货库存:1000
文章目录
-
- 1. 使用和配置简单 - 带分页配置
- 2. 用法
-
- 2.0 Wrapper属性
- 2.1 @TableId - 自定义主键生成策略
- 2.2 @TableField - 自定义字段值填充
- 2.3 锁 - 乐观锁,悲观锁
-
- 2.3.1 @Version - 乐观锁
- 2.4 DML、DQL操作
-
- 2.4.1 DML - 增删改 - 物理
- 2.4.2 DML - 逻辑删除 - @TableLogic - 仅对注入MyBatisPlus注入的SQL生效,自定义SQL不生效
- 2.4.3 DQL - 查
- 2.4.4 条件构造器
- 2.5 性能分析、SQL打印插件(p6spy) - 支持SQL格式化
- 2.6 代码生成器
- 2.7 填充自定义的关键值策略(IdType.INPUT)
- 2.8 动态表名-根据参与决定执行哪个表-会影响手写表SQL语句且手写SQL记得写表别名 - 手写SQL所有的表名都会通过这一层
-
- 内置SQL
- 手写SQL - 因为动态表单插件只改变动态表单插件,所以必须起表别名from表名,where属性的表名不会改变
- 2.9 多租户 - 手写SQL所有的表名都会通过这一层 - 加上主表的租户字段where上面,加上连表租户字段on上
- 2.10 枚举@EnumValue
- 2.11 类型处理器BaseTypeHandler - 必须开启TableName.autoResultMap=true
- 2.12 连表自定义SQL - 配合wrapper使用
1. 使用和配置简单 - 带分页配置
pom.xml - 依赖
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <scope>runtimescope> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> dependency> <dependency> <groupId>com.baomidougroupId> <artifactId>mybatis-plus-boot-starterartifactId> <version>3.3.2version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-devtoolsartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> <exclusions> <exclusion> <groupId>org.junit.vintagegroupId> <artifactId>junit-vintage-engineartifactId> exclusion> exclusions> dependency> dependencies>
application.yml
spring:
application:
name: mybatisplusStudy
datasource:
data-password: root
password: root
username: 123456
url: jdbc:mysql://localhost:3306/interview?serverTimezone=UTC&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
server:
servlet:
context-path: /mybatisplus
port: 80
mybatis-plus:
# mapper文件的位置
mapper-locations: classpath:/mappers/*Mapper.xml
# 哪个包下的类名可以在mapper文件中不用写全限定名,写类名即可
type-aliases-package: top.linruchang.mybatisplusstudy.dto
configuration:
# 默认true - 数据库字段名 与 JavaBean属性名的对应关系
# 查询数据库时
# 1. true 数据库字段名中的下划线去掉并toUpperCase = JavaBean属性名.toUpperCase
# 2. false 数据库字段名.toUpperCase = JavaBean属性名.toUpperCase
# update、set数据库时
# 1. true 只要是驼峰的JavaBean字段,会将驼峰的大写字母 变成 _小写字母
# 2. false 数据库字段 = JavaBean属性字段
map-underscore-to-camel-case: false
#打印SQL日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# @FieldId 默认类型为自增长
id-type: auto
# @TableName如果要使用需要设置@TableName的属性是keepGlobalPrefix为true
table-prefix: test_
MyConfig.java - 使MyBatis-plus分页起效
@Configuration
public class MyConfig {
@Bean
public PaginationInterceptor getPaginationInterceptor() {
return new PaginationInterceptor();
}
}
BaseDTO.java、ClassType.java
@Data
public class BaseDTO {
@TableId(type=IdType.AUTO)
Integer id;
}
@TableName("class_type")
@Data
@Builder
public class ClassType extends BaseDTO {
@TableField("classNo")
Integer classNo;
@TableField("description")
String description;
}
ClassTypeDao.java
@Mapper
public interface ClassTypeDao extends BaseMapper<ClassType>{
}
测试
@SpringBootTest
class SpringbootMybatisplusApplicationTests {
@Autowired
ClassTypeDao classTypeDao;
@Test
public void test2() {
IPage<ClassType> classTypeIPage = classTypeDao.selectPage(new Page<>(1, 1), new QueryWrapper<ClassType>().gt("id", 0));
List<ClassType> records = classTypeIPage.getRecords();
records.forEach(System.out::println);
}
}
2. 用法
2.0 Wrapper属性
# wrapper.getSqlSegment() === 无where关键字
(sys_user.id LIKE #{ew.paramNameValuePairs.MPGENVAL1} AND friendly_link.name = #{ew.paramNameValuePairs.MPGENVAL2} OR nick_name LIKE #{ew.paramNameValuePairs.MPGENVAL3})
# wrapper.wrapper.getCustomSqlSegment() === 有where关键字
WHERE (sys_user.id LIKE #{ew.paramNameValuePairs.MPGENVAL1} AND friendly_link.name = #{ew.paramNameValuePairs.MPGENVAL2} OR nick_name LIKE #{ew.paramNameValuePairs.MPGENVAL3})
# wrapper.getTargetSql() == 带问号参数sql非mybatis的手写sql == 即JDBC形式的SQL
(sys_user.id LIKE ? AND friendly_link.name = ? OR nick_name LIKE ?)
2.1 @TableId - 自定义主键生成策略
@TableName("student")
public class Student {
//如果数据库该表的主键不是自增长,且不能为null,则用实体类插入数据到数据库时主键必须有值,否则报错
@TableId(type=IdType.INPUT)
Integer id;
}
2.2 @TableField - 自定义字段值填充
实现填充处理器MetaObjectHandler
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("插入操作。。。。。。。。。。。。");
this.setInsertFieldValByName("updateTime", new Date(), metaObject);
this.setInsertFieldValByName("createTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("更新操作。。。。。。。。。。。。");
this.setInsertFieldValByName("updateTime", new Date(), metaObject);
}
}
添加填充注解属性
@TableName("student")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends BaseDTO {
@TableField("name")
String name;
@TableField("sport")
String sport;
//FieldFill.DEFAULT默认填充不进行处理
@TableField(value="create_time", fill = FieldFill.INSERT)
Date createTime;
@TableField(value="update_time", fill = FieldFill.INSERT_UPDATE)
Date updateTime;
}
测试
@Test
public void test7() {
Student student = new Student();
student.setId("fbc629c6703f0d8188476feb33c1f41f");
student.setName("ewoi");
student.setSport("8764431");
int flag = studentDao.updateById(student);
System.out.println(flag);
}
2.3 锁 - 乐观锁、悲观锁
2.3.1 @Version - 乐观锁
开启乐观锁SQL拦截器
@Configuration
@EnableTransactionManagement
public class MyConfig {
@Bean
public OptimisticLockerInterceptor getOptimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
添加字段version字段
@Data
public class BaseDTO {
@TableId(type=IdType.UUID)
String id;
//乐观锁注解开启
@Version
Integer version;
}
@TableName("student")
@Data
@ToString(callSuper=true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends BaseDTO {
@TableField("name")
String name;
@TableField("sport")
String sport;
@TableField(value="create_time", fill = FieldFill.INSERT)
Date createTime;
@TableField(value="update_time", fill = FieldFill.INSERT_UPDATE)
Date updateTime;
}
测试
@Test
public void test8() {
Student student = studentDao.selectById("fsfsd");
System.out.println(student);
student.setSport("做爱做的侍寝111");
studentDao.updateById(student);
student = studentDao.selectById("fsfsd");
System.out.println(student);
}
2.4 DML、DQL操作
实体类Student以及与该表交互的StudentDao
@Data public class BaseDTO { @TableId(type=IdType.UUID) String id; } @TableName("student") @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Student extends BaseDTO { @TableField("name") String name; @TableField