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!!!
  • 相关阅读:
    线程原理
    【小白日记】JavaEE当中 JDBC通过Dao层实现增删改查 CRUD
    【小白日记】Java学习 JDBC通过 junit单元测试编写 CRUD 数据库的增删改查
    【转载】javaEE体系结构
    【小白日记】数据库中的CRUD sql 语句整理
    【小白日记】Java中关于使用JDBC连接Mysql数据库的笔记整理
    【小白日记】Java 多态中的两种类型转换
    待审核测试
    【小白日记】Java中多态的理解随记
    【小白日记】Attribute "scope" must be declared for element type "bean"问题解决方式 以及bean的理解 对Spring的初识和学习(4)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15514869.html
Copyright © 2011-2022 走看看