欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

20191209-mybatisplus(一)

程序员文章站 2024-03-05 23:27:01
...

什么是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 = ?

相关标签: mybatisPlus

上一篇: Arrays

下一篇: 双向循环链表