- MyBatis Plus 的学习使用
- 引入
- 一、查询
- 二、修改
- 三、删除
- 四、增加
- 五、条件构造器(EntityWrapper)
-
pom.xml中引入依赖
com.baomidou mybatis-plus 2.3 -
springDao.xml 配置mybatisPlus的sqlsessionFactory
-
创建数据表实体类
@Data @TableName("da_manage") //指定表名 //这个注解的作用就是自动的给model bean实现equals方法和hashcode方法。 @EqualsAndHashCode(callSuper = false) //开启链式编程 @Accessors(chain = true) @ApiModel(value = "da_manage对象", description = "da_manage对象") public class DAManage { // 指定主键生成策略为不含中划线的UUID @TableId(type = IdType.ASSIGN_UUID) //value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value //@TableId(value = "id",type = IdType.AUTO)//指定自增策略 @ApiModelProperty(value = "uuid") private String id; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "建档时间") private Date daTime; @ApiModelProperty(value = "草稿状态,0草稿,1完成状态") private String daStatus; //若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列 @TableField(value = "last_name",exist = true) @ApiModelProperty(value = "是否删除") private Integer isDel; private String temp; // @TableField(exist = false) // private Listlist; } -
实体类的mapper层
@Repository public interface DAManageMapper extends baseMapper
{ }
这样就完成了mybatis-plus与spring的整合。
- 首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,
- 然后把sqlsessionfactory换成mybatis-plus的,
- 然后实体类中添加@TableName、@TableId等注解,
- 最后mapper继承baseMapper即可。
如果需要在service层中直接使用curd方法,需要额外让service的实现类继承
ServiceImpl
public class DAManageServiceImpl extends ServiceImpl一、查询implements DAManageService { }
-
根据id查询
Employee employee = emplopyeeDao.selectById(1);
-
根据条件查询 单条数据
Employee employeeCondition = new Employee(); employeeCondition.setId(1); employeeCondition.setLastName("更新测试"); //若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错 Employee employee = emplopyeeDao.selectOne(employeeCondition); -
根据条件查询多条数据
Map
columnMap = new HashMap<>(); columnMap.put("gender","1");//写表中的列名 columnMap.put("last_name","123"); List employees = emplopyeeDao.selectByMap(columnMap); System.out.println(employees.size()); *注意:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。比如属性名为lastName,数据表中字段为last_name,这里应该写的是last_name。selectByMap方法返回值用list集合接收。
-
通过id批量查询
List
idList = new ArrayList<>(); idList.add(1); idList.add(2); idList.add(3); List employees = emplopyeeDao.selectBatchIds(idList); System.out.println(employees); **注:**把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收。
-
分页查询
//service接口 IPage
queryPageDAM(DAMAccpet daManage); //service实现 public IPage queryPageDAM(DAMAccpet daManage) { Page page = new Page<>(daManage.getPageNo(), daManage.getPageSize()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { if (daManage.getDaTime() != null) { daManage.setDaTime(sdf.parse(sdf.format(daManage.getDaTime()))); } if (daManage.getAddTime() != null) { daManage.setAddTime(sdf.parse(sdf.format(daManage.getAddTime()))); } } catch (ParseException e) { System.out.println("日期转换异常"); } return daManageMapper.queryPageDAM(page, daManage); } //mapper层 page一定要是这个方法的 第一个参数,其中必须有pageNO,pageSIze IPage queryPageDAM(@Param("page") Page page, @Param("daManage") DAMAccpet daManage);
-
service修改操作 updateById 方法
@Transactional(rollbackFor = Exception.class) @Override public void deleteBatch(ListasList) { // removeByIds(asList); DAManage daManage = new DAManage(); for (String s : asList) { daManage.setId(s); daManage.setIsDel(1); updateById(daManage); } } @Test public void testUpdate(){ Employee employee = new Employee(); employee.setId(1); employee.setLastName("更新测试"); //emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新 emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null }
-
根据id删除
emplopyeeDao.deleteById(1);
-
根据条件删除
Map
columnMap = new HashMap<>(); columnMap.put("gender",0); columnMap.put("age",18); emplopyeeDao.deleteByMap(columnMap); -
批量删除
//可以用此方法将前端传来的数组toString的json字符串转换成String数组 Arrays.asList(daManage.getListStr().split(",")); public void deleteBatch(ListasList) { removeByIds(asList); } List idList = new ArrayList<>(); idList.add(1); idList.add(2); emplopyeeDao.deleteBatchIds(idList);
-
service增加操作 sava 方法 id会根据主键增长原则自动生成
@Override @Transactional(rollbackFor = Exception.class) public String addDAM(DAMAccpet daManage) { try { DAManage daManage1 = new DAManage(); BeanUtils.copyProperties(daManage, daManage1); save(daManage1); return "新增成功"; } catch (Exception e) { return "新增失败"; } } -
mapper中使用 insert 方法
@Autowired private EmplopyeeDao emplopyeeDao; @Test public void testInsert(){ Employee employee = new Employee(); employee.setLastName("东方不败"); employee.setEmail("dfbb@163.com"); employee.setGender(1); employee.setAge(20); emplopyeeDao.insert(employee); //mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中 System.out.println(employee.getId()); }
1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
Listemployees = emplopyeeDao.selectPage(new Page (1,3), new EntityWrapper () .between("age",18,50) .eq("gender",0) .eq("last_name","tom") );
**注:**由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。
2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:
Listemployees = emplopyeeDao.selectList( new EntityWrapper () .eq("gender",0) .like("last_name","老师") //.or()//和or new 区别不大 .orNew() .like("email","a") );
**注:**未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。
3、查询gender为0,根据age排序,简单分页:
Listemployees = emplopyeeDao.selectList( new EntityWrapper () .eq("gender",0) .orderBy("age")//直接orderby 是升序,asc .last("desc limit 1,3")//在sql语句后面追加last里面的内容(改为降序,同时分页) );
**注:**简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。
4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:
Listemployees = emplopyeeDao.selectPage( new Page (1,2), Condition.create() .between("age",18,50) .eq("gender","0") );
**注:**Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。
5、根据条件更新:
@Test
public void testEntityWrapperUpdate(){
Employee employee = new Employee();
employee.setLastName("苍老师");
employee.setEmail("cjk@sina.com");
employee.setGender(0);
emplopyeeDao.update(employee,
new EntityWrapper()
.eq("last_name","tom")
.eq("age",25)
);
}
**注:**该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。
6、根据条件删除:
emplopyeeDao.delete(
new EntityWrapper()
.eq("last_name","tom")
.eq("age",16)
);
**注:**该案例表示把last_name为tom、age为16的所有用户删除。



