首页 > 其他分享 >Mybatis通用Mapper接口扩展

Mybatis通用Mapper接口扩展

时间:2023-06-26 16:22:59浏览次数:43  
标签:Mapper builder 接口 empList record emp Mybatis public append

这里的扩展指的是通用Mapper没有提供的功能,如批量 update。

例子:
类似于生成下面这样的SQL语句:

UPDATE tabple_emp SET emp_name=?,emp_age=?,emp_salary=? where emp_id=? ;
UPDATE tabple_emp SET emp_name=?,emp_age=?,emp_salary=? where emp_id=? ;
UPDATE tabple_emp SET emp_name=?,emp_age=?,emp_salary=? where emp_id=? ;
……

为了生成上面那样的 SQL 语句,我们需要使用到 MyBatis 的 foreach 标签。

<foreach collection="list" item="record" separator=";" >
        UPDATE tabple_emp
        SET emp_name=#{record.empName},
        emp_age=#{record.empAge},
        emp_salary=#{record.empSalary}
        where emp_id=#{record.empId}
</foreach>

1.自定义一个接口

@RegisterMapper  //这个注解别忘了
public interface MyBatchUpdateMapper<T> {

    //method是固定值dynamicSQL,type指定具体提供sql语句的类
    @UpdateProvider(type=MyBatchUpdateProvider.class, method="dynamicSQL")
    void batchUpdate(List<T> list);
}

2.编写具体实现功能的类,类名为前面接口中type指的是类名,这个类必须继承MapperTemplate,重写构造方法

3.在类中提供一个和前面接口中同名的方法然后实现

public class MyBatchUpdateProvider extends MapperTemplate {

	//首先继承MapperTemplate,然后重写构造方法
	public MyBatchUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
		super(mapperClass, mapperHelper);
	}
	
	/*   目的就是让这个方法为我们拼接一个字符串:下面 ↓
		<foreach collection="list" item="record" separator=";" >
			UPDATE tabple_emp
			<set>
				emp_name=#{record.empName},
				emp_age=#{record.empAge},
				emp_salary=#{record.empSalary},
			</set>
			where emp_id=#{record.empId}
		</foreach>
	 */
	 //然后提供一个同名的实现方法
	public String batchUpdate(MappedStatement statement) {
		
		//1.创建StringBuilder用于拼接SQL语句的各个组成部分
		StringBuilder builder = new StringBuilder();
		
		//2.拼接foreach标签
		builder.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");
		
		//3.获取实体类对应的Class对象
		Class<?> entityClass = super.getEntityClass(statement);
		
		//4.获取实体类在数据库中对应的表名
		String tableName = super.tableName(entityClass);
		
		//5.生成update子句
		String updateClause = SqlHelper.updateTable(entityClass, tableName);
		
		builder.append(updateClause);
		
		builder.append("<set>");
		
		//6.获取所有字段信息
		Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
		
		String idColumn = null;
		String idHolder = null;
		
		for (EntityColumn entityColumn : columns) {
			
			boolean isPrimaryKey = entityColumn.isId();
			
			//7.判断当前字段是否为主键
			if(isPrimaryKey) {
				
				//8.缓存主键的字段名和字段值
				idColumn = entityColumn.getColumn();
				
				//※返回格式如:#{record.age,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
				idHolder = entityColumn.getColumnHolder("record");
				
			}else {
				
				//9.使用非主键字段拼接SET子句
				String column = entityColumn.getColumn();
				String columnHolder = entityColumn.getColumnHolder("record");
				
				builder.append(column).append("=").append(columnHolder).append(",");
				
			}
			
		}
		
		builder.append("</set>");
		
		//10.使用前面缓存的主键名、主键值拼接where子句
		builder.append("where ").append(idColumn).append("=").append(idHolder);
		
		builder.append("</foreach>");
		
		//11.将拼接好的字符串返回
		return builder.toString();
	}

}

4.我们可以定义的一个Mapper接口,并继承于之前定义的那个Mapper接口

public interface MyMapper<T> 
		extends SelectAllMapper<T>,SelectByExampleMapper<T>,
		MyBatchUpdateMapper<T> {//继承自己定义的接口
}

public interface EmployeeMapper extends Mapper<Employee> {
}

service

@Service
public class EmployeeService {
	
	@Autowired
	private EmployeeMapper employeeMapper;

	public void batchUpdateEmp(List<Employee> empList) {
		employeeMapper.batchUpdate(empList);
	}

}

这里MyMapper同样需要注册

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper.mappers"/>
    <property name="properties">
        <value>
            mappers=com.example.mapper.mine_mappers.MyMapper
        </value>
    </property>
</bean>

最后测试通过即可

