您现在的位置是:首页 >其他 >Java工程引入MybatisPlus插件处理持久化网站首页其他

Java工程引入MybatisPlus插件处理持久化

shenzhenNBA 2024-08-18 12:01:02
简介Java工程引入MybatisPlus插件处理持久化

MybatisPlug在DB持久化过程中,可以减少编写或不编写对应的XML,更多以Java方式完成DB持久化操作,故Java工程引入MybatisPlug非常好的开发方式,注意同时兼容原有写XML的方式,满足复杂SQL操作要求,Java工程引入MybatisPlug插件的步骤大致如下:

1,工程引入相关Jar依赖

<!--mysql数据库的链接依赖-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.23</version>
</dependency>

<!--mybatis的基础starter依赖-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.0</version>
</dependency>

<!--mybatis的plug插件starter和分页功能依赖-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.3.4</version>
</dependency>

<!--mybatis的plug插件generate依赖-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-generator</artifactId>
	<version>3.5.1</version>
</dependency>

<!--lombok用来简化实体类-->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.12</version>
</dependency>

<!--logback日志依赖-->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.3</version>
</dependency>

2,部分配置文件设置

#其它配置内容省略...
mybatis-plus:
  # mybatis用到的支持类所在的包,根据自己情况相应修改
  type-handlers-package: com.xxx.yyy.kkk
  mapper-locations: classpath*:com/**/mapping/*.xml,classpath*:/mapping/*.xml
  typeAliasesPackage: com.**.model,com.aaa.**.model
  # 枚举注入,方便类里面直接使用枚举属性
  typeEnumsPackage: com.common.constant.enums
  # 项目启动会检查xml配置存在(一般只在开发时打开,当不需要xml时应设为false)
  check-config-location: false
  # 允许在resulttype="map"时映射null值
  call-setters-on-nulls: true
  #开启驼峰命名法
  configuration:
    map-underscore-to-camel-case: true

3,表定义

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`  (
  `id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
  `user_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编码',
  -- 其它字段省略,以下为通用字段
  `creator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '创建者',
  `creator_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '创建编码',
  `create_time` TIMESTAMP NULL COMMENT '创建时间',
  `updater_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '更新者',
  `updater_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '更新编码',
  `update_time` TIMESTAMP NULL COMMENT '更新时间',  
  PRIMARY KEY (`id`) USING BTREE,
  unique key uk_user_code(user_code)
) ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=Dynamic;

4,定义某表对应的Java实体Bean

// 变量命名应该按驼峰格式
@TableName(value="my_tb_user", autoResultMap=true)
public class User extends BaseModel {

	@ApiModelProperty(value="记录唯一ID")
	@Tableld(value="id", type=IdType.AUTO)
	private Long id;
	
	@ApiModelProperty(value="用户名称")
	@TableField(value="user_name",jdbcType=JdbcType.VARCHAR) 
	private String userName;

	@ApiModelProperty(value="用户编码")
	@TableField(value="user_code") //typeHandler=xxx.class
	private String userCode;
	
	@ApiModelProperty(value="城市")
	@TableField(value="city") 
	private String city;
	
	@ApiModelProperty(value="用户年龄")
	@TableField(value="age") 
	private Integer age;
	
	@ApiModelProperty(value="备注")
	// 实体里面加入一个表里面不存在的字段时可以使用如下注解,方便Java中使用
	@TableField(exist=false) 
	private String mark;
	
	
	//...TODO...其它字段省略...
}
// 通用字段类
public class BaseModel {
	// 变量命名应该按驼峰格式, 对应表字段creator_name
	@ApiModelProperty(value="创建者名称/昵称")
	private String creatorName;
	
	@ApiModelProperty(value="创建唯一编码")
	private String creatorCode;
	
	@ApiModelProperty(value="创建时间")
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
	private String createTime;
	
	@ApiModelProperty(value="更新者名称/昵称")
	private String updaterName;
	
	@ApiModelProperty(value="更新者唯一编码")
	private String updaterCode;
	
	@ApiModelProperty(value="更新时间")
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
	private String updateTime;
}

5,持久化接口Dao层或Mapper层继承MybatisPlus的基础接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
	// BaseMapper为mybatisplus的基础接口
	// 注意,还可以继续编写UserMapper.xml的方式使用
	// mybatis的,满足复杂的SQL的操作需要
	
	List<User> queryUserList(@Param("map") List<String> userIds);
}

6,在Service层中使用MybatisPlus方式的DB持久化


@Autowired
private UserMapper userMapper;

// 查询方式
public IPage queryByParam(UserReq req) {
	//UserReq, UserResp为查询入参对象,定义省略
	QueryWrapper<User> queryWrapper = new QueryWrapper<>(); //可以,但不推进
	LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); //推荐,更好
	queryWrapper.eq(User::getUserCode, req.getUserCode()); // 等于
	queryWrapper.ne(User::getAge, 20); // 不等于
	queryWrapper.ge(User::getAge, req.getAge()); //大于等于
	queryWrapper.le(User::getAge, req.getAge()); //小于等于
	queryWrapper.like(User::getUserName, req.getUserName()); // 模糊匹配
	// ... and (city = 'xxx' or userName like '%yyy%') 形式
	queryWrapper.and(qw -> {
		qw.eq(User::getCity, req.getCity()).or()
		.like(User::getUserName, req.getUserName());
	});
	queryWrapper.orderByDesc(User::getId);
	
	// 查询所有符合条件记录
	List<User> userRecords = userMapper.selectList(queryWrapper);
	
	// 分页查询,对象转换
	IPage page = new Page<>(req.getPageNum(), req.getPageSize());
	page = userMapper.selectPage(page, queryWrapper);
	List<User> userList = page.getRecords();
	List<UserResp> respList = userList.stream().map(u -> {
		UserResp resp = new UserResp();
		BeanUtils.copyProperties(u, resp);
		return resp;
	}).collect(Collectors.toList());
	page.setRecords(respList);
	return page;
}
// 新增
public int createUser(User user){
	// TODO...参数和存在性检查省略...
	int num = userMapper.insert(user);
	return num;
}
// 修改
public int updateUser(User user){
	// TODO...参数和存在性检查省略...
	// 推荐,LambdaUpdateWrapper对象
	LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
	updateWrapper.eq(User::getUserCode, user.getUserCode())
	.set(User::getAge, user.getAge)
	.set(User::updateTime, new Date());
	int num = userMapper.update(null, updateWrapper);
	return num;
	
	// 可以,但不推荐,JavaBean和 LambdaQueryWrapper 对象
	LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
	queryWrapper.eq(User::getUserCode, user.getUserCode());
	int num2 = userMapper.update(user, queryWrapper);
	return num2;
}
// 删除
public int deleteUser(User user) {
	// TODO...参数检测省略...
	LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
	queryWrapper.eq(User::getUserCode, user.getUserCode());
	int num = userMapper.delete(queryWrapper);
	return num;
}

7,当CURD时对公共字段的统一处理,
为避免重复对通用字段的处理,故对BaseModel类的creatorName,creatorCode,createTime,
updaterName,updaterCode,updateTime通用字段做统一处理,

public class MybatisObjectHandler implements MetaObjectHandler {

	@Autowired
	private UserService userService; //定义省略 
	
	// 新增操作
	@Override
	public void insertFill(MetaObject metaObject){
		this.setFieldValByName("createTime", LocalDateTime.now, metaObject);
		this.setFieldValByName("updateTime", LocalDateTime.now, metaObject);
		String opUserName = "system";
		String opUserCode = "system";
		//BaseContect 存储登陆用户信息,应在登陆时处理或设置
		if (BaseContect.isLogin) { 
			opUserName = BaseContect.getUserName;
			opUserCode = BaseContect.getUserCode;
		}
		this.setFieldValByName("creatorName", opUserName, metaObject);
		this.setFieldValByName("creatorCode", opUserCode, metaObject);
		this.setFieldValByName("updaterUser", opUserName, metaObject);
		this.setFieldValByName("updaterCode", opUserCode, metaObject);	
	}

	// 更新操作
	@Override
	public void updateFill(MetaObject metaObject){
		this.setFieldValByName("updateTime", LocalDateTime.now, metaObject);
		String opUserName = "system";
		String opUserCode = "system";
		//BaseContect 存储登陆用户信息,应在登陆时处理或设置
		if (BaseContect.isLogin) { 
			opUserName = BaseContect.getUserName;
			opUserCode = BaseContect.getUserCode;
		}
		this.setFieldValByName("updaterUser", opUserName, metaObject);
		this.setFieldValByName("updaterCode", opUserCode, metaObject);
	}
}

8,启动类

@SpringBootApplication
@MapperScan("com.xx.yyy.mapper") // 扫描xxxMapper.java所在的包
public class MyDemoApplication {

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

}

大致这些步骤,上面是一些伪代码,但已经显示如何向一个Java工程中引入mybatis plus 插件,以减少或没有 xml 的方式,直接以Java代码方式进行DB的持久化操作,好了,有不对之处欢迎拍砖指点... 晚安;

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。