pom.xml中引入依赖
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plusartifactId>
<version>2.3version>
dependency>
springDao.xml 配置mybatisPlus的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 list;
}
实体类的mapper层
/** map需要继承BaseMapper<实体类>
*/
@Repository
public interface DAManageMapper extends BaseMapper<DAManage> {
}
这样就完成了mybatis-plus与spring的整合。
@TableName
、@TableId
等注解,BaseMapper
即可。如果需要在service层中直接使用curd方法,需要额外让service的实现类继承
ServiceImpl
,这样就可以在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("[email protected]");
employee.setGender(1);
employee.setAge(20);
emplopyeeDao.insert(employee);
//mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
System.out.println(employee.getId());
}
1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
List employees = 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的用户:
List employees = 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排序,简单分页:
List employees = 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来处理一下这个需求:
List employees = 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("[email protected]");
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的所有用户删除。