默认环境springboot,2.2.1.RELEASE,默认你已经完成了主启动类,并扫描了mapper包
1,首先配置日志,我们好查看sql执行
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2,编写实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
3,编写Mapper接口UserMapper.java
public interface UserMapper extends BaseMapper<User> {
}
一,插入操作
@RunWith(SpringRunner.class)
@SpringBootTest
public class CRUDTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setName("Helen");
user.setAge(18);
user.setEmail("55317332@qq.com");
int result = userMapper.insert(user);
System.out.println(result); //影响的行数
System.out.println(user); //id自动回填
}
}
二,重点,主键策略
(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
2)自增策略
要想主键自增需要配置如下主键策略
1,需要在创建数据表的时候设置主键自增
2,实体字段中配置 @TableId(type = IdType.AUTO)
3,最后注意:数据空中id要设置自增。
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
其它主键策略:分析 IdType 源码可知
@Getter
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID
* 该类型可以通过自己注册自动填充插件进行填充
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
private int key;
IdType(int key) {
this.key = key;
}
}
三、update
1、根据Id更新操作
@Test
public void testUpdateById(){
User user = new User();
user.setId(1L);
user.setAge(28);
int result = userMapper.updateById(user);
System.out.println(result);
}
2、自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
(2)实体上添加注解
@Data
public class User {
//@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
//表示在插入时进行自动填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
(3)实现元对象处理器接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
四、select基本查询,比较简单
/**
* 测试基本查询
*/
@Test
public void testBaseSelect(){
//根据id查询记录
/*User user = userMapper.selectById(1328284132802895878l);
System.out.println(user);*/
//通过多个id批量查询
/*List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(user -> System.out.println(user));*/
//简单条件查询
/*HashMap<String, Object> map = new HashMap<>();
map.put("name", "销户");
map.put("age", 33);
List<User> users1 = userMapper.selectByMap(map);
users1.forEach(user -> System.out.println(user));*/
//分页查询
//IPage<User> page = new Page<>(1, 3); //如果写成接口类型引用则没有page.hasNext(),page.hasPrevious()这两个方法
Page<User> page = new Page<>(1, 3);
//IPage<User> iPage = userMapper.selectPage(page, null); //这是第一种写法
//这是第二种写法,查询过后,值就自动赋值给page对象了
userMapper.selectPage(page, null);
List<User> records = page.getRecords();
records.forEach(System.out::println);
System.out.println(page.getCurrent());
System.out.println(page.getPages());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
在上面的分页查询上我们要注意以下几点:
1,创建配置类(MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能)
此时可以删除主类中的 @MapperScan 扫描注解
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id
五、条件查询
/**
* 实现条件查询
*/
@Test
public void selectByInfo(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
//(1) eq、ne
//wrapper.eq("name", "让帝");
//(2) ge、gt、le、lt
//wrapper.ge("age", 33).like("name", "小");
//(3) like
//wrapper.ge("age", 33).like("name", "小");
//(4) between
//wrapper.between("age", 18, 21);
//(5) orderByDesc
//wrapper.orderByDesc("age");
//(6) select
wrapper.select("id", "name", "age", "email").ge("age", 33).like("name", "小");
List<User> users = userMapper.selectList(wrapper);
users.forEach(user -> System.out.println(user));
}
六、delete
/**
* 测试删除
*/
@Test
public void testDelete(){
//根据id删除记录
//userMapper.deleteById(1328284132802895881l)
//批量删除
//userMapper.deleteBatchIds(Arrays.asList(1328284132802895881l, 1328284132802895880l));
//简单的条件查询删除
HashMap<String, Object> map = new HashMap<>();
map.put("id", 1328284132802895883l);
userMapper.deleteByMap(map);
}