zoukankan      html  css  js  c++  java
  • 11.05Mybatis注解

    11.05Mybatis注解

    注解分类

    • SQL语句映射

    • 结果集映射

    • 关系映射


    SQL语句映射

    • @Select

    • @Insert

    • @Update

    • @Delete

    • @SelectKey

    • @Param


    使用注解是通过接口直接发送和执行SQL得到结果。

    @Select注解

    位置:

    WebsiteMapper接口写在一起

    示例:

    构建User类:

    package com.junkingboy.bean;

    /**
    * @description:User表的JavaBean对象类
    * @data: 2021/11/5 10:37
    * @author: Lucifer
    */
    public class User {
       /*定义表字段属性*/
       private int id;
       private String name;
       private String username;
       private String password;

       /*get和set方法*/
       public int getId() {
           return id;
      }

       public String getName() {
           return name;
      }

       public String getUsername() {
           return username;
      }

       public String getPassword() {
           return password;
      }

       public void setName(String name) {
           this.name = name;
      }

       public void setUsername(String username) {
           this.username = username;
      }

       public void setPassword(String password) {
           this.password = password;
      }

       /*提供构造器*/
       public User(String name, String username, String password) {
           this.name = name;
           this.username = username;
           this.password = password;
      }

       public User(){
      }

       /*重写toString方法*/
       @Override
       public String toString() {
           return "User :" + " "
                   + "{id : " + id + " "
                   + "name : " + name + " "
                   + "username : " + username + " "
                   + "password : " + password + "}";
      }
    }

    编写WebsiteMapper接口:

        /*使用注解进行传参*/
       @Select("select * from user") //定义查询语句
       @Results(
              {
                       @Result(id = true, column = "id", property = "id"),
                       @Result(column = "name", property = "name"),
                       @Result(column = "sex", property = "sex"),
                       @Result(column = "age", property = "age")
              }
      ) //-->定义查询的字段对应到POJO对象的属性
       List<User> queryAllUser();
    @Insert注解

    编写WebsiteMapper接口:

        /*使用注解实现新增和插入功能*/
       @Insert("insert into user(id, name) values(#{id}, #{name})")
       public int insert(User user);

       @Insert("insert into user(name, age) values(#{name}, #{sex}, #{age}")
       int saveUser(User user);
    @Update注解

    编写WebsiteMapper接口:

        /*使用注解实现修改功能*/
       @Update("update user set name=#{name}, sex=#{sex}, age=#{age} where id=#{id}")
       void updateUserById(User user);
    @Delete注解

    编写WebsiteMapper接口:

        /*使用注解实现删除功能*/
       @Delete("delete from user where id=#{id}")
       void deleteById(User user);

    以上的注解都需要id字段的内容进行驱动。所以在此之前就需要先查询id字段的值。用到的标签为<selectKey>

    @SelectKey注解

    需求:

    插入一条数据后,使用 select last_insert_id() 可以获取到自增 id 的值

    编写WebsiteMapper接口:

        /*使用selectkey标签获取到插入数据后的id*/
       @Insert("insert into user(id, name) values(#{id}, #{name})")
       @SelectKey(
               statement = "select last_insert_id()", keyProperty = "id", keyColumn = "id", before = false, resultType = User.class)
       public int insert1(User user);

    各属性含义:

    • statement:表示需要运行的SQL语句

    • keyProperty:非必选,表示将查询结果赋值给代码中的哪个对象

    • keyColumn:非必选,表示将查询结果赋值给数据表中的哪一列

    • resultType:必选,指定SQL语句的返回值--->这是要注意,他指定的不是某个具体的类型

    • before

      • 默认值为true,执行插入语句之前执行函数

      • 值为false,执行插入语句之后,执行函数

    resultType再注解接口当中的声明:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //

    package org.apache.ibatis.annotations;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Repeatable;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.apache.ibatis.mapping.StatementType;

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    @Repeatable(SelectKey.List.class)
    public @interface SelectKey {
       Class<?> resultType();

       @Documented
       @Retention(RetentionPolicy.RUNTIME)
       @Target({ElementType.METHOD})
       public @interface List {
           SelectKey[] value();
      }
    }
    @Param注解

    示例:

        /*使用注解的方式通过WebsiteMapper接口发送SQL语句*/
       public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);

    结果集映射

    • @Results

    • @Result

    • @ResultMap


    三者关系:

    • @Results:声明一个自定义的结果集

    • @Result:声明结果集当中字段与属性的关系

    • @ResultMap:声明一条语句执行后返回的结果封装到什么对象当中

    @Results和@Result

    构造Student表:

    package com.junkingboy.bean;

    /**
    * @description:测试@Results和@Result注解的JavaBean对象
    * @data: 2021/11/5 14:16
    * @author: Lucifer
    */
    public class Student {
    private int id;
    private String name;
    private int classId;

    /*get和set方法*/
    public int getId() {
    return id;
    }

    public String getName() {
    return name;
    }

    public int getClassId() {
    return classId;
    }

    public void setName(String name) {
    this.name = name;
    }

    public void setClassId(int ClassId) {
    this.classId = ClassId;
    }

    /*提供toString方法*/
    @Override
    public String toString() {
    return "Student :" + " "
    + "{id :" + id + " "
    + "name :" + name + " "
    + "class_id :" + classId + "}";
    }

    /*提供带参和空参构造器*/
    public Student(String name, int class_id) {
    this.name = name;
    this.classId = class_id;
    }

    public Student() {
    }
    }

    编写WebsiteMapper接口:

        /*使用@Results、@Result注解进行接口调用*/
    @Select({"select id, name, class_id from student"})
    @Results(id = "studentMap", value = {
    @Result(column = "id", property = "id", jdbcType = JdbcType.INTEGER, id = true),
    @Result(column = "name", property = "name", jdbcType = JdbcType.VARCHAR),
    @Result(column = "class_id", property = "classId", jdbcType = JdbcType.INTEGER)
    })
    List<Student> selectAll(Student student);

    属性说明:

    • id声明结果集的标识。便于下面对结果集的引用

    • value表示结果集映射关系

    • @Result:代表一个字段的映射关系

      • cloumn指定数据库的字段名称

      • property指定实体类属性名称

      • jdbcType数据库字段类型

      • id默认为false,设置为true时表示主键--->该字段为表的主键

    @RresultMap

    作用:

    引用映射结果集,使用上面的@Results声明的id属性,编写WebsiteMapper接口:

        /*引用自定义结果集*/
    @Select({"select id, name, class_id from student where id=#{id}"})
    @ResultMap(value = "studentMap")
    Student selectById(Integer id);

    这样不需要每次声明结果集映射时都复制冗余代码,简化开发,提高了代码的复用性。

    关系映射

    • @one

    • @many


    一对一和一对多的映射都是@Result的一个属性。

    @one:一对一关系映射
    package com.junkingboy.mapper;

    import com.junkingboy.bean.Student;
    import org.apache.ibatis.annotations.*;
    import org.apache.ibatis.type.JdbcType;

    import java.util.List;

    /**
    * @description:对应操作Student表的Mapper接口
    * @data: 2021/11/5 14:57
    * @author: Lucifer
    */
    public interface StudentMapper {
    /*一对一的关系映射*/
    @Select("select * from student")
    @Results({
    @Result(id = true, property = "id", column = "id"),
    @Result(column = "name", property = "name"),
    @Result(column = "age", property = "age"),
    @Result(column = "id", property = "address", one = @One(
    select = "com.junkingboy.mapper.StudentMapper"
    ))
    })
    List<Student> getAllStudents();
    }
    @many:一对多关系映射
    package com.junkingboy.mapper;

    import com.junkingboy.bean.Class;
    import org.apache.ibatis.annotations.Many;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;

    /**
    * @description:操作Class表的接口方法
    * @data: 2021/11/5 15:58
    * @author: Lucifer
    */
    public interface ClassMapper {
    /*通过注解实现一对多的映射关系*/
    @Select("select * from t_class where id=#{id}")
    @Results(value = {
    @Result(column = "id", property = "id", id = true),
    @Result(column = "class_name", property = "className"),
    @Result(column = "student_name", property = "studentName", many = @Many(
    select = "com.junkingboy.mapper.StudentMapper.studentMap"
    ))
    })
    Class getClass(int id);
    }
    It's a lonely road!!!
  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15514869.html
Copyright © 2011-2022 走看看