1.MyBatisPlus核心功能
1.核心功能
- @TableName("emp_user")//代表数据库中的
- @TableId //代表数据库中的主键
- @TableField("name")//指定映射数据库中某一列
- transient或者static 或者
@TableField(exist = false)该字段不参与MyBatis Plus的序列化过程,即数据库中可以无该字段,三种方法 userList.forEach(System.out::println)迭代输出list内容
查询
- 基本查询方法
-
查询需求
数据库实体:
/**
* @author Hugo
* @time 2020/3/29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//代表数据库中的主键
private Long id;
//姓名
private String name;
//年龄
private Integer age;
//邮箱
private String email;
//管理员
private Long managerId;
//创建日期
private LocalDateTime createTime;
}
1、名字中包含雨并且年龄小于40
name like '%雨%' and age<40
@Test
public void selectByWrapper1(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.like("name", "雨").
lt("age", 40);
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
2、名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
name like '%雨%' and age between 20 and 40 and email is not null
@Test
public void selectByWrapper2(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.like("name", "雨").
between("age",20,40).isNotNull("email");
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
3、名字为王姓或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
name like '王%' or age>=25 order by age desc,id asc
@Test
public void selectByWrapper3(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.likeRight("name", "王").ge("age",25).or().
orderByDesc("age").orderByAsc("id");
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
4、创建日期为2019年2月14日并且直属上级为名字为王姓
date_format(create_time,'%Y-%m-%d')='2019-02-14' and manager_id in (select id from user where name like '王%')
@Test
public void selectByWrapper(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.apply("date_format(dateColumn,'%Y-%m-%d') = {0}",
"2019-02-14").inSql("manager_id",
"select id from user where name like '王%'");
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
5、名字为王姓并且(年龄小于40或邮箱不为空)
name like '王%' and (age<40 or email is not null)
@Test
public void selectByWrapper5(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.likeRight("name", "王").
and(wq -> wq.lt("age",40).or().isNotNull("emainl"));
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
6、名字为王姓或者(年龄小于40并且年龄大于20并且邮箱不为空)
name like '王%' or (age<40 and age>20 and email is not null)
@Test
public void selectByWrapper6(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.likeRight("name", "王").
or(wq->wq.lt("age",40).gt("age", 20).
isNotNull("email"));
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
7、(年龄小于40或邮箱不为空)并且名字为王姓
(age<40 or email is not null) and name like '王%'
@Test
public void selectByWrapper7(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.nested(wq->wq.lt("age", 40).or().
isNotNull("email")).likeRight("name", "王");
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
8、年龄为30、31、34、35
age in (30、31、34、35)
@Test
public void selectByWrapper8(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.in("age", Arrays.asList(30,31,34,35));
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
9、只返回满足条件的其中一条语句即可
limit 1
@Test
public void selectByWrapper8(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.in("age", Arrays.asList(30,31,34,35));
List <User> userList = userMapper.selectList(queryWrapper).last("limit 1");
userList.forEach(System.out::println);
}
具有SQL注入风险
二、select中字段不全部出现的查询
10、名字中包含雨并且年龄小于40(需求1加强版)
第一种情况:select id,name
from user
where name like '%雨%' and age<40
@Test
public void selectByWrapper1(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.select("name","age").like("name", "雨").
lt("age", 40);
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
防误写的查询方法
@Test
public void selectByWrapperE(){
LambdaQueryWrapper <User> queryWrapper = Wrappers. <User>lambdaQuery();
queryWrapper.like(User::getName, "雨"). lt("age", 40);
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
第二种情况:select id,name,age,email
from user
where name like '%雨%' and age<40
@Test
public void selectByWrapper10(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.like("name", "雨").lt("age", 40).select(User.class,info->!info.getColumn().equals("age")&&info.getColumn().equals("manager_id"));
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
三、统计查询:
11、按照直属上级分组,查询每组的平均年龄、最大年龄、最小年龄。
并且只取年龄总和小于500的组。
select avg(age) avg_age,min(age) min_age,max(age) max_age
from user
group by manager_id
having sum(age) <500
@Test
public void selectByWrapperE(){
QueryWrapper<User> queryWrapper =
new QueryWrapper <>();
queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age) max_age").groupBy("manager_id").having("sum(age)<{0}", 500);
List <Map <String, Object>> userList = userMapper.selectMaps(queryWrapper);//注意,这里是selectMaps
userList.forEach(System.out::println);
System.out.println("==============");
}
}
通用Mapper
12.创建条件构造器,处理前段传来的实体类数据
/**
* 通过判断前端的数据是否与后端的等值
*/
@Test
public void selectByWrapperE(){
User whereuser =new User();
whereuser.setAge(31);
whereuser.setName("刘雨红");
QueryWrapper<User> queryWrapper =
new QueryWrapper <>(whereuser);//当传输入whereuser的时候,SQL语句就会拼接where age=31&&name=刘玉红
List <User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
System.out.println("==============");
}
另外,还需要在实体类user中添加注解@TableField(SqlCondition.LIKE)
public class User {
//代表数据库中的主键
@TableId
private Long id;
@TableField(SqlCondition.LIKE)
private String name;
private Integer age;
private String email;
private Long managerId;
private LocalDateTime createTime;
}
可选注解,SQlCondition
13.自定义sql查询方法
需要mybatis plus 版本需要大于3.0.7
public class LambdaWapper{
@Select("select * from user ${ew.customSqlSegment}")//也可以写入Xml中
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
分页查询
1.直接物理查询方法
/**
* 分页查询,使用Page和IPage进行分页查询,
* 也可运行不包含总条数的sql语句
* 只需要在 Page<User> page =new Page<User>(1,2);
* 变为 Page<User> page =new Page<User>(1,2,false);
*/
@Test
public void selectBypage(){
QueryWrapper queryWrapper =new QueryWrapper<User>();
queryWrapper.ge("age", 26);
Page<User> page =new Page<User>(1,2);
IPage iPage = userMapper.selectPage(page, queryWrapper);
System.out.println("总页数"+iPage.getPages());
System.out.println("总页数"+iPage.getTotal());
List records = iPage.getRecords();
records.forEach(System.out::println);
}
2.通过自定义的方法来完成分页查询,写好配置类,@Configuration以及@Bean,然后在mybtais-config.xml中写SQL语句,具体参考https://mp.baomidou.com/guide/sql-injector.html
更新方法
1.使用updateById()方法进行更新,通过Id进行更新
@Test
public void updateById(){
User user =new User();
user.setId(1088248166370832385L);
user.setName("王天");
user.setAge(10);
int i = userMapper.updateById(user);
System.out.println(i);
}
2.使用UpdateWrapper更新
userUpdateWrapper.eq("name", "李老板").eq("age", 26);,通过在SQL语句后面加name="李老板" and age=26 来判断需要更新的语句,并且会更新实体类User中不为空的,也就是没有set进去值,就不会改变
@Test
public void updateByWrapper(){
UpdateWrapper<User> userUpdateWrapper =new UpdateWrapper <>();
//User whereUser =new User();
//whereUser.setName("李老板");后面就不需要在加了,其他同理
//UpdateWrapper<User> userUpdateWrapper =new UpdateWrapper <>(whereUser);
userUpdateWrapper.eq("name", "李老板").eq("age", 26);
User user =new User();
user.setEmail("11@qq.com");
user.setAge(123);
int update = userMapper.update(user, userUpdateWrapper);
}
3.使用LambdaUpdateChainWrapper来实现
@Test
public void updateByWrapper(){
new LambdaUpdateChainWrapper<User>(userMapper).eq(info->info.getAge(), 28).set(true, User::getAge, 30).update(new User());
}
删除方法
- 根据id删除的方法
- 其他普通删除方法
- 以条件构造器为参数的删除方法
Service层
1.先将Serivce接口继承IService
public interface UserService extends IService<User> {
}
2.实现类中继承ServiceImpl<UserMapper, User>,在实现接口
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
3.ServiceTest可以直接使用
RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ServiceTest {
@Autowired
private UserService userService;
@Test
public void serviceTest(){
User byId = userService.getById(28);
System.out.println(byId);
}
}
需要的方法,就看IService源码就好!!
BaseMap源码
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
* <p>这个 Mapper 支持 id 泛型</p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> {
/**
* 插入一条记录
*
* @param entity 实体对象
*/
int insert(T entity);
/**
* 根据 ID 删除
*
* @param id 主键ID
*/
int deleteById(Serializable id);
/**
* 根据 columnMap 条件,删除记录
*
* @param columnMap 表字段 map 对象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
*
* @param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
/**
* 删除(根据ID 批量删除)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根据 ID 修改
*
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
*
* @param id 主键ID
*/
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
*
* @param columnMap 表字段 map 对象
*/
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

浙公网安备 33010602011771号