Mybatis plus

mybatisplus

MyBatis Plus

国产的开源框架、基于Mybatis、简化Mybatis开发、提高效率

spirng boot 整合 MyBatis

  • pom
1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
  • pojo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Data
@TableName(value = "user")
public class User {

@TableId(value = "id",type = IdType.AUTO)
private Long id;

@TableField(value = "name")
private String name;

private Integer sex;

private Integer age;

@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;

@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

}
  • Mapper
1
2
3
public interface UserMapper extends BaseMapper<User> {

}
  • 启动类
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@MapperScan("com.dream.xiaobo.mapping")
public class MybatisplusApplication {

public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}

}
  • test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@SpringBootTest
class UserMapperTest {

@Autowired
private UserMapper userMapper;

@Test
void test(){
userMapper.selectList(null).forEach(System.out::println);
}

@Test
void save(){
User user = new User();

user.setName("小博");
user.setSex(0);
user.setAge(21);

userMapper.insert(user);

}

@Test
void update(){
User user = userMapper.selectById(17);
System.out.println(user);
user.setName("wangyibo");
user.setSex(1);
user.setAge(22);
userMapper.updateById(user);
}
}

注解剖析

  • @TableName

映射数据库表名

  • @TableId
    主键映射
  • value属性

映射字段名

  • type属性

设置主键类型

描述
AUTO 数据库自增
NONE set一个主键值、用雪花算法实现的
INPUT 需要开发者手动赋值
ASSIGN_ID 自动分配ID、Long、Integer、String
ASSIGN_UUID 分配UUID、数据类型必须是String类型
  • @TableField

映射非主键字段

  • exist属性

设置是否为数据库字段名、true OR false

  • select属性

表示是否查询该字段

  • fill属性

表示是否自动填充
值:
INSERT
INSRT_UPDATE
UPDATE
DEFAULT

创建时间和更新时间自动填充演示

  • Handler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}

@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
  • @Version

标记乐观锁、通过数据库添加version字段、设置个默认值来保护数据安全性、当修改数据时、用version作为条件、当条件成立时方可修改

  • pojo
1
2
3
@TableField(value = "version")
@Version
private Integer version;
  • config
1
2
3
4
5
6
7
8
9
@Configuration
public class MyBatisPlusConfig {

@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){

return new OptimisticLockerInterceptor();
}
}
  • test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
void update(){
User user = userMapper.selectById(17);
user.setName("wangxiaobo");
user.setSex(0);
user.setAge(22);

User user1 = userMapper.selectById(17);

user1.setName("hhh");

userMapper.updateById(user1);

userMapper.updateById(user);

}

@EnumValue实现显示数据转换

