您现在的位置是:首页 >其他 >Java工程引入MybatisPlus插件处理持久化网站首页其他
Java工程引入MybatisPlus插件处理持久化
简介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的持久化操作,好了,有不对之处欢迎拍砖指点... 晚安;
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。