1.MyBatisPlus核心功能

1.核心功能

  1. @TableName("emp_user")//代表数据库中的
  2. @TableId //代表数据库中的主键
  3. @TableField("name")//指定映射数据库中某一列
  4. transient或者static 或者@TableField(exist = false) 该字段不参与MyBatis Plus的序列化过程,即数据库中可以无该字段,三种方法
  5. 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

image-20200402002549311

 

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());
    }

 

删除方法

  1. 根据id删除的方法

 

  1. 其他普通删除方法
  2. 以条件构造器为参数的删除方法

 

 

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);
}

 

posted @ 2020-04-20 20:21  Hugo_nice  阅读(611)  评论(0)    收藏  举报