ClassPathXmlApplicationContext iocContainer = new ClassPathXmlApplicationContext("spring-context.xml");
		
		EmployeeService employeeService = iocContainer.getBean(EmployeeService.class);
		
		List<Employee> empList = new ArrayList<>();
		
		empList.add(new Employee(25, "newName01", 111.11, 10));
		empList.add(new Employee(26, "newName02", 222.22, 20));
		empList.add(new Employee(27, "newName03", 333.33, 30));
		
		employeeService.batchUpdateEmp(empList);
		
		iocContainer.close();

 

标签:Mapper,builder,接口,empList,record,emp,Mybatis,public,append
From: https://www.cnblogs.com/snad/p/17505305.html

相关文章

  • mybatis中如何获取自增主键
    方法1:在insert标签中使用userGeneratedKeys和keyProperty标签:<insertid=”insertname”usegeneratedkeys=”true”keyproperty=”id”>insertintonames(name)values(#{name})</insert>useGeneratedKeys=true表示开启自动生成主键的功能,keyProperty="id"指......
  • Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(Distributed Management
    Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(DistributedManagementTaskForce)开发和维护。它基于RESTfulAPI设计,使用JSON或OData格式进行数据交换。Redfish旨在提供简化、灵活和可互操作的远程管理解决方案,取代或与传统的远程管理技术(如IPMI)配合使用。Redfish......
  • IPMI(Intelligent Platform Management Interface)是一种远程管理接口标准,用于监控和管
    IPMI(IntelligentPlatformManagementInterface)是一种远程管理接口标准,用于监控和管理计算机系统。它提供了一套标准的命令和协议,使管理员可以通过网络对服务器和其他支持IPMI的设备进行远程管理。IPMI为数据中心提供了以下主要功能:远程监控:IPMI允许管理员通过网络获取服务器的......
  • java实际开发中接口文档是自己写还是架构师写?
    软件工程的两种方法下,由后端决定接口都是不对的。第一种软件工程的方法:瀑布模型,自顶而下,逐步细化。接口会变,但是接口要提前设计。接口不是后端开发完成之后才“自然”产生的,那不是自然,而是无序。前后端分离的开发,应该是面向“API”的开发。API的设计并不能由前端或后端一方决定......
  • MyBatis 缓存
     MyBatis一级缓存1一级缓存原理在一次SqlSession中(数据库会话),程序执行多次查询,且查询条件完全相同,多次查询之间程序没有其他增删改操作,则第二次及后面的查询可以从缓存中获取数据,避免走数据库。 每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用......
  • 如何高效地使用text-embedding-ada-002接口
    1. 使用Batch进行Embedding:由于在使用嵌入模型时,前向传播可以一次性处理多个样本,因此可以尝试使用Batch在一次请求中处理多个文本样本。Batch大小可以根据具体的情况进行调整,并根据服务器的性能和配置进行优化。通常来说,适当增大Batch大小可以提高模型的处理效率和吞......
  • 07前后端项目上传gitee,后端多方式登录接口,发送短信功能,发送短信封装,短信验证码接口,短
    1前后端项目上传到gitee#公司里: -前端一个仓库---》一个团队-后端一个仓库---》一个团队-微服务:两三个人一个服务---》一个项目一个仓库-网上开源软件,前后端都在一起#在远端建立前端仓库#本地代码提交到远成仓库2后端多方式......
  • Windows Bluetooth Driver(Windows 蓝牙驱动程序)是一种用于在 Windows 操作系统上管理
    WindowsBluetoothDriver(Windows蓝牙驱动程序)是一种用于在Windows操作系统上管理和控制蓝牙设备的软件程序。它提供了与蓝牙硬件通信的接口,允许用户连接、配对和使用蓝牙设备,如键盘、鼠标、耳机、音箱等。Windows默认提供了内置的蓝牙驱动程序,可以通过操作系统自动更新或从......
  • 工厂工业自动化PLC扩展IO模块模拟量接口
    MxxxT工业远程以太网I/O数据采集模块是一种高性能、高可靠性的工业级设备,其具有多种输入输出接口,可以广泛应用于物联网产业链中的M2M行业以及自动化控制场合。本文将从该模块的特点、应用领域和优势等方面进行详细介绍。一、特点1.工业级电路设计:MxxxT采用工业级电路设计,具......
  • Microsoft ODBC Driver是由Microsoft开发的用于ODBC(开放式数据库连接)的驱动程序。ODBC
    MicrosoftODBCDriver是由Microsoft开发的用于ODBC(开放式数据库连接)的驱动程序。ODBC是一种标准的应用程序接口,用于通过数据库管理系统(DBMS)访问和处理数据库。MicrosoftODBCDriver为开发人员提供了与各种数据库进行连接和交互的功能。它支持多个数据库系统,包括MicrosoftSQLS......