注解分类
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方法*/
编写WebsiteMapper
接口:
/*使用注解进行传参*/
@Insert注解
编写WebsiteMapper
接口:
/*使用注解实现新增和插入功能*/
@Update注解
编写WebsiteMapper
接口:
/*使用注解实现修改功能*/
@Delete注解
编写WebsiteMapper
接口:
/*使用注解实现删除功能*/
以上的注解都需要id
字段的内容进行驱动。所以在此之前就需要先查询id
字段的值。用到的标签为<selectKey>
@SelectKey注解
需求:
插入一条数据后,使用 select last_insert_id() 可以获取到自增 id 的值
编写WebsiteMapper
接口:
/*使用selectkey标签获取到插入数据后的id*/
各属性含义:
-
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;
@Param注解
示例:
/*使用注解的方式通过WebsiteMapper接口发送SQL语句*/
public List<Website> selectWebsiteByAn(
结果集映射
@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);
}