20191209-mybatisplus(一)

什么是mybatispuls

MyBatis-Plus(简称 MP)是一个 MyBatis 的 增强工具 ,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。

@MapperScan

  • 指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
  • 添加在springboot启动类上
@SpringBootApplication
@MapperScan("com.mp.dao")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

添加@MapperScan(“com.mp.dao”)注解以后,com.mp.dao包下面的接口类,在编译之后都会生成相应的实现类

  • 可以使用@MapperScan注解多个包
@MapperScan({"com.mp.dao","com.mp.user"})  
  • 如果mapper类没有在SpringBoot主程序可以扫描的包或者子包下面,可以使用如下方式进行配置
@MapperScan({"com.mp.*.mapper","org.mp.*.mapper"})  

@Mapper

  • 在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
  • 添加在接口上
@Mapper
public interface UserMapper extends BaseMapper<User> {

}

如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解, 可以直接使用一个@MapperScan

在实体类和表信息出现不对应的时候使用的注解

注解 说明
@TableName 实体类与表名不一致
@TableId 实体类的主键名称和表中主键名称不一致
@TableField 实体类中的成员名称和表中字段名称不一致
@Data
@TableName("mp_user")
public class User {
    //主键
    /**
     * mybatisplus默认主键叫id
     *  @TableId
     */
    @TableId
    private Long userId;
    //姓名
    /**
     *  @TableField("name") 直接指定在数据库中对应哪一列
     */
    @TableField("name")
    private String realName;
    //年龄
    private Integer age;
    //邮箱
    private String email;
    //直属上级
    private Long managerId;
    //创建时间
    private LocalDateTime createTime;

}

@TableId

  • @TableId(value = “id”, type = IdType .AUTO ):数据库自增

  • @TableId(value = “id”, type = IdType .ID_WORKER_STR ):分布式全局唯一ID字符串类型

  • @TableId(value = “id”, type = IdType .INPUT ):自行输入

  • @TableId(value = “id”, type = IdType .ID_WORKER ):分布式全局唯一ID 长整型类型

  • @TableId(value = “id”, type = IdType .UUID ):32位UUID字符串

  • @TableId(value = “id”, type = IdType .NONE ):无状态

如果变量在数据库中没有对应字段

  1. transient标识 的成员变量不参与序列化构成
  private transient String remark;
  1. static 但是需要手动生成 get set 方法
  private static String remark;

  public static String getRemark() {
     return remark;
  }
  public static void setRemark(String remark) {
     User.remark = remark;
  }
  1. 注解 @TableField
  @TableField(exist = false)
  private String remark;
  • @TableField( exist = false ):表示该属性不为数据库表字段,但又是必须使用的。

  • @TableField( exist = true ):表示该属性为数据库表字段。

  • @TableField( condition = SqlCondition.LIKE ):表示该属性可以模糊搜索。

  • @TableField( fill = FieldFill.INSERT ):字段自动填充策略

FieldFill

描述
DEFAULT 默认不处理(fill 默认值)
INSERT 插入时填充字段
UPDATE 更新时填充字段
INSERT_UPDATE 插入和更新时填充字段

CRUD

通用 CRUD 封装 BaseMapper接口 ,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器

BaseMapper中封装了很多关于增删该查的方法,后期自动生成,我们直接调用接口中的相关方法即可完成相应的操作

Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能

public interface UserMapper extends BaseMapper<User> {
}
  • 简单插入一条数据
    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

mybatisplus 默认填充基于 雪花算法 的默认id

在mp中的实例对象的属性值如果为 null 那mp的insert和update方法时数据库的 相应列就不会出现在sql语句中


@RunWith(SpringRunner.class)
@SpringBootTest
public class InsertTest {
    @Resource
    private UserMapper userMapper;
    @Test
    public void insert(){
        User user=new User();
        user.setRealName("144444");
        user.setAge(25);
        user.setEmail("[email protected]");
        user.setManagerId(1088248166370832385L);
        user.setCreateTime(LocalDateTime.now());
        user.setRemark("我是一个备注信息哦");
        int rows=userMapper.insert(user);
        System.out.println("影响记录数:"+rows);
    }
}

=》 INSERT INTO user ( id, create_time, name, manager_id, age ) VALUES ( ?, ?, ?, ?, ? )

  • MapperCRUD 接口查询

泛型 T 为任意实体对象

参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键

 /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);
/----------------------------------------------------------------------------------------------------------/
 @Test
    public void select() {
        User user=userMapper.selectById(1094590409767661570L);
        System.out.println(user);
    }

=> SELECT id,create_time,name,manager_id,email,age FROM user WHERE id=?

 /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/----------------------------------------------------------------------------------------------------------/
    @Test
    public void selectIds() {
        List<Long> idsList=Arrays.asList(1094592041087729666L,1088250446457389058L,1088248166370832385L);
        List<User> userList=userMapper.selectBatchIds(idsList);
        userList.forEach(System.out::println);
    }

= > SELECT id,create_time,name,manager_id,email,age FROM user WHERE id IN ( ? , ? , ? )

 /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/----------------------------------------------------------------------------------------------------------/
    @Test
    public void selectByMap() {
        //map.put("name","王天风")
        //map.put("age","30)
        //where name="王天风" and age=30;
        Map<String,Object> columnMap=new HashMap<>();
        //columnMap.put("name","王天风");
        /**
         * key是数据库中的列名!!!不是实体中的属性名
         */
        columnMap.put("age",32);
        List<User> userList=userMapper.selectByMap(columnMap);
        userList.forEach(System.out::println);
    }

=> SELECT id,create_time,name,manager_id,email,age FROM user WHERE age = ?

猜你喜欢

转载自blog.csdn.net/fggsgnhz/article/details/103537607
今日推荐