MybatisPlus使用 2020-03-14 16:12 > Mybatis-Plus > > > > 版本: > > mybatis-plus-boot-starter 2.3 > > spring-boot-starter-parent 2.1.7.RELEASE ### 主键策略 MP支持多种主键策略,默认是推特的**雪花算法**,也可以设置其他策略。 MP的主键定义在一个枚举类中,源码(我添加了一些注释): ```java package com.baomidou.mybatisplus.enums; /** * <p> * 生成ID类型枚举类 * </p> * * @author hubin * @Date 2015-11-10 */ public enum IdType { AUTO(0, "数据库ID自增"), INPUT(1, "用户输入ID"), /* 以下2种类型、只有当插入对象ID 为空,才自动填充。 */ ID_WORKER(2, "全局唯一ID"), //类型: bigint(20)[字段]->Long[属性] UUID(3, "全局唯一ID"), NONE(4, "该类型为未设置主键类型"), ID_WORKER_STR(5, "字符串全局唯一ID"); private final int key;//主键 private final String desc;//描述 IdType(final int key, final String desc) { this.key = key; this.desc = desc; } public int getKey() { return this.key; } public String getDesc() { return this.desc; } //return ID_WORKER; 代表如果未显示设置主键生成策略,那么就使用ID_WORKER策略。 public static IdType getIdType(int idType) { IdType[] its = IdType.values(); for (IdType it : its) { if (it.getKey() == idType) { return it; } } return ID_WORKER; } } ``` #### 1,局部主键策略实现 在实体类中 ID属性加注解 ```java @TableId(type = IdType.AUTO) 主键自增 数据库中需要设置主键自增private Long id; @TableId(type = IdType.NONE) 默认 跟随全局策略走private Long id; @TableId(type = IdType.UUID) UUID类型主键private Long id; @TableId(type = IdType.ID_WORKER) 数值类型 数据库中也必须是数值类型 否则会报错private Long id; @TableId(type = IdType.ID_WORKER_STR) 字符串类型 数据库也要保证一样字符类型private Long id; @TableId(type = IdType.INPUT) 用户自定义了 数据类型和数据库保持一致就行private Long id; ``` #### 2,全局主键策略实现 需要在`application.yml`文件中,添加 ```yml mybatis-plus: mapper-locations: - com/mp/mapper/* global-config: db-config: id-type: uuid/none/input/id_worker/id_worker_str/auto # 表示全局主键都采用该策略(如果全局策略和局部策略都有设置,局部策略优先级高) ``` ## 两种CRUD玩法 ### 一、正常玩法 > 正常编写pojo,编写Mapper接口,然后将Mapper接口继承BaseMapper<T>,即可使用。 > > 注意:通用Mapper是继承Mapper<T>,这里是继承BaseMapper<T>。 #### pojo ```java package hx.insist.demo.pojo; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { @TableId(type = IdType.AUTO)//设置主键生成策略:自动增长。默认雪花生成uuid private Long id; private String userName; private String passWord; private Integer userSex; private String nickName; private Long dId; } ``` #### dao > UserMapper.java ```java package hx.insist.demo.dao; import com.baomidou.mybatisplus.mapper.BaseMapper; import hx.insist.demo.pojo.User; public interface UserMapper extends BaseMapper<User> { } ``` #### 测试 > UserMapperTest ```java package hx.insist.demo.dao; import com.baomidou.mybatisplus.mapper.Wrapper; import hx.insist.demo.pojo.User; import org.apache.ibatis.session.RowBounds; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Arrays; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testInsert(){ User u = new User(); u.setUserName("ttttt"); u.setPassWord("ttttt"); u.setUserSex(1); u.setNickName("ttttt"); userMapper.insert(u); userMapper.insert(u); userMapper.insert(u); } @Test public void testSearch(){ //传入条件构造器,不穿就查询全部 List<User> users = userMapper.selectList(null); for (User user : users) { System.out.println(user); } } @Test public void testSearchPage(){ List<User> userList = userMapper.selectPage(new RowBounds(1,3), new Wrapper<User>() { @Override public String getSqlSegment() { return null; } }); //传入条件构造器,不穿就查询全部 for (User user : userList) { System.out.println(user); } } @Test public void testDel(){ Integer integer = userMapper.deleteBatchIds(Arrays.asList(1, 5)); System.out.println(integer); } @Test public void testModify(){ User u = new User(); u.setId(4L); u.setNickName("222222222"); System.out.println(userMapper.updateById(u)); } } ``` ## 二、AR玩法 > 编写pojo类后,继承Model<T>,然后正常编写Mapper接口集成BaseMapper<T>,即可使用。 > > 比上一种玩法多了一步实体类继承Model<T>。 > > 但是这个玩的时候就不用操作Mapper接口了,直接使用实体类操作数据库。 ActiveRecord ---AR模式 实体类只需继承 Model 类即可实现基本 CRUD 操作。 一个实体类继承Model类,并通过注解与数据库的表名进行关联,这样就可以通过实体类直接进行表的简单增删改查操作。 #### pojo ```java package hx.insist.demo.pojo; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * ActiveRecord ---AR模式 * 实体类只需继承 Model 类即可实现基本 CRUD 操作 * 一个实体类继承Model类,并通过注解与数据库的表名进行关联,这样就可以通过实体类直接进行表的简单增删改查操作 */ @Data @AllArgsConstructor @NoArgsConstructor public class Department extends Model<Department> { @TableId(type = IdType.AUTO) private Long id; private String name; @Override protected Serializable pkVal() { return id; } } ``` #### dao ```java package hx.insist.demo.dao; import com.baomidou.mybatisplus.mapper.BaseMapper; import hx.insist.demo.pojo.Department; public interface DepartmentMapper extends BaseMapper<Department> { } ``` #### 测试 ```java package hx.insist.demo.dao; import com.baomidou.mybatisplus.plugins.Page; import hx.insist.demo.pojo.Department; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class DepartmentTest { @Test public void testadd(){ Department d = new Department(); d.setName("产品组"); d.insert(); d.setName("运营组"); d.insert(); d.setName("广告组"); d.insert(); d.setName("瞎几把组"); d.insert(); System.out.println("插入的主键:"+d.getId()); } @Test public void testdel(){ //两种方式 Department d = new Department(); d.setId(9L); System.out.println(d.deleteById()); //System.out.println(d.deleteById(10L));//true 删除0个,理论上说是成功执行 } @Test public void testModify(){ //两种方式 Department d = new Department(); d.setId(12L); d.setName("宣宣宣宣传组"); System.out.println(d.updateById()); //System.out.println(d.insertOrUpdate()); } @Test public void testsearchAll(){ Department d = new Department(); List<Department> list = d.selectAll(); for (Department department : list) { System.out.println(department); } } @Test public void testsearchPage(){ Department d = new Department(); //传入当前页,页面大小 Page<Department> page = d.selectPage(new Page<>(1, 2), null); List<Department> list = page.getRecords(); for (Department department : list) { System.out.println(department); } } } ``` --END--
发表评论