Wrapper 解释说明
Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractWrapper 下的方法及使用
eq 就是 equal等于
ne就是 not equal不等于
gt 就是 greater than大于
lt 就是 less than小于
ge 就是 greater than or equal 大于等于
le 就是 less than or equal 小于等于
in 就是 in 包含(数组)
isNull 就是 等于null
between 就是 在2个条件之间(包括边界值)
like就是 模糊查询
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class test {
@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());
}
}
2、update操作:
@Test
publicvoidtestUpdate(){
Employeeemployee=newEmployee();
employee.setId(1);
employee.setLastName("更新测试");
//emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新
emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null
}
3、select操作
(1)、根据id查询
Employeeemployee=emplopyeeDao.selectById(1);
(2)、根据条件查询一条数据:
EmployeeemployeeCondition=newEmployee();
employeeCondition.setId(1);
employeeCondition.setLastName("更新测试");
//若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错
Employeeemployee=emplopyeeDao.selectOne(employeeCondition);
(3)、根据查询条件返回多条数据:
Map<String,Object>columnMap=newHashMap<>();
columnMap.put("last_name","东方不败");//写表中的列名
columnMap.put("gender","1");
List<Employee>employees=emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());
(4)、通过id批量查询:
List<Integer>idList=newArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<Employee>employees=emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);
(5)、分页查询:
List<Employee>employees=emplopyeeDao.selectPage(newPage<>(1,2),null);
System.out.println(employees);
4、delete操作:
(1)、根据id删除:
emplopyeeDao.deleteById(1);
(2)、根据条件删除:
Map<String,Object>columnMap=newHashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);
(3)、根据id批量删除:
List<Integer>idList=newArrayList<>();
idList.add(1);
idList.add(2);
emplopyeeDao.deleteBatchIds(idList);
5、全局策略配置:
通过上面的小案例我们可以发现,实体类需要加@TableName注解指定数据库表名,通过@TableId注解指定id的增长策略。实体类少倒也无所谓,实体类一多的话也麻烦。所以可以在spring-dao.xml的文件中进行全局策略配置。
<!-- 5、mybatisplus的全局策略配置 -->
<beanid="globalConfiguration"class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 2.3版本后,驼峰命名默认值就是true,所以可不配置 -->
<!--<property name="dbColumnUnderline" value="true"/>-->
<!-- 全局主键自增策略,0表示auto -->
<propertyname="idType"value="0"/>
<!-- 全局表前缀配置 -->
<propertyname="tablePrefix"value="tb_"/>
</bean>
这里配置了还没用,还需要在sqlSessionFactory中注入配置才会生效。如下:
<!-- 3、配置mybatisplus的sqlSessionFactory -->
<beanid="sqlSessionFactory"class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="configLocation"value="classpath:mybatis-config.xml"/>
<propertyname="typeAliasesPackage"value="com.zhu.mybatisplus.entity"/>
<!-- 注入全局配置 -->
<propertyname="globalConfig"ref="globalConfiguration"/>
</bean>
如此一来,实体类中的@TableName注解和@TableId注解就可以去掉了。
6、条件构造器(EntityWrapper):
以上基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法供使用, 可以极其方便的实现单一、批量、分页等操作,极大的减少开发负担。但是mybatis-plus的强大不限于此,请看如下需求该如何处理: 需求: 我们需要分页查询 tb_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢? 使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。 使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。
接下来就直接看几个案例体会EntityWrapper的使用。
1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:
List<Employee>employees=emplopyeeDao.selectPage(newPage<Employee>(1,3),
newEntityWrapper<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(
newEntityWrapper<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(
newEntityWrapper<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(
newPage<Employee>(1,2),
Condition.create()
.between("age",18,50)
.eq("gender","0")
);
注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。
5、根据条件更新:
@Test
publicvoidtestEntityWrapperUpdate(){
Employeeemployee=newEmployee();
employee.setLastName("苍老师");
employee.setEmail("cjk@sina.com");
employee.setGender(0);
emplopyeeDao.update(employee,
newEntityWrapper<Employee>()
.eq("last_name","tom")
.eq("age",25)
);
}
注:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。
6、根据条件删除:
emplopyeeDao.delete(
newEntityWrapper<Employee>()
.eq("last_name","tom")
.eq("age",16)
);
注:该案例表示把last_name为tom、age为16的所有用户删除。