欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > MyBatis映射器注解

MyBatis映射器注解

2025/10/5 19:29:54 来源:https://blog.csdn.net/m0_64481525/article/details/140851503  浏览:    关键词:MyBatis映射器注解

目录

一、映射器注解

1.映射器配置文件的缺陷

 2.常用的注解

二、基本注解

1.基本注解的分类

 2.@Insert 新增

2.1. 主键回填

2.2.主键自增

 3.@Delete 删除

4.@Update 更新

5. @Selete 查询

6. 传递多个参数的方式:

三、结果映射注解

1.@Results 结果映射

2.@Results 复用(两种方式)

3.一对一映射

4.一对多映射

四、动态SQL注解

1.注解动态sql

2.脚本动态sql

3.@SelectProvider 的用法

4.其他的动态 SQL 方法

5.方法中构建动态sql

6.SQL 语句构造器

7.SQL 语句构造器的常用方法

总结:


一、映射器注解

1.映射器配置文件的缺陷
  • 繁琐:配置文件的书写本身繁琐,需要掌握的内容比较多
  • 不直观:配置文件和接口直接只是名称相同,对应起来比较麻烦.
 2.常用的注解
  1. 基本注解:实现简单的增删改查操作。
  2. 结果映射注解:实现结果的映射关系, 也可以完成级联映射。
  3. 动态SQL注解:实现动态 SQL 的内容

二、基本注解

1.基本注解的分类

增加操作:@Insert 类似 < insert > 完成新增

删除操作:@Delete 类似 < delete > 完成删除

修改操作:@Update 类似 < update > 完成修改

查询操作:@Select 类似 < select > 完成查询

 2.@Insert 新增

语法:

        @Insert (“ sql 语句”)

功能:

        完成新增操作,类似配置文件的元素;

说明:

        新增时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map集合。

//接口:
@Insert("insert into student(sname,birthday,ssex,classid) values (#{sname},#{birthday},#{ssex},#{classid})")
public int addStudent(Student s);

 注意:这时候就不需要xml文件了!

2.1. 主键回填

语法

        @Options(useGeneratedKeys = true, keyProperty = "主键属性")

功能:完成数据库自增主键的回填;

	@Insert("insert into student(sname,birthday,ssex,classid) values (#{sname},#{birthday},#{ssex},#{classid})")@Options(useGeneratedKeys = true , keyProperty = "sid")public int addStudent(Student s);
2.2.主键自增

语法

        @SelectKey ( statement = "自增规则", keyProperty = "主键属性", resultType = 结果类型, before = true )

功能:完成自定义主键的自增;

 3.@Delete 删除

语法:

        @Delete (“ sql 语句”)

功能:完成删除操作,类似配置文件的 元素;

说明:删除时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。

	@Delete("delete from student where sid = #{v}")public int deleteStudent(int sid);
4.@Update 更新

语法:@Update (“ sql 语句”)

功能:完成更新操作,类似配置文件的 元素;

说明:更新时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。

	@Update("update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid}    where sid=#{sid}")public int updateStudent(Student s);
5. @Selete 查询

语法:@Selete (“ sql 语句”)

功能:完成查询操作,类似配置文件的 元素;

说明:查询时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。

	@Select("select * from student")public List<Student> findAllStudent();
	@Select("select * from student where sid = #{v}")public Student findStudentById(int sid);
6. 传递多个参数的方式:
  • 方法1:Map 方式 跟sqlmap一样
	//传递多参的方式:Map(不推荐,耦合度太高)public List<Student> findStudentByClassidAndSsexLimit(Map<String,Object> map);
  • 方法2:JavaBean 方式 跟sqlmap一样
	//传递多参的方式:javaBean对象public List<Student> findStudentByClassAndSsex(Student s);
  • 方式3:arg方式
	//传递多参的方式:arg数 数是从0开始 --> 和后面框架内置参数的名称public List<Student> findStudentByClassidAndSsexLimitArg(int classid,String ssex,int weizhi,int buchang);
  • 方法4:@Param 方式
	//传递多参的方式:param数 数从1开始 推荐public List<Student> findStudentByClassidAndSsexLimitParam(int classid,String ssex,int weizhi,int buchang);

