3、MybatisPlus

1.Spring 补充

1.1 Spring内部数据结构

1.数据的结构: Map 理解为容器
2.数据内容: KEY-VALUE -KEY:一般都是类名的首字母小写 helloController -Value: 一般存储的是经过反射等机制实例化的对象 Map<helloController,controller对象>
3.单例: 容器中只保存一个对象, spring容器管理对象的生命周期 和容器几乎同生共死
默认:单例对象
多例: 如果用户需要使用,则新创建一个对象交给用户使用,由用户管理对象的生命周期.

  1. bean配置文件说明
	 	<bean  id="唯一标识"   class="类的路径"  />  与Map集合进行关联

2.关于环境代码报错

2.1 数据库问题

Mysql数据库版本: 教师机 5.5 高版本的数据库6.0以上. 在这里插入图片描述

2.2 IDEA版本问题

修改mybatis的路径 在这里插入图片描述

3. MybatisPlus

3.1 MP介绍

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 在这里插入图片描述

3.2 特点说明

重点说明: MP适用于单表操作 如果遇到多表关联,则手写Sql效率更高. 在这里插入图片描述

3.3 MP入门案例

3.3.1 导入jar包

说明: 由于MP内部兼容了Mybatis 则引入MP之后将原来的mybatis的包删除.

<!--spring整合mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

3.3.2 对象与表映射

在这里插入图片描述

3.3.3 继承公共的Mapper接口

在这里插入图片描述

3.3.4 修改YML配置文件

说明: springBoot应该由原来的Mybatis操作数据库,现在换成MP的机制,所以应该修改SpringBoot整合MP的操作. 在这里插入图片描述

3.3.4 编辑MP入门案例

对比Sql写法/MP写法的区别…

@SpringBootTest
public class TestMybatis {
    // sprign容器 <userMapper,代理对象>
    // 面向接口编程 扩展性好
    @Autowired
    private UserMapper userMapper;//JDK动态代理

    //报错说明:com.jt.mapper.UserMapper.findAll  不匹配!!!!
    //关于测试类代码说明: 要求: public   返回值void  方法名称不能叫test
    @Test
    public void test01(){
        System.out.println(userMapper.getClass());
        List<User> userList = userMapper.findAll();   //接口的方法  数据库只能识别Sql语句
        System.out.println(userList);
    }

    //查询 用户的全部记录 面向对象的方式操作数据库.
    //只能用于单表查询
    @Test
    public void testFind(){
        //暂时不需要任何where条件  查询的是全部记录.
        List<User> userList = userMapper.selectList(null);
        System.out.println(userList);
    }
}

3.4 Mybatis CURD操作练习

3.4.1 编辑测试代码

  @Test
    public void insert(){
        User user = new User();
        user.setName("星期五").setAge(18).setSex("男");
        userMapper.insertUser(user);
        System.out.println("新增用户成功");
    }

    //根据name="星期五",将name="星期六"
    @Test
    public void update(){
        String oldName = "星期五";
        String newName = "星期六";
        userMapper.updateByName(oldName,newName);
        System.out.println("更新用户成功");
    }

    //删除用户信息 根据name属性删除数据
    @Test
    public void delete(){
        String name = "星期六";
        userMapper.deleteByName(name);
        System.out.println("删除用户成功");
    }

3.4.2 编辑Mapper接口

@Insert("insert into demo_user(id,name,age,sex) " +
            "value (null,#{name},#{age},#{sex})")
    void insertUser(User user);
    @Update("update demo_user set name = #{newName} where name=#{oldName}")
    void updateByName(String oldName, String newName);
    //Mybatis中如果传递的参数只有一个,则名称任意 一般不用.
    @Delete("delete from demo_user where name=#{name}")
    void deleteByName(String name);

3.5 MP的工作原理

1).通过注解 实现对象与表一一映射.
2).通过属性注解 实现对象的属性与表中的字段一一映射.
3).将公共的方法进行抽取,抽取到BaseMapper接口中
4).将用户操作的方法对象,转化为数据库能够识别的Sql语句.
demo1: userMapper.insert(user对象)
Sql1: insert into 表名(字段名…) value (属性值…)

	其实就是在做字符串拼接

