Mybatis接口注解说明+MybatisPlus

Mybatis接口注解说明+MybatisPlus

1. Mybatis 接口注解说明

1.1 需求说明

Mybatis实现数据查询时有2种Sql的写法。

1.将所有的Sql语句都写到xml 映射文件中。(万能操作方式)
在这里插入图片描述
2.可以将Sql语句通过注解的方式标识在接口方法中.(只适用于简单操作)

    //注意事项:映射文件和注解二选一
    @Select("select * from demo_user where id = #{id}")
    User fidUserById(int id);

1.2 注解的种类

说明: 该注解一般都是操作简单的数据查询,如果遇到关联查询/复杂Sql则使用Mapper映射文件的方式 更加通用.

@Mapper//spring为该接口创建一个代理对象
public interface UserMapper {
    //查询所有user表数据
    List<User> findAll();
    @Select("select * from demo_user where id = #{id}")
    @Insert("")//添加
    @Update("")//更新
    @Delete("")//删除
    }

1.3 Mybatis 案例练习

1.3.1 测试方法

@SpringBootTest
public class TestMybatis {

    //明确:注入一定是对象
    //SpringBoot为了整合mybatis,简化代码结构 Spring动态的为Mybatis的接口
    //创建代理对象
    //代理: 根据原有对象的模型,在运行期动态创建了一个一模一样功能的实例化对象
    //案例: 孙悟空(接口)/克隆一个一模一样的对象
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testFind(){
        System.out.println(userMapper.getClass());
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }

    //根据ID查询数据
    @Test
    public void findUserById(){

       User user = userMapper.findUserById(11);
       System.out.println(user);
    }

    //新增用户
    //数据从哪里来 前端动态获取
    @Test
    public void insert(){
        User user = new User();
        user.setName("星期五").setSex("男").setAge(18);
        userMapper.insert(user);
        System.out.println("新增成功");
    }
    //将星期五的年龄改为20 性别改为女
    @Test
    public void update(){
        User user = new User();
        user.setAge(20).setSex("女").setName("星期五");
        userMapper.updateByName(user);
    }
}

###1.3.2 Mapper接口文件写法

package com.jt.mapper;

import com.jt.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper//spring为该接口创建一个代理对象
public interface UserMapper {
    //查询所有user表数据
    List<User> findAll();
    @Select("select * from demo_user where id = #{id}")
    @Insert("")//添加
    @Update("")//更新
    @Delete("")//删除
    //注意事项:映射文件和注解二选一
    @Select("select * from demo_user where id = #{id}")
    User fidUserById(int id);
    @Insert("insert into demo_user (id ,name,age,sex) value (null,#{name},#{age},#{sex})")
    void insert (User user);
    @Update("update demo_user set age=#{age},sex=#{sex} where name=#{name}")
    void updateByName(User user);
}

2. MybatisPlus

2.1 MP介绍

在这里插入图片描述

2.2 为什么使用MP

场景说明:小红是一个10年开发,月薪100万.这是需要小红开发一套京淘项目实现最常用的CURD功能.像这类操作即简单又繁琐.如果大量的代码都由程序员自己手写则影响开发效率.
需求:像这类又简单又繁琐的工作最好交给框架自动完成.
说明:使用MP主要完成表单的CRUD操作,简化开发过程

2.3 MP入门案例

1.导入jar包
2.使用对象的方式操作数据库
3.便捷POJO实现对象与数据表的映射的关系
4.继承公共的接口,获取常用的CRUD的操作
5.实现数据操作.

2.3.1 引入jar包

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

2.2.2 编辑pojo

说明:
1.POJO应该与数据库中的表完成映射
@TableName(“demo_user”)//实现对象与表名映射
2.实现主键自增
@TableId(type = IdType.AUTO)
3.实现属性与字段映射
规则:如果属性和字段名一致可以省略
@TableField(“name”)

@Data//ste/get/toString
@Accessors(chain = true)//链式加载
@TableName("demo_user")//实现对象与表名映射
public class User {
    //设定主键自增
    @TableId(type = IdType.AUTO)//ASSIGN_ID + ASSIGN_UUID
    private Integer id;
    @TableField("name")//实现属性与字段映射
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("sex")
    private String sex;
}

2.2.3 继承公共的接口

说明:继承接口后,必须添加泛型对象,否则程序无法执行
父类中的接口:MP将常用的CRUD的方法进行了抽取,以后子类如果需要调用,则直接抽取
在这里插入图片描述
配置过程
接口文件

public interface UserMapper extends BaseMapper<User> {
    List<User> findAll();
}

.yml文件

mybatis-plus:
  #设置别名包
  type-aliases-package: com.jt.pojo
  #加载映射文件
  mapper-locations: classpath:/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true
#打印SQl语句
logging:
  level:
    com.jt.mapper: debug

2.4 核心思想:以对象的方式操作数据库

配置:

  1. 编辑POJO与数据表的映射.
  2. 编辑POJO属性与表字段映射.
  3. 封装了大量的常用CURD API
  4. 根据对象动态的生成Sql语句

执行过程:

  1. 程序业务开始执行 userMapper.insert(user);
  2. 根据Mapper接口动态获取操作的泛型对象.获取对象之后获取表的相关数据 public interface UserMapper extends BaseMapper
  3. 只要获取对象获取了表名称,字段名称.数据的值
  4. 将对象转化为特定的SQL,之后交给Mybatis执行
    userMapper.insert(user对象)
    Sql: insert into 表名 (字段名…) values (数据的值…)