三、结果映射注解

1.@Results 结果映射

语法:@Results({ @Result(id = 是否为主键, column = "字段", property = "属性" ) })

功能:完成数据库字段和 JavaBean 属性的映射关系;

说明:每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。

	@Results({@Result(column = "classid",property = "classid"),@Select("select * from student")public List<Student> findAllStudentAndClass();
2.@Results 复用(两种方式)

2.1跟sqlmap的xml配合使用

语法:

<resultMap id=”结果名称”>...</resultMap>

@ResultMap (“结果名称”)

2.2跟当前接口中有定义使用id属性,每个sql 语句前要么有一个@Results映射关系,要么要么@ResultMap,这两个不能同时给一 个sql语句

语法

以前定义过的@Results(id=“xxx”value={...})

@ResultMap (“xxx”)     

3.一对一映射

语法:

@One( Select = 一对一查询方法, fetchType = FetchType.EAGER )

功能:一对一的关系映射;

说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

实现类中: 

 

接口中:	
//查询学生和班级的信息,一对一 @Results({@Result(column = "classid",property = "classid"),//一对一@Result(property = "bj",column = "classid",one=@One(select = "com.zad.mapper.BanjiMapper.findBanjiByClassid"))})@Select("select * from student")public List<Student> findAllStudentAndClass();
4.一对多映射

语法:@Many( Select = 一对多查询方法, fetchType = FetchType.EAGER )

功能:一对多的关系映射;

说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

实现类中: 

 

接口中:@Select("select * from class where classid = #{v}")public Banji findBanjiByClassid(int classid);//一对多@Results({@Result(column = "classid",property = "classid"),@Result(property = "stulist",column = "classid",many=@Many(select="com.zad.mapper.StudentMapper.findStudentByClassid"))})@Select("select * from class")public List<Banji> findAllBanjiAndStu();

四、动态SQL注解

1.注解动态sql

(1)脚本sql:

XML配置方式的动态SQL,是用<script>的方式把它照搬过 来,用注解来实现。适用于xml 配置转换到注解配置


 (2)方法中构建sql:

@SelectProvider

@InsertProvider

@UpdateProvider

@DeleteProvider 这些方法的使用


 (3)SQL 语句构造器:

实现动态 SQL 的内容


2.脚本动态sql

在sql语句中加入标签,按照之前sqlmap中的动态sql的样式书写

	// 方式一 脚本sql@Select("<script>"+ "select * from student"+ "<where>"+ "<if test=\"ssex != null\"> and ssex = #{ssex}</if>"+ "<if test=\"classid != 0\"> and classid = #{classid}</if>"+ "</where>"+ "</script>")public List<Student> findStudent(Student s);
3.@SelectProvider 的用法

(1)创建 SQL 语句类:该类包含需要动态生成的 SQL 语句;

(2)创建Mapper接口类:该类和配置文件的接口文件一 样,用来处理数据库操作;

(3)利用@SelectProvider:将 SQL 语句类和 Mapper 接 口类关联,利用 @SelectProvider 的 type 属 性和 method 属性;

(4)测试验证:编写测试类,测试动态生成的 SQL 语句是否准确。

	// 方式二  在方法中创建动态sql语句@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")public List<Student> findStudentFunc(Student s);
4.其他的动态 SQL 方法

@InsertProvider:创建动态的 INSERT 语句

@UpdateProvider:创建动态的 UPDATE 语句

@DeleteProvider :创建动态的 DELETE 语句

5.方法中构建动态sql

在接口中定义内部类,来构建需要的动态sql语句,比使用标签的方式结构更加清晰

内部类: 

@SelectProvider(type = StudentSql.class, method = "getSelectStudentSql")public List<Student> findStudentFunc(Student s);
6.SQL 语句构造器

功能:解决 Java 代码中嵌入 SQL 语句,通过简单 地创建一个实例来调用方法生成SQL语句

特点:没有过多的使用类如 and的连接词

 

	// 方式三 构造器生成动态sql语句 将方式二进行封装-- 构造器@SelectProvider(type = StudentSql.class, method = "getGZQSelectStudentSql")public List<Student> findStudentGZQ(Student s);@InsertProvider(type = StudentSql.class, method = "getGZQInsertStudentSql")public int addStudentGZQ(Student s);@UpdateProvider(type = StudentSql.class, method = "getGZQUpdateStudentSql")public int updateStudentGZQ(Student s);@DeleteProvider(type = StudentSql.class, method = "getGZQDeleteStudentSql")public int deleteStudentGZQ(int sid);

内部类:

// 内部类class StudentSql{	public String getGZQSelectStudentSql(Student s) {return  new SQL() {{// 字段名SELECT("sid,sname");SELECT("birthday");SELECT("ssex,classid");// 表FROM("student");// 条件if(s.getSsex() != null) {WHERE("ssex = #{ssex}");}if(s.getClassid() != 0) {WHERE("classid = #{classid}");}}}.toString();}public String getGZQInsertStudentSql(Student s) {return new SQL() {{INSERT_INTO("student");if(s.getSid() != 0) {VALUES("sid","#{sid}");}if(s.getSname() != null) {VALUES("sname","#{sname}");}if(s.getBirthday() != null) {VALUES("birthday","#{birthday}");}if(s.getSsex() != null) {VALUES("ssex", "#{ssex}");}if(s.getClassid() != 0) {VALUES("classid", "#{classid}");}	}}.toString();	}public String getGZQUpdateStudentSql(Student s) {return new SQL() {{UPDATE("student");if(s.getSname() != null) {SET("sname = #{sname}");}if(s.getBirthday() != null) {SET("birthday=#{birthday}");}if(s.getSsex() != null) {SET("ssex= #{ssex}");}if(s.getClassid() != 0) {SET("classid=#{classid}");}WHERE("sid = #{sid}");	}				}.toString();}public String getGZQDeleteStudentSql(int sid) {return new SQL() {{DELETE_FROM("student");WHERE("sid = #{v}");}}.toString();}}
7.SQL 语句构造器的常用方法
属性名说明
SELECT开始或插入到 SELECT 子句,可以被多次调用,参数也会添加到 SELECT子句。
FROM开始或插入到 FROM 子句,可以被多次调用,参数也会添加到 FROM 子句
WHERE插入新的 WHERE 子句条件,可以多次被调用
OR / AND使用 OR / AND 来分隔当前的 WHERE 子句的条件
DELETE_FROM开始一个 delete 语句并指定需要从哪个表删除的表名。
INSERT_INTO开始一个 insert 语句并指定需要插入数据的表名
VALUES插入到 insert 语句中。第一个参数是要插入的列名,第二个参数则是该列的值。
UPDATE开始一个 update 语句并指定需要更新的表名
SET针对 update 语句,插入到 "set" 列表中

总结:

• @Insert ,@Delete,@Update,@Select 注解的功能

        • 分别完成新增,删除,修改和查询操作;

• @Results 注解和 @ResultMap 注解的功能

         • @Results 定义结果映射,@ResultMap 调用对应的结果映射;

• 动态 SQL 的注解

        • @SelectProvider 查询语句的动态SQL,@InsertProvider 新增语句的动态SQL,           @DeleteProvider 删除语句的动态SQL,@UpdateProvider 修改语句的动态SQL;

• SQL 语句构造器的功能

        • 解决 Java 代码中嵌入 SQL 语句,通过简单地创建一个实例来调用方法生成SQL语句;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词