前言:
按照个人理解,mapper.xml文件实现继承分为两个方面的继承。
第一种:
对原有的mapper.xml文件实现扩展功能。也就是创建一个新的扩展mapper.xml文件,直接继承原有mapper.xml文件中的所有内容保持不变并在此基础上扩展新的功能。
场景举例:
原本有一个StudentMapper.java的mapper.xml文件,里面已经写好了新增、修改、查询功能的sql,但是此时需要对StudentMapper.java扩展实现一个新的功能(比如:删除的功能),条件是不允许更改原本StudentMapper.java的StudentMapper.xml文件,此时就需要创建一个新的mapper.xml文件,继承原有StudentMapper.java对应的StudentMapper.xml文件功能并新增实现学习功能。
代码实现:
首先我们是已经有一个StudentMapper.java和对应的StudentMapper.xml文件的,如下:
StudentMapper:
public interface StudentMapper {
//新增学生信息
Integer addStudentInfo(Student student);
//根据id删除学生信息(物理刪除)
Integer deleteStudentInfoById(Integer studentId);
//更新学生信息
Integer updateStudentInfo(Student student);
}
StudentMapper.xml:
上面是原有的代码内容,接下来就是继承原有mapper文件实现扩展功能的代码:
首先,创建一个StudentMapper.java的扩展接口命名为StudentExtMapper.java,在扩展接口StudentExtMapper.java中补充需要扩展的查询功能,并且StudentExtMapper.java需要继承StudentMapper.java,代码如下:
StudentExtMapper:
public interface StudentExtMapper extends StudentMapper{
//根据id查询学生信息
Student loadStudentInfoById(Integer studentId);
}
StudentExtMapper.xml:
这个时候同样需要创建StudentExtMapper对应的mapper文件,这是一一对应的映射关系,不能被改变的。
最关键的一步就是将原本的StudentMapper.xml文件中的namespace修改为StudentExtMapper接口的路径,因为StudentExtMapper已经继承了StudentMapper。
但是这个时候呢,StudentMapper.java中会报错,因为前面提到mapper接口与对应xml文件以及namespace是要保持一致的关系,这时需要进行最后一步操作,就是applicationContext.xml中配置,让StudentMapper.java不被扫描就可以了。
第二种
不需要继承整个mapper.xml文件,而是直接使用mapper.xml文件中的某个已定义好的公共sql语句。
比如说在一个mapper.xml文件中已经定义好了一个公告sql语句,如下:
直接在需要引入的mapper.xml文件中按照以下格式书写即可。使用include标签,refid属性的值必须是被引用的全包名和sql标签的id名