您当前的位置: 首页 >  sql

止步前行

暂无认证

  • 3浏览

    0关注

    247博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Mybatis动态SQL详解

止步前行 发布时间:2018-07-02 14:32:59 ,浏览量:3

1、

作用:该标签自定义某个JavaBean的封装规则; 该标签有2个属性参数:

(1)、type:自定义规则的Java类型
(2)、id:唯一id方便引用

示例:


	
	
	
	

说明: id:定义主键,底层有优化; column:指定哪一列,指定判定的列名,数据库的字段值; property:指定对应的JavaBean属性;

使用示例:

查询接口如下:public Employee getEmpById(Integer id);对应的SQL的返回结果。



	select * from tbl_employee where id=#{id}

使用场景:

// Employee中有部门属性
public class Employee {
	String id;
	String lastName;
	String gender;
	Department departmen;
	...
}

场景一:查询Employee的同时查询出员工对应的部门信息?

public Employee getEmpAndDept(Integer id)

方式一:联合查询:级联属性封装结果集


	
	
	
	
	

方式二:使用association定义关联的单个对象的封装规则,association可以指定联合的JavaBean对象,该标签有2个属性,property,指定哪个属性是联合的对象; javaType:指定这个属性对象的类型[不能省略]


	
	
	

	
		
		
	

SQL语句:


	SELECT 
		e.id as id,e.last_name as last_name, e.gender as gender,
		e.d_id as d_id,	d.id as did,d.dept_name as dept_name 
	FROM tbl_employee e,tbl_dept d
	WHERE e.d_id=d.id AND e.id=#{id}

方式三:使用association进行分步查询:(☆☆☆☆)

第一步、先按照员工id查询员工信息;
第二步、根据查询员工信息中的d_id值去部门表查出部门信息;
第三步、部门设置到员工中;

 
 	
 	
 	
 	
 	
 	// select:表明当前属性是调用select指定的方法查出的结果
 	// column:指定将哪一列的值传给这个方法
	
	
 

流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性

 
 	select * from tbl_employee where id=#{id}
 	
 		and 1=1
 	
 
补充:鉴别器 discriminator

鉴别器的作用:mybatis可以使用discriminator来判断某列的值,然后根据某列的值改变来封装行为;

示例要求: 封装Employee:如果查出的是女生,就把部门信息查询出来,否则不查询; 如果是男生,把last_name这一列的值赋值给email

 
 	
 	
 	
 	

 	
 		
 		
 			
	 		
 		
 		
 		
	 		
		 	
		 	
		 	
 		
 	
 
2、动态SQL (1)、标签和标签的使用

标签作用:可以过滤掉条件语句中的第一个andor关键字。

查询员工,要求,携带了哪个字段查询条件就带上这个字段的值

public List getEmpsByConditionIf(Employee employee);

当 id 为 null 时,标签会去掉第一个多余的and

 
 	select * from tbl_employee
 	
	 	
	 		id=#{id}
	 	
	 	
	 		and last_name like #{lastName}
	 	
	 	
	 		and email=#{email}
	 	 
	 	
	 	
	 	 	and gender=#{gender}
	 	
 	
 

但是如果在写SQL时,把and写在后面时,标签就无能为力了,就像下面这样。

 
 	select * from tbl_employee
 	
	 	
	 		id=#{id} and
	 	
	 	
	 		last_name like #{lastName} and 
	 	
	 	
	 		email=#{email} and
	 	 
	 	
	 	 	gender=#{gender}
	 	
 	
 
(2)、标签的使用

作用:去掉拼完之后的字符串前面或后面多出的and或者or,where标签不能解决

参数:只能作用于trim标签体中是整个字符串拼串后的结果。

prefix="":前缀:给拼串后的整个字符串加一个前缀 ; prefixOverrides="": 前缀覆盖: 去掉整个字符串前面多余的字符; suffix="":后缀:给拼串后的整个字符串加一个后缀 ; suffixOverrides="": 后缀覆盖:去掉整个字符串后面多余的字符;

 
 	
 	select * from tbl_employee
	// 在拼接好的字符串前面加个 where,去掉最后一个and
 	
 		
	 		id=#{id} and
	 	
	 	
	 		last_name like #{lastName} and
	 	
	 	
	 		email=#{email} and
	 	 
	 	
	 	 	gender=#{gender}
	 	
	 
 
(3)、标签的使用

如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个。

 
 	select * from tbl_employee 
 	
 		
 			
 				id=#{id}
 			
 			
 				last_name like #{lastName}
 			
 			
 				email = #{email}
 			
 			
 				gender = 0
 			
 		
 	
 
(4)、标签的使用
 
 	update tbl_employee 
	
		
			last_name=#{lastName},
		
		
			email=#{email},
		
		
			gender=#{gender}
		
	
	where id=#{id} 
(5)、标签的使用

该标签有如下属性: collection:指定要遍历的集合,list类型的参数会特殊处理,封装在map中,map的key就叫list; item:将当前遍历出的元素赋值给指定的变量; separator:每个元素之间的分隔符; open:遍历出所有结果拼接一个开始的字符; close:遍历出所有结果拼接一个结束的字符; index:索引。遍历list的时候是:index就是索引,item就是当前值;遍历map的时候index表示的就是map的key,item就是map的值

public List getEmpsByConditionForeach(List ids);

 
 	select * from tbl_employee where id in 
 	
 		#{item_id}
 	
 

使用标签批量保存:

public void addEmps(@Param(“emps”)List emps);

由于MySQL下批量保存:可以foreach遍历;mysql支持values(),(),()语法 方式一:


 	insert into tbl_employee(
		
 	) 
	values
	
		(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
	
 

方式二:这种方式需要数据库连接属性allowMultiQueries=true; 这种分号分隔多个sql可以用于其他的批量操作(删除,修改)

 	
 		insert into tbl_employee(last_name,email,gender,d_id)
 		values(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
 	
(6)、标签的使用

抽取可重用的sql片段,方便后面引用 1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用 2、include来引用已经抽取的sql: 3、include还可以自定义一些property,sql标签内部就能使用自定义的属性 include-property:取值的正确方式${prop}, #{不能使用这种方式}

  
  		
  			employee_id,last_name,email
  		
  		
  			last_name,email,gender,d_id
  		
  
3、两个内置参数

说明:在sql中获取参数时,不只是方法传递过来的参数可以被用来判断,取值。mybatis中默认还有两个内置参数: 1)、_parameter:代表整个参数

 		单个参数:_parameter就是这个参数(对象就代表传过来的对象)
 		多个参数:参数会被封装为一个map;_parameter就是代表这个map

2)、_databaseId:如果配置了databaseIdProvider标签,databaseId就是代表当前数据库的别名mysql。

关注
打赏
1657848381
查看更多评论
立即登录/注册

微信扫码登录

0.0479s