拼接过程:
insert into 表名(字段名…) value (属性值…)
1).通过userMapper 查找父级接口BaseMapper
2).根据BaseMapper 查找泛型对象 User对象.
3).根据user对象 查找指定的注解 @TableName,获取表名
4).根据user对象的属性,动态获取表中的字段.@TableField
5).在获取字段的同时,获取属性的值,最后进行sql拼接
6).MP将拼接好的Sql交给Mybatis框架处理执行.

insert into demo_user(id,name…) value (value1,value2…)

3.6 MP练习

3.6.1 根据ID查询

 	/**
     * 1.根据Id=23数据
     */
    @Test
    public void select01(){
       User user = userMapper.selectById(23);
       System.out.println(user);
    }

3.6.2 对象查询

配置日志: 在这里插入图片描述

 	/**
     * 查询 name="潘凤"  sex="男"
     * 结果: 1项 userMapper.selectOne()
     *      多项 userMapper.selectList()
     * Sql: where name="xxx" and sex="xxx"
     * queryWrapper: 条件构造器  拼接where条件
     * 如果遇到多条件查询,则默认的连接符and
     * 方式1: 可以通过对象的方式进行控制
     */
    @Test
    public void select02(){
        User user = new User();
        user.setName("潘凤").setSex("男");
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.3 特殊字符练习

 	/**
     * 要求: age>18岁  or sex=男的用户
     * 转义字符:   > gt,   < lt , = eq
     *            >= ge , <= le
     */
    @Test
    public void select03(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //编辑的是数据库字段信息
        queryWrapper.gt("age", 18)
                    .or()
                    .eq("sex","男");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.4 like关键字

 	/**
     * 要求: 查询name中包含"精" 并且按照age 降序排列
     * Sql: like "%精%"  包含精
     *      like "精%"   以精开头
     *      like "%精"   以精结尾
     */
    @Test
    public void select04(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name","精")
                    .orderByDesc("age");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.5 In关键字

 	/**
     * 查询多个数据
     * 查询ID= 1 3 6 7的数据
     * where id in (xx,xx,xx,xx)
     * 如果遇到多值传参,一般采用对象的方式封装数据
     */
    @Test
    public void select05(){
        Integer[] ids = {1,3,6,7};
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.in("id", ids);
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.6 不为null查询

  	/**
     * 需求: 查询name为null的数据
     */
    @Test
    public void select06(){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.isNull("name");
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.7 动态Sql语句查询

	/**
     * 动态sql查询:
     *  要求: 根据 age 属性与sex属性进行查询.
     *       如果其中数据为null 则不参与where条件的拼接
     *     where age>18 and  sex="男"
     *  错误Sql:
     *      SELECT id,name,age,sex FROM demo_user WHERE (age > ? AND sex = ?)
     *      18(Integer), null
     *  MP实现动态查询:
     *       参数1: condition  boolean类型数据 true 拼接条件
     *                                        false 不拼接条件
     *       参数2: 字段名称
     *       参数3: 字段值
     */
    @Test
    public void select07(){
       Integer age = 18;
       String sex = "男";
       //boolean flag = sex != null &amp;&amp; sex.length()>0;
        //条件判断
       boolean flag = StringUtils.hasLength(sex);
       QueryWrapper<User> queryWrapper = new QueryWrapper<>();
       queryWrapper.gt(age>0, "age", age)
                   .eq(flag,"sex",sex);
        //根据对象中不为null的属性 拼接where条件
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

3.6.8 挑选字段查询

	/**
     * demo1:只查询 name,age字段信息
     * 挑选查询的字段信息
     * queryWrapper.select("name","age");
     */
    @Test
    public void select08(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name","age");
        //没有查询的数据以null返回
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

    //* demo2: 只要求返回name,age字段
    @Test
    public void select09(){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.select("name","age");
        List<Map<String,Object>> list = userMapper.selectMaps(queryWrapper);
        System.out.println(list);
    }

    //* 要求返回第一列的数据
    // 如果包含了条件数据 则需要通过条件构造器封装
    @Test
    public void select10(){
        List<Object> list = userMapper.selectObjs(null);
        System.out.println(list);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值