MyBatis Plus 的学习使用
引入
-
pom.xml中引入依赖
<!-- mp 依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency>
-
springDao.xml 配置mybatisPlus的sqlsessionFactory
<!-- mybatis的sqlsessionFactorybean:org.mybatis.spring.SqlSessionFactoryBean--> <!-- 3、配置mybatis-plus的sqlSessionFactory --> <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="typeAliasesPackage" value="com.zhu.mybatisplus.entity"/> </bean>
-
创建数据表实体类
/** * Created by IntelliJ IDEA. * User: LvHaoIT (asus) * Date: 2021/12/27 * Time: 14:09 */ @Data @TableName("da_manage") //指定表名 //这个注解的作用就是自动的给model bean实现equals方法和hashcode方法。 @EqualsAndHashCode(callSuper = false) //开启链式编程 @Accessors(chain = true) /** * @ApiModel * 使用场景 * 在实体类上边使用,标记类时swagger的解析类 */ @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 List<String> list; }
-
实体类的mapper层
/** map需要继承BaseMapper<实体类> */ @Repository public interface DAManageMapper extends BaseMapper<DAManage> { }
这样就完成了mybatis-plus与spring的整合。
- 首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,
- 然后把sqlsessionfactory换成mybatis-plus的,
- 然后实体类中添加
@TableName
、@TableId
等注解, - 最后mapper继承
BaseMapper
即可。
如果需要在service层中直接使用curd方法,需要额外让service的实现类继承
ServiceImpl<DAManageMapper, DAManage>
,这样就可以在service中使用例如:sava()
,removeByIds(asList)
等
public class DAManageServiceImpl extends ServiceImpl<DAManageMapper, DAManage> implements DAManageService {
}
一、查询
-
根据id查询
Employee employee = emplopyeeDao.selectById(1);
-
根据条件查询 单条数据
Employee employeeCondition = new Employee(); employeeCondition.setId(1); employeeCondition.setLastName("更新测试"); //若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错 Employee employee = emplopyeeDao.selectOne(employeeCondition);
-
根据条件查询多条数据
Map<String,Object> columnMap = new HashMap<>(); columnMap.put("gender","1");//写表中的列名 columnMap.put("last_name","123"); List<Employee> employees = emplopyeeDao.selectByMap(columnMap); System.out.println(employees.size());
*注意:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。比如属性名为lastName,数据表中字段为last_name,这里应该写的是last_name。selectByMap方法返回值用list集合接收。
-
通过id批量查询
List<Integer> idList = new ArrayList<>(); idList.add(1); idList.add(2); idList.add(3); List<Employee> employees = emplopyeeDao.selectBatchIds(idList); System.out.println(employees);
**注:**把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,该方法返回的是对应id的所有记录,所有返回值也是用list接收。
-
分页查询
//service接口 IPage<DAManage> queryPageDAM(DAMAccpet daManage); //service实现 public IPage<DAManage> queryPageDAM(DAMAccpet daManage) { Page<DAManage> 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<DAManage> queryPageDAM(@Param("page") Page<DAManage> page, @Param("daManage") DAMAccpet daManage);
二、修改
-
service修改操作 updateById 方法
/* * * 逻辑批量修改 * @param asList */ @Transactional(rollbackFor = Exception.class) @Override public void deleteBatch(List<String> asList) { // 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<String,Object> 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(List<String> asList) { removeByIds(asList); } List<Integer> 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()); }
五、条件构造器(EntityWrapper)
1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
new EntityWrapper<Employee>()
.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的用户:
List<Employee> employees = emplopyeeDao.selectList(
new EntityWrapper<Employee>()
.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排序,简单分页:
List<Employee> employees = emplopyeeDao.selectList(
new EntityWrapper<Employee>()
.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来处理一下这个需求:
List<Employee> employees = emplopyeeDao.selectPage(
new Page<Employee>(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<Employee>()
.eq("last_name","tom")
.eq("age",25)
);
}
**注:**该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。
6、根据条件删除:
emplopyeeDao.delete(
new EntityWrapper<Employee>()
.eq("last_name","tom")
.eq("age",16)
);
**注:**该案例表示把last_name为tom、age为16的所有用户删除。