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 :" + "\r\n"
               + "{id : " + id + "\r\n"
               + "name : " + name + "\r\n"
               + "username : " + username + "\r\n"
               + "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 :" + "\r\n"
+ "{id :" + id + "\r\n"
+ "name :" + name + "\r\n"
+ "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);
}

 

posted @ 2021-11-05 19:17  俊king  阅读(95)  评论(0编辑  收藏  举报