8月6日Spring Boot学习笔记
创始人
2024-11-04 21:05:52
0

MyBatis动态SQL

        动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

if标签

        SQL语句  当判断条件为 true 时,才会执行所包含的 SQL 语句。

choose、when和otherwise标签

where标签

        where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件。

set标签

        在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

 		update staff  		 			 				name=#{name}, 			 			 				salary=#{salary} 			 		 		 		 	id=#{id} 		 	

foreach标签

        foreach 标签用于循环语句,它很好的支持了数组和 List、set 接口的集合,并对此提供遍历的功能。

1.item:表示集合中每一个元素进行迭代时的别名。

2.index:指定一个名字,表示在迭代过程中每次迭代到的位置。

3.open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。

4.separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。

5.close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。

 		insert into staff(code,name,salary,username,userpass)  		values 		 			(#{item.code},#{item.name},#{item.salary},#{item.username},#{item.userpass}) 		  	

注意:使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

        1.如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。

        2.如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。

        3.如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

bind标签

        自定义一个上下文变量。

trim标签

        trim 一般用于去除 SQL 语句中多余的 AND 关键字、逗号,或者给 SQL 语句前拼接 where、set 等后缀,可用于选择性插入、更新、删除或者条件查询等操作。

resultMap元素

        resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。

一对一关联查询

        通过 元素的子元素 处理一对一级联关系

package com.easy.bean;  import java.io.Serializable; import java.math.BigDecimal;  import org.apache.ibatis.annotations.Param;   public class Staff implements Serializable{  	private int id; 	private int code; 	private String name; 	private BigDecimal salary; 	private String username; 	private String userpass; 	private Department dep; 	public Department getDep() { 		return dep; 	} 	public void setDep(Department dep) { 		this.dep = dep; 	} 	public int getId() { 		return id; 	} 	public void setId(int id) { 		this.id = id; 	} 	public int getCode() { 		return code; 	} 	public void setCode(int code) { 		this.code = code; 	} 	public String getName() { 		return name; 	} 	public void setName(String name) { 		this.name = name; 	} 	public BigDecimal getSalary() { 		return salary; 	} 	public void setSalary(BigDecimal salary) { 		this.salary = salary; 	} 	public String getUsername() { 		return username; 	} 	public void setUsername(String username) { 		this.username = username; 	} 	public String getUserpass() { 		return userpass; 	} 	public void setUserpass(String userpass) { 		this.userpass = userpass; 	} 	  } 
    	 	    	 	

元素中通常使用以下属性:

        1.property:指定映射到实体类的对象属性。

        2.column:指定表中对应的字段(即查询返回的列名)。

        3.javaType:指定映射到实体对象属性的类型。select里指定类型就没必要了。

        4.select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。

一对多关联查询

        通过 元素的子元素 处理一对多级联关系,collection 可以将关联查询的多条记录映射到一个 list 集合属性中。

package com.easy.bean;  import java.io.Serializable; import java.util.List;  public class Department implements Serializable{  	private List stafflist; 	 	public List getStafflist() { 		return stafflist; 	} 	public void setStafflist(List stafflist) { 		this.stafflist = stafflist; 	} 	private int id; 	private String code; 	private String name; 	public int getId() { 		return id; 	} 	public void setId(int id) { 		this.id = id; 	} 	public String getCode() { 		return code; 	} 	public void setCode(String code) { 		this.code = code; 	} 	public String getName() { 		return name; 	} 	public void setName(String name) { 		this.name = name; 	} 	 } 
  		 		 		 		 		 		 	 	 	 	

元素中通常使用属性与一致。

一对一映射属性

        
        
        

resultType和resultMap的区别

        MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。

MyBatis缓存(一级缓存和二级缓存)

        MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存

一级缓存

        一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 SQLsession 域内。当 session flush(刷新)或者 close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。

        在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

        由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

二级缓存

        二级缓存是全局缓存,作用域超出 SQLsession 范围之外,可以被所有 SqlSession 共享。手动开启,在会话关闭,数据更新(增删改)、应用重启、事务结束会清空。

属性说明:

使用一、二级缓存好处

        1.合理使用缓存可以显著提高应用程序的响应速度和处理能力。

        2.数据重用,减少MySQL负担

懒加载

        
        

相关内容

热门资讯

6分钟安卓版本!wpk俱乐部会... 6分钟安卓版本!wpk俱乐部会员管理软件,wepower软件靠谱,必备教程(有挂私人局)1、很好的工...
教你攻略(wePoKe)外挂透... 教你攻略(wePoKe)外挂透明挂辅助挂(线上德州有后台控制)其实真的有挂(有挂长期);1、完成线上...
6分钟熟悉!传奇扑克辅助,好运... 6分钟熟悉!传奇扑克辅助,好运大菠萝的确真的有挂,2025版教程(有挂发现)1、用户打开应用后不用登...
5分钟最新版!wepoke有规... 5分钟最新版!wepoke有规律,微扑克德州专用辅助器,德州论坛(有挂计算器)1、微扑克德州专用辅助...
辅助教程(哈糖大菠萝十三张)外... 辅助教程(哈糖大菠萝十三张)外挂透明挂辅助安装(德州ai机器人免费测试)果然真的有挂(有挂漏洞)1、...
五分钟熟悉!wepkoe有外挂... 五分钟熟悉!wepkoe有外挂,鱼扑克果然真的有挂,wepoke教程(有挂介绍);一、wepkoe有...
八分钟苹果版本!wepoke有... 八分钟苹果版本!wepoke有规律,wpk微扑克真的有助辅,2025新版教程(有挂方法)1、进入游戏...
新版8分钟!GG扑克辅助软件w... 新版8分钟!GG扑克辅助软件wepoke系统是免费的(本来真的有挂)-哔哩哔哩;wepoke系统是免...
可靠教程(AAPOker)外挂... 可靠教程(AAPOker)外挂透明挂辅助插件(wepower让系统发好牌)总是真的有挂(有挂后台);...
九分钟大厅!德扑ai智能机器人... 九分钟大厅!德扑ai智能机器人线上代打,wepoke软件还可以用,技巧教程(有挂教学)1)德扑ai智...