对数据库的基本操作(下)

322 阅读3分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

首先说一下问什么换了新的一篇,因为,上一篇我们最开是讲了环境的准备和配置,并且查询和插入我们也只说到两个相似度比较高的函数,在前面测试代码中我们也需要用到这些简单的函数,这一篇的查询和删除我们会介绍新的函数进来,所以我将他分为两篇。

查询操作

selectById函数

通过主键查询

 	@Test
    public void demo3(){
        Employee result = employeeMapper.selectById(4);
        System.out.println(result);
    }

我们得到的结果

selectOne函数

这时候就有问题了,我们难道就只能主键查询吗?当然不会,我们可以把我们的查询条件封装成对象传到参数中,他会自动地将我们设置的不为空的值,作为查询条件进行查询

	@Test
    public void demo4(){
        Employee employee=new Employee();
        employee.setId(7);
        employee.setName("测试1");
        employee.setAge(11);
        Employee result = employeeMapper.selectOne(employee);
        System.out.println(result);
    }

selectBatchIds函数

上面我们能输入的之就只有一个,这个方法可以通过多个Id进行查询

@Test
    public void demo5(){
        List<Integer> idList=new ArrayList<>();
        idList.add(4);
        idList.add(5);
        idList.add(6);
        List<Employee> employees = employeeMapper.selectBatchIds(idList);
        System.out.println(employees);
    }

因为我们ID没有6,所以就没有查询出结果。

selectByMap函数

大家会不会发现一件事,就是我们不管怎么查询我们都需要用到主键,那我们能不通过主键去查询吗? 那当然是可以的啊!我们通过Map封装查询条件。

@Test
    public void demo6(){
        Map<String,Object> map = new HashMap<>();
        map.put("name","Tom");
        map.put("gender",1);
        List<Employee> employees = employeeMapper.selectByMap(map);
        System.out.println(employees);
    }

我们要注意的就是我们的键名需要和表中的名相同,不然他就会报错

删除操作

deleteById函数

大家看名字应该都知道怎么用了是吧?重复的东西我们就不过多解释了。

deleteByMap函数

上面的函数还是通过主键去删除,而这个函数可以根据其他的值进行删除

@Test
    public void demo8(){
        Map<String,Object> map = new HashMap<>();
        map.put("name","测试2");
        map.put("email","测试2邮箱");
        Integer result = employeeMapper.deleteByMap(map);
        System.out.println(result);
    }

我们刚刚添加的四条测试数据已经被删除

deleteBatchIds函数

这个函数在上面也有相同的类型,通过主键批量的去删除数据

作者小结

两片文章讲述了一下通过MybatiesPlus对数据库的基本操作,我们没有写任何的SQL语句,但是完成了对数据库的操作,这也是体现了MP的好用;但是还有一些问题我们没有去解决

就是我刚刚也阐述到我们已经对数据库进行操作了,但是我们没有写任何的SQL;xxxMapper 继承了 BaseMapper, BaseMapper 中提供了通用的 CRUD 方法,

方法来源于 BaseMapper, 有方法就必须有 SQL, 因为 MyBatis 最终还是需要通过SQL 语句操作数据;这个道理我想大家应该是明白的

我们就以一个简单的deleteById函数为例

首先我们要知道的employeeMapper 的本质 org.apache.ibatis.binding.MapperProxy

MapperProxy 中 sqlSession –>SqlSessionFactory

SqlSessionFacotry 中 → Configuration→ MappedStatements 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件中的一个 SQL;MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的 mappedStatements 中。

Configuration: MyBatis 或者 MP 全局配置对象

MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个

select/update/insert/delete 节点,主要描述的是一条 SQL 语句

SqlMethod : 枚举对象 ,MP 支持的 SQL 方法

TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息

SqlSource: SQL 语句处理对象

MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果集处理等.

通过 MapperBuilderAssistant 将每一个 mappedStatement

添加到 configuration 中的 mappedstatements 中