四、自定义mapper接口

自定义一个批量修改数据的接口方法。批量操作时需要配置如下图。

实体类Mapper

public interface EmployeeMapper extends MyMapper<Employee>,Mapper<Employee> {
}

MyMapper.java

    @UpdateProvider(
            type = MyBatchUpdateProvider.class,
            method = "dynamicSQL"
    )
    void batchUpdate(List<T> list);

MyBatchUpdateProvider.java

public class MyBatchUpdateProvider extends MapperTemplate {
    
    public MyBatchUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }
    
    /*
		<foreach collection="list" item="record" separator=";" >
			UPDATE table_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 ms) {
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append(
                "<foreach collection=\"list\" item=\"record\" separator=\";\" >");
        
        //获取实体类对应的Class对象
        Class<?> entityClass = super.getEntityClass(ms);
        String tableName = super.tableName(entityClass);
        //生成update子句
        String updateClause = SqlHelper.updateTable(entityClass, tableName);
        //获取所有字段信息
        Set<EntityColumn> columnSet = EntityHelper.getColumns(entityClass);
        Iterator iterator = columnSet.iterator();
        String idColumn=null;
        String idHolder=null;
        
        stringBuilder.append(updateClause);
        stringBuilder.append("<set>");
        while(iterator.hasNext()) {
            EntityColumn column = (EntityColumn)iterator.next();
            if (!column.isId() ) {
                //使用非主键字段拼接SET子句
                String columnName = column.getColumn();
                //返回格式如:#{record.age,jdbcType=NUMERIC,typeHandler=MyTypeHandler}
                String columnHolder = column.getColumnHolder("record");
                stringBuilder.append(columnName).append("=")
                        .append(columnHolder).append(",");
            } else if (column.isId()) {
                idColumn = column.getColumn();
                idHolder = column.getColumnHolder("record");
            }
        }
        stringBuilder.append("</set>");
        stringBuilder.append("where ").append(idColumn)
               .append("=").append(idHolder);
        stringBuilder.append("</foreach>");
        return stringBuilder.toString();
    }
}

spring-config.xml

    <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.my.maven.mappers"/>
        <!--自定义的mapper-->
        <property name="properties">
            <value>
                mappers=com.my.maven.myMapper.MyMapper
            </value>
        </property>
    </bean>

笔记整合,一起学习,一起进步~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值