MybatisPlus基础篇学习笔记(三)------基本使用

原创:兜里的猫

本章目录

  • 数据库导入数据
  • 创建对应类(为学习MP做准备)
  • 通用mapper的使用
  • 常用注解
  • 排除非表字段的三种方式

1. 数据库导入数据

//创建member成员表
DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (
  `id` bigint(20) NOT NULL COMMENT '用户ID',
  `name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) DEFAULT NULL COMMENT '用户密码',
  `state` int(10) DEFAULT NULL COMMENT '用户状态',
  `super_id` bigint(20) DEFAULT NULL COMMENT '上级id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

//插入数据
INSERT INTO `member` VALUES ('1', '张三', '123456', '1', '0', '2019-12-19 10:14:35');
INSERT INTO `member` VALUES ('2', '李四', '123456', '1', '1', '2019-12-19 10:15:15');
INSERT INTO `member` VALUES ('3', '王五', '123456', '2', '1', '2019-12-19 10:15:28');
INSERT INTO `member` VALUES ('4', '刘六', '123456', '2', '1', '2019-12-19 10:15:31');
INSERT INTO `member` VALUES ('5', '田七', '1234', '1', '1', '2019-12-19 16:35:39');

2. 创建对应类

创建entity、dao、controller类以及需要用到的简单封装的接口统一返回工具类ResultUtil,因为该项目是学习项目故不加service层,直接controller调用dao,能够演示MP的使用即可。

dao中的MemberMapper extends BaseMapper即可。

Result类以及ResultUtil类代码如下:

/**
 * http请求返回的最外层对象 Result.java
 */
public class Result<T> {
	/** 错误码. */
	private Integer code;

	/** 提示信息. */
	private String msg;

	/** 具体的内容. */
	private T data;

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

}

/**
 * 接口统一返回json格式数据 Resultutil.java
 *   {
 *      "code": 200,
 *      "msg": "成功",
 *      "data": { }
 *   }
 */
public class ResultUtil {

    public static Result success(Object object) {
        Result result = new Result();
        result.setCode(200);
        result.setMsg("成功");
        result.setData(object);
        return result;
    }

    public static Result success() {
        return success(null);
    }

    public static Result error(Integer code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

3. 通用mapper的使用

我这里只操作insert方法来简单演示通用mapper的使用,其他方法类似(从中我们可以看出==使用MP进行简单的CRUD无需编写sql,因为MP已经内置了基本的CRUD方法可供我们直接调用==):

@RestController
public class InsertMember {

    @Autowired
    private MemberMapper memberMapper;

    @RequestMapping("/insertOne")
    public Result insertOne() {
        Member member = new Member();
        member.setId(7);
        member.setName("田七2");
        member.setPassword("12342");
        member.setState(1);
        member.setSuperId(1);
        member.setCreateTime(LocalDateTime.now());
        memberMapper.insert(member);

        return ResultUtil.success(member);
    }
}

启动项目,使用postman进行接口测试:

image

查看数据库,添加成功。

image

4. 常用注解

@TableName("sys_member"):当数据库表名和实体类名不一致的时候,在实体类上使用该注解将表与实体类绑定(还有全局配置表前缀的方式在以后文章中会介绍到);

@TableId:MP默认表字段主键为id,若实体类中的主键名不为id,则在该属性加上此注解,让MP识别到我们的主键;

@TableField("name"):除主键以外的其他属性值,若与数据库表中字段名不一致可在属性上使用此注解跟表字段进行映射;

5. 排除非表字段的三种方式

有些项目开发中要求实体类中存在不与表中任何一个字段对应的属性,这些属性只是用于临时保存一些组装的数据等操作,类似于以前的dto类(组合多表联查的结果组装类),应项目开发场景的需求而定。

下面以我演示的数据库表,使用三种方式来解决此问题:

image

image

从图中我们可以对比看出Member中多了个Email属性,是用于临时保存Email信息,并不添加到数据库表中。若不加任何代码直接使用该实体类,数据库会出错,提示表中没有Email该字段,排除该字段有以下方式:

  • private ==transient== String Email:使用transient标识的成员变量不参与序列化过程,但有些项目中需要序列化,所以该方法不推荐使用;

  • private ==static== String Email: 使用static关键字将该属性变为静态变量,同时需要手动添加get/set方法,该方法使得Email属性成为实体类共享属性,每个该类对象中的Email属性值都一样,但有些项目需要每个该类对象中都有各自的Email属性值,这时候该方法就不可用了;

  • @TableField(exist = false):使用MP提供的注解,在该属性上加上此注解,即可解决第二种方法存在的问题,exist默认为true表示该属性在数据库表中存在对应字段,exist=false表示该属性不与表字段进行对应,在操作数据库的时候会忽略该字段。

欢迎大家指正本文中的错误并交流,感谢大家支持,希望与你们一同进步!


评论

稻城 : 111
兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×