MyBatis映射器注解

目录

一、映射器注解

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

2.常用的注解

二、基本注解

1.基本注解的分类

1.1 @Insert 新增

1.2 主键回填

1.3 主键自增

1.4 @Delete 删除 

1.5 @Update 更新 

2.传递多个参数的方式

三、结果映射注解

 1.@Results 结果映射

2.@Results 复用

3.一对一映射

3.1 一对一映射的实现案例

4.一对多映射

4.1 一对多映射的实现案例 

 四、动 态 S Q L 注 解

1.注解动态sql

1.1 脚本动态sql

1.2 @SelectProvider 的用法 

1.3 方法中构建动态sql SQL 语句构造器


一、映射器注解

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

繁琐 配置文件的书写本身繁琐,需要掌 握的内容比较多

不直观 配置文件和接口直接只是名称相同, 对应起来比较麻烦

2.常用的注解

基本注解实现简单的增删改查操作
结果映射注解 实现结果的映射关系, 也可以完成级联映射。
动态SQL注解 实现动态 SQL 的内容

二、基本注解

1.基本注解的分类

增加操作 @Insert 类似 < insert > 完成新增
删除操作 @Delete 类似 < delete > 完成删除
修改操作 @Update 类似 < update > 完成修改
查询操作 @Select 类似 < select > 完成查询
1.1 @Insert 新增

语法 : insert( " sql语句”)

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

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

@Insert("insert into student(sname,birthday,ssex,classid)"
			+"values(#{sname},#{birthday},#{ssex},#{classid})")
//主键回填
@Options(useGeneratedKeys = true,keyProperty = "sid")
public int addStudent(Student s);
1.2 主键回填

语法:Options(useGeneratedKeys = true,keyProperty = "主键属性")

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

1.3 主键自增

语法:SelectKey ( statement ="自增规则",keyProperty="主键属性",resultType =结果类型, before = true )
功能:完成自定义主键的自增;

1.4 @Delete 删除 

语法:@Delete ( " sql语句”)
功能:完成删除操作,类似配置文件的 元素;

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

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

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

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

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


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

1.6 @Selete 查询

语法:Selete ( " sql语句”)

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

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

@Select("select * from student where sid=#{v}")
public Student findStudentById(int sid);

@Select("select * from student")
public List<Student> findAllAtudent();

2.传递多个参数的方式

方法1:Map 方式 跟sqlmap一样

方法2:JavaBean 方式 跟sqlmap一样

方法3:@Param 方式 

//多参  1.javaBean 2.Map 3.param数(1) 4.args  5.@param
	@Select("select * from student where ssex=#{hehe} and classid=#{haha} limit #{weizhi},#{bc}")
	public List<Student> findStudentByssexAndClassidlimit(
			@Param("hehe") String ssex,
			@Param("haha")int classid,
			@Param("weizhi")int weizhi,
			@Param("bc")int buchang
			);

三、结果映射注解

 1.@Results 结果映射

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

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

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

2.@Results 复用

        跟sqlmap的xml配合使用 

语法:<resultMap id=”结果名称”>...</resultMap>ResultMap (“结果名称”)
跟当前接口中有定义使用id属性,每个sql 语句前要么有一个@Results映射关系,要 么要么@ResultMap,这两个不能同时给一 个sql语句

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

3.一对一映射

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

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

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

3.1 一对一映射的实现案例
//查询学生和班级信息 1对1
		@Results(id = "sc_Map",value= {
				@Result(column="classid",property="classid"),
				
				@Result(property = "bj",column="classid",
					one=@One(select= "com.xn.mapper.BanjiMapper.findBanjiByClassid"))
		})
		@Select("select * from student")
		public List<Student> findAllStudentAndClass();
		
		
		@Select("select * from student where classid=#{v}")
		public List<Student> findStudentBycalssid(int classid);
}

4.一对多映射

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

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

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

4.1 一对多映射的实现案例 
package com.ztt.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.ztt.bean.Banji;

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

 四、动 态 S Q L 注 解

1.注解动态sql

  • 脚本sql:XML配置方式的动态SQL,是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置
  • 方法中构建sql@SelectProvider@lnsertProvider@UpdateProvider@ DeleteProvider这些方法的使用
  • SQL 语句构造器实现动态 SQL 的内容

1.1 脚本动态sql

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

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

1.2 @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);	
	

1.3 方法中构建动态sql SQL 语句构造器

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

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

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

//方式3 构造器生成sql语句 将方式2进行了封装 --构造器
	@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 getSelectStudentSql(Student s) {
			String sql="select * from student where 1=1 ";
			
			if(s.getSsex()!=null){
				sql += "and sssex=#{ssex}";
				
			}
			if(s.getClassid()!=0){
				sql += "and classid=#{classid}";
				
			}
			
			
			return sql;
		}
		
		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}");
					}
					if (s.getSid() != 0) {
						WHERE("sid = #{sid}");
					}
				}
			}.toString();
		}
		public String getGzqDeleteStudentSql(int sid) {
			return new SQL() {
				{
					DELETE_FROM("student");
					WHERE("SID=#{V}");
				}
			}.toString();
		}
	

1.4 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" 列表中

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值