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语句;

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值