都说程序员的终极目标就是偷懒,虽然mybatis已经给开发带来很大便利,example类也有很多强大的功能,但是还是满足不了"勤劳"的程序员们。因此国内程序员在 Mybatis 的基础上开发了Mybatis Plus,只做增强不做改变,只为简化开发、提高效率而生。
有头有尾,我们就从新建项目开始吧:
Default和Customer按照网络情况,哪个进得去进哪个。点击Next
上下红框内名字一般保持一致 ,next
选择需要添加的依赖:
DevTools 热部署工具。Lombok:在实体类添加注解可自动生成set get tostring等代码
web项目必选
Thymeleaf一个模板引擎,类似jsp
开启自动导入
等待下载依赖。。。
项目初始化创建完成。
1、pom文件导入jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
2、编写配置文件(数据库配置)
3、entity包下新建一个user类,使用@Data注解自动添加set get方法
4、创建mapper接口,继承BaseMapper,传入一个需要操作的泛型。
开启mapper包的扫描,注入到spring中
创建一个测试类
简单测试一个查询
如果需要在控制台查看执行的sql语句,配置文件添加:
常用注解:
1、@TableName 映射数据库的表名
该demo中如果实体类不叫User是UserInfo,则改为
2、@TableField 映射数据表非主键字段名,
exist表示是否为数据表字段 false,true
select表示是否查询该字段
fill表示是否自动填充,将对象存入数据库的时候,由Mybatis Plus自动给某些字段赋值。
(如时间create_time,update_time)
1、数据库添加该字段
2、实体类添加fill注解
3、编写Handler类,声明@Component
3、@TableId 设置主键映射,value映射主键字段名
type 设置主键类型(主键的生成策略,自增?某种算法生成?)默认NONE(雪花算法实现)
Input 如果开发人员没有赋值,则采用数据库自增的方式赋值
4、@Version 标记乐观锁(处理并发,防止数据被两个线程修改):通过version字段,当数据修改时,会以version作为条件 当条件成立才会成功
version=1 (如下两线程互斥)
线程1:update ...set version = 2 where version = 1
线程2:update .. set version = 2 where version = 1
1.数据库添加version字段:默认为1
2.实体类添加version成员变量,并且添加Version注解
3.编写并注册配置类
4.测试
此时乐观锁version将会修改
5、@EnumValue 通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量
方法一使用注解,
方法二 实现接口 implement IEnum<Integer> 返回Integer code
1.User表添加status字段,设置默认值为1
2.编写枚举类,使用该注解
3.UserInfo类中添加该枚举
4.application.yml中添加
5.查询所有测试
6、@TableLogic 映射逻辑删除(假的删掉,如用户注销,并不是真正从数据库删除,而是设定一个标志字段)
1.User数据表添加deleted字段,默认为0 为没有删除
2.实体类添加注解
3.application.yml添加配置:
4.测试删除
再次执行查询将不再被显示deleted=1的信息
增删改查
条件查询
模糊查询
联合查询
排序
分页查询
1.添加配置
2.测试 current 当前页,size 每页数
注:逻辑删除deleted字段标记为1的依然不会被查到
查询一条数据:
自定义sql(注解版)多表关联查询
sql语句如下:
1.创建一个VO类
2.mapper文件添加方法
3.测试
自定义sql(xml) + 分页查询
1.Test
2.mapper里添加方法,注意 @Param(Constants.WRAPPER)
3.编写xml文件
4.测试查询
自定义sql(xml) + 分页查询 + 多表查询(一对多)
SELECT q.id, q.title,u.id uid , u.name from question q, user u
WHERE
q.creator = 220 AND u.id = 220
1.定义个VO类存储查询结果
2.Test
3.mapper里添加方法,注意 @Param(Constants.WRAPPER)
4.xml文件
5.测试
插入
删除
修改
自动生成
根据数据表自动生成实体类、Mapper,Service,ServiceImpl,Controller(比mybatis逆向工程强大?)
1、pom文件导入Mybatis Plus Generator和velocity(根据velocity模板生成,还有freemarker、Beetl)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
2、启动类
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class Main {
public static void main(String[] args) {
//创建generator对象
AutoGenerator autoGenerator =new AutoGenerator();
//数据源
DataSourceConfig dataSourceConfig =new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/wlbnew?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("root");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
autoGenerator.setDataSource(dataSourceConfig);
//全局配置
GlobalConfig globalConfig =new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
//创建好之后打开文件
globalConfig.setOpen(false);
globalConfig.setAuthor("Jesse");
globalConfig.setServiceName("%sService");
autoGenerator.setGlobalConfig(globalConfig);
//包信息
PackageConfig packageConfig =new PackageConfig();
packageConfig.setParent("com.example.demo");
packageConfig.setModuleName("generator");
packageConfig.setController("controller");
packageConfig.setService("service");
packageConfig.setServiceImpl("service.impl");
packageConfig.setEntity("entity");
packageConfig.setMapper("mapper");
autoGenerator.setPackageInfo(packageConfig);
//配置策略
StrategyConfig strategyConfig =new StrategyConfig();
strategyConfig.setEntityLombokModel(true);
//开启字段驼峰命名
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
autoGenerator.setStrategy(strategyConfig);
autoGenerator.execute();
} }
运行main方法生成。
最后别忘记在DemoApplication添加MapperScan("com.example.demo.generator.mapper")扫描mapper,根据实际包名修改。
如果没有开启驼峰命名,再加
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
这种生成方式会在Service名前加字母"I",如果想去掉,全局配置加:
globalConfig.setServiceName("%sService");
测试:
1、controller添加一个方法
2、application.yml配置thymeleaf
3、templates下新建一个index.html
按条件查询