通过枚举注解方式

  • enum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum StatusEnum {

工作(1,"工作"),
休息(0,"休息");

StatusEnum(Integer code,String msg){
this.code = code;
this.msg = msg;
}

@EnumValue
private Integer code;

private String msg;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum SexEnum {

男(1,"男"),
女(0,"女");

@EnumValue
private Integer code;
private String msg;

SexEnum(Integer code, String msg){
this.code = code;
this.msg = msg;
}

}
  • pojo
1
2
3
4
5
@TableField(value = "sex")
private SexEnum sex;

@TableField(value = "status")
private StatusEnum status;
  • application.yml
1
2
3
mybatis-plus:
# 扫描enum
type-enums-package: com.dream.xiaobo.enums

实现接口方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public enum SexEnum implements IEnum<Integer> {

男(1,"男"),
女(0,"女");

private Integer code;
private String msg;

SexEnum(Integer code, String msg){
this.code = code;
this.msg = msg;
}

@Override
public Integer getValue() {
return this.code;
}
}

Mybatis Plus 增删改查

SELECT

基本查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
@Test
void select(){

//查询全部
userMapper.selectList(null).forEach(System.out::println);

//创建操作对象
QueryWrapper queryWrapper = new QueryWrapper();

//创建Map集合
Map<String,Object> map = new HashMap<>();
map.put("age",21);
map.put("name","xiaobo");
//将Map放入操作对象中
queryWrapper.allEq(map);
//模糊查询
queryWrapper.likeLeft("name","x");
//模糊查询
queryWrapper.likeRight("name","x");
//等值查询
queryWrapper.eq("age",21);

//子查询
queryWrapper.inSql("id","SELECT id FROM user WHERE id < 12");
queryWrapper.inSql("age","SELECT age FROM user WHERE age < 30");

//升降序
queryWrapper.orderByAsc("age");
queryWrapper.orderByDesc("id");

//打印查询结果
userMapper.selectList(queryWrapper).forEach(System.out::println);

根据Id查询
userMapper.selectBatchIds(Arrays.asList(1,2,3,4)).forEach(System.out::println);

Map<String,Object> map = new HashMap<>();
map.put("name","xiaobo");
//Map 只能做等值判断、逻辑判断需要使用 queryWrapper 来处理
userMapper.selectByMap(map).forEach(System.out::println);

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("age",21);
//查询结果数量
System.out.println(userMapper.selectCount(queryWrapper));


//分页查询
Page<User> page = new Page<>(1,3);
Page<User> result = userMapper.selectPage(page, null);
System.out.println(result.getSize());
System.out.println(result.getTotal());
System.out.println(result.getCurrent());

result.getRecords().forEach(System.out::println);


//将map放在Page里面
Page<Map<String,Object>> page = new Page<>(1,4);
userMapper.selectMapsPage(page,null).getRecords().forEach(System.out::println);
userMapper.selectObjs(null).forEach(System.out::println);

}

自定义查询

  • pojo
1
2
3
4
5
6
7
8
9
@Data
public class UserVO {

private String name;
private Integer age;
private String username;
private String password;

}
  • mapper
1
2
3
4
5
6
7
public interface UserMapper extends BaseMapper<User> {

@Select("SELECT u.id,username,password,name,age FROM user u,login l " +
"WHERE u.login_id = l.id AND u.id = #{id }")
List<UserVO> userVoList(Integer id);

}

INSERT

1
2
3
4
5
6
7
8
9
10
@Test
void save(){
User user = new User();

user.setName("小博");
user.setSex(SexEnum.男);
user.setAge(21);

userMapper.insert(user);
}

DELETE

1
2
3
4
5
6
7
@Test
void delete(){
// userMapper.deleteById(17);
Map<String,Object> map = new HashMap<>();
map.put("id",2);
userMapper.deleteByMap(map);
}

UPDATE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
void update(){
// User user = userMapper.selectById(17);
// user.setName("wangxiaobo");
// user.setSex(SexEnum.女);
// user.setAge(21);
// User user1 = userMapper.selectById(17);
// user1.setName("hhh");
// userMapper.updateById(user1);
// userMapper.updateById(user);


User user = userMapper.selectById(17);
user.setName("wangxiaobo");
user.setSex(SexEnum.男);

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("id",17);
userMapper.update(user,queryWrapper);
}

Mybatis Plus 自动生成

  • pom
1
2
3
4
5
6
7
8
9
10
11
<!--        Mybatis Plus 自动生成-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
  • 生成类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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/db_springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("xiaobo");
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("dream.xiaobo");
globalConfig.setServiceName("%sService");
autoGenerator.setGlobalConfig(globalConfig);
//包信息
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.dream.xiaobo.mybatisplus");
packageConfig.setModuleName("generator");
packageConfig.setController("controller");
packageConfig.setService("service");
packageConfig.setServiceImpl("service.impl");
packageConfig.setMapper("mapper");
packageConfig.setEntity("entity");
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();
}
}

正确的开始、微小的长进、然后持续、嘿、我是小博、带你一起看我目之所及的世界……

-------------本文结束 感谢您的阅读-------------

本文标题:Mybatis plus

文章作者:小博

发布时间:2021年07月29日 - 09:38

最后更新:2021年07月29日 - 09:41

原始链接:https://codexiaobo.github.io/posts/92906615/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。