x
@SpringBootTest//用于测试
public class MyBatisPlusTest {

    @Autowired//自动装配,下面那行的userMapper报红线不用管,不影响运行
    private UserMapper userMapper;//红线解决: 在UserMapper接口的最上面添加@Repository注解
    //注意: userMapper是UserMapper接口类型的,而我们的UserMapper接口继承了BaseMapper接口,所以userMapper可以直接使用BaseMapper接口里面的方法

    @Test//用于运行测试方法--以selectList查询方法为例
    public void zidingyi_testSelectList(){
        //selectList方法的作用是通过条件构造器查询一个List集合,若没有条件,则可以null为参数
        List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);//forEach方法用于输出集合数据
    }
    //运行结果:查询出数据库的数据,以集合的方式输出。注意此时我们还没有在UserMapper接口里面写任何东西

    //---------------------------------------------------------------------------------------------------------

    //【测试BaseMapper接口提供给我们的方法】

    @Test
    //测试: 插入方法
    public void zidingyi_testInsert(){
        //由于insert方法需要一个实体类对象,所以我们先在下面那行创建一个实体类对象
        User user = new User();//User是我们写的实体类
        //然后就可以为这个对象的某个属性(或者说User类的某个成员变量、或者说数据库的某个字段)赋值
        user.setName("张三");
        user.setAge(18);
        user.setEmail("张三@athuanf.com");
        //把已经赋值的对象放到下面那行的insert方法
        int result = userMapper.insert(user);//insert方法的返回值是受影响的行数
        //上面那行执行之后,数据库的数据就会发生变化,我们顺便在下面那行输出一下受影响的行数
        System.out.println("受影响的行数: "+result);
        //其实还可以获取一下主键是谁,做法如下
        System.out.println("主键: "+user.getId());//这个主键的值会很长,原因:id在mybatis-plus中默认是采用雪花算法生成的,所以id字段是bigint类型、id成员变量是long类型

    }

    @Test
    //测试,deleteById删除方法,根据id删除
    public void zidingyi_testDelete1(){
        int result = userMapper.deleteById(1631865439841837057L);//如果id值超出int的范围,那么可以在尾部添加L,表示是long类型,而不是int类型的数据
        //上面那行deleteById的返回值是受影响的行数
        System.out.println("受影响的行数: "+result);
    }

    @Test
    //测试,deleteByMap删除方法,根据Map集合删除,注意Map集合的数据是键值对
    public void zidingyi_testDelete2(){
        //由于deleteByMap方法需要一个Map集合作为参数,所以我们先创建一个Map集合
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");//往集合里面添加参数,注意是键值对的形式
        map.put("age",23);
        int result = userMapper.deleteByMap(map);//会删除name为张三,并且age为23的数据,注意name和age是同时满足,也就是某条数据的name是张三且age是23,那么这条数据才会被删除
        //上面那行deleteByMap的返回值是受影响的行数
        System.out.println("受影响的行数: "+result);
    }

    @Test
    //测试,deleteBatchIds删除方法,根据id批量(由于是批量,所以我们要把id值写在一个list集合里面)删除
    public void zidingyi_testDelete3(){
        //可以先通过Arrays集合的asList方法,把id值写到集合里面,注意id值的结尾要加上L,注意集合的泛型是Long
        List<Long> list = Arrays.asList(1L, 2L, 3L);
        int result = userMapper.deleteBatchIds(list);//上面的list值,即会删除id为1,2,3的数据
        //上面那行deleteByMap的返回值是受影响的行数
        System.out.println("受影响的行数: "+result);
    }

    @Test
    //修改,updateById修改方法,首先需要一个实体类对象,然后在实体类对象里面指定要修改的id,然后就可对该实体类进行某些字段的重新修改,最后把实体类对象作为updateById方法的参数即可
    public void zidingyi_testUpdate(){
        //由于updateById方法需要一个实体类对象,所以先创建一个User类的对象,User类是我们自己写好的,User类对接的是数据库
        User user = new User();
        user.setId(4L);//表示等下我们要修改id为4的数据
        //在下面重新修改id为4的数据
        user.setName("李四");
        user.setEmail("lisi@athuanf.com");
        //把修改好的user对象放到updateById方法里面
        int result = userMapper.updateById(user);
        //userMapper方法返回的是是受影响的行数
        System.out.println("受影响的行数: "+result);
    }

    @Test
    //查询,selectById查询方法,根据id值,查询单个数据
    public void zidingyi_testSelect1(){
        //查询id为1的数据,返回值类型必须是你的实体类,例如返回类型是User类,User类是我们自己写好的,User类对接的是数据库
        User result = userMapper.selectById(1L);
        //输出id为1的数据
        System.out.println("id为1的数据是: "+result);
    }

    @Test
    //查询,selectById查询方法,根据id值,查询多个数据,由于是查询多个数据,所以所以我们要把id值写在一个list集合里面
    public void zidingyi_testSelect2(){
        //可以先通过Arrays集合的asList方法,把id值写到集合里面,注意id值的结尾要加上L,注意集合的泛型是Long        User result = userMapper.selectById(1L);
        List<Long> list = Arrays.asList(1L, 2L, 3L);
        List<User> userList = userMapper.selectBatchIds(list);//上面的list值,即会删除id为1,2,3的数据
        //输出之前用forEach方法,先对集合中的每一个数据进行循环并输出
        userList.forEach(System.out::println);
    }

    @Test
    //查询,selectByMap查询方法,根据Map集合查询,注意Map集合的数据是键值对
    public void zidingyi_testSelect3(){
        //由于selectByMap方法需要一个Map集合作为参数,所以我们先创建一个Map集合
        Map<String,Object> map_duixiang = new HashMap<>();
        //把要查询的条件添加进map_duixiang对象里面,然后把map_duixiang对象作为参数写进selectByMap方法
        map_duixiang.put("name","Jack");
        map_duixiang.put("age",28);
        //上面两行表示查询的是name为Jack,并且age为28的数据,注意name和age是同时满足,也就是某条数据的name是Jack且age是28,那么这条数据才会被查询
        List<User> userList = userMapper.selectByMap(map_duixiang);
        //上面那行的返回值是list集合
        //输出之前用forEach方法,先对集合中的每一个数据进行循环并输出
        userList.forEach(System.out::println);
    }

    @Test
    //查询,selectList查询方法,如果条件为null,则表示所有数据
    public void zidingyi_testSelect4(){
        //selectList方法的作用是通过条件构造器查询一个List集合,若没有条件,则可以null为参数
        List<User> list = userMapper.selectList(null);//注意参数为null表示查询所有数据
        //输出之前用forEach方法,先对集合中的每一个数据进行循环并输出
        list.forEach(System.out::println);
    }
}