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 ):无状态
如果变量在数据库中没有对应字段
- transient标识 的成员变量不参与序列化构成
private transient String remark;
- 用 static 但是需要手动生成 get set 方法
private static String remark;
public static String getRemark() {
return remark;
}
public static void setRemark(String remark) {
User.remark = remark;
}
- 注解 @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 = ?