2.5 MP常用操作

2.5.1 根据ID查询

    //1.根据主键查询数据库
    @Test
    public void testSelect1(){//SELECT id,name,age,sex FROM demo_user WHERE id=?
        User user = userMapper.selectById(1);
        System.out.println(user);//User(id=1, name=黑熊精, age=3000, sex=男)
    }

2.5.2 selectList查询(一)

    //2.根据name查询name="小乔"  sex="男"
    @Test
    public void textselect2(){
        User user = new User();
        user.setName("小乔").setSex("男");
        //创建条件构造器   封装where条件的
        //在实现时会动态的根据对象中不为null的属性   去拼接where条件
        //默认的关系链接符   and
        QueryWrapper queryWrapper=new QueryWrapper(user);
        List<User> userList=userMapper.selectList(queryWrapper);//SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
        System.out.println(userList);//[User(id=43, name=小乔, age=19, sex=男)]
    }

2.5.3 selectList查询(二)

    //3.查询name="小乔" sex="男"的用户
    //Sql:SELECT id,name,age,sex FROM demo_user WHERE name=? AND sex=?
    @Test
    public void testselect3(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.eq("name", "小乔")
                .eq("sex","男");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);//[User(id=43, name=小乔, age=19, sex=男)]
    }

2.5.4 selectList查询(三)

    //4.查询age>18 sex="女"的用户
    //sql:select * from demo_user where age >18 and sex='女'
    //逻辑运算符  >gt, <lt, =eq, >=ge, <=le, !=ne
    @Test
    public void testselect4(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.gt("age", "18")
                .eq("sex", "女");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

2.5.5 like关键字

    //5.like关键字
    //5.1查询name包含"乔" where name lik '%乔%'
    //5.2查询name以乔结尾的 where name like '%乔'
    @Test
    public void testselect5(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
//        queryWrapper.like("name", "乔");
        queryWrapper.likeLeft("name", "乔");
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

2.5.6 in关键字

    /*6.
    * in  关键字
    * 需求: 查询Id为1,5,6的数据
    * sql: select * fron demo_user where in(1,3,5,6)
     */
    @Test
    public void testselect6(){
        Integer[] ids={1,3,5,6};
        //一般的数组采用包装类型,使用对象身上的方法  基本类型没有方法
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.in("id",ids);
        //采用可变参数类型 实现查询
        //queryWrapper.in("id",1,3,5,6,);
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

2.5.7 order by关键字

    /*
    * 关键字:order by 排序
    * 默认规则: 升序   asc      降序  desc
    * 需求:查询性别为男的用户,按照年龄降序排列
    * sql:select * from demo_user where sex="男" order by age desc*/
    @Test
    public void testselect(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.eq("sex", "男")
                .orderByDesc("name","id" );
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

2.5.8 selectList-动态SQl

    /*
    * 动态SQL:
    * 根据用户的条件,动态拼接的where条件
    * 案例:根据sax,age查询数据
    * 1.select * from demo_user where age >18 and sex="女"
    * API说明:
    *       queryWrapper.gt(判断条件,字段名称,字段值)
    *       判断条件:true   则动态拼接where条件
    *               false  不会拼接where条件*/
    @Test
    public void testSelect8(){
        Integer age=null;
        String sex="女";
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        Boolean ageBean=age!=null;
        Boolean sexBean =StringUtils.hasLength(sex);
        queryWrapper.gt(ageBean,"age",age)
                .eq(sexBean,"sex","女");
/*
        queryWrapper.gt("age",18)
                .eq("sex","女");
*/
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println(userList);
    }

2.5.9 objs

    /*
    * 练习9:只获取主键ID的值
    * sql: select * from demo_user
    */
    @Test
    public void testSelect9(){
        List objects = userMapper.selectObjs(null);
        System.out.println(objects);
    }

2.5.10 删除操作

    /*练习10:*/
    /*删除名字为XXX的数据*/
    @Test
    public void testDelete(){
        //删除ID为100的数据
        userMapper.deleteById(100);
//        userMapper.deleteById(null);
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("name","XXX");
        userMapper.delete(queryWrapper);//删除操作的条件的构造器
    }

2.5.11 更新操作–byId

    /*练习11:数据修改
    * 案例1: 要求修改id=233 name改为"晚上吃什么"
    * API说明: userMapper.updateById(对象信息)*/
    @Test
    public void testUpdata(){
        //修改除ID之外的所有不为null的数据,id当作where的唯一操作
        User user = new User();
        user.setId(236).setName("晚上吃什么");
        userMapper.updateById(user);
    }

2.5.12 更新操作-任意字段

    /*练习12:数据修改
    * 案例2:将name=mp的用户改为name="宵夜吃什么" age=20 sex=女
    * API说明: userMapper.update(对象,修改条件构造器)
    *         对象:修改之后的数据使用对象封装
    *         修改体检构造器:负责修改的where条件
    * */
    @Test
    public void testUpdate2(){
        User user = new User();
        user.setName("宵夜").setAge(20).setSex("女");
        UpdateWrapper updateWrapper = new UpdateWrapper();//修改条件构造器
        updateWrapper.eq("name","MP" );
        userMapper.update(user,updateWrapper);
    }

更多详细操作参照官网进行

MyBatis-Plus官网–https://mp.baomidou.com/guide/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值