【MyBatis】Dao接口和Dao.xml文件如何建立连接

【MyBatis】Dao接口和Dao.xml文件如何建立连接

问题描述 在编写SSM框架的程序过程中,我们都知道有一个Dao层来建立与SQL的连接,但是,Dao层的接口里面并没有实现类。
如代码所示:

public interface DepartmentDao {
    public List<Department> search();
    public Department searchById(Integer id);
    public int add(Department dep);
    public int update(Department dep);
    public int delete(int id);
}

那么,问题来了
在我们调用Dao接口的时候是怎么通过Dao.xml文件和SQL建立联系的呢?

1.首先在程序运行开始时,MyBatis会检查配置文件Dao.xml,对文件进行解析,通过mapper标签对dao接口进行一对一的映射(namespace保持唯一)

<mapper namespace="com.alan.hrsys.dao.DepartmentDao">

2.再扫描xml文件其余的部分,xml文件的每个具体操作都通过id和Dao接口的操作名进行对应。相当于Dao接口是领导,告诉xml小弟,我要实现个莫子功能,然后xml具体和数据库对接操作。

Dao接口给出的功能

public List<Department> search();

Dao.xml使用SQL语句具体实现接口给出的功能

<!--配置数据库查找映射	,连接到实体类-->
	<select id="search" resultType="com.alan.hrsys.entity.Department">
		select * from department
	</select>

3.使用Dao接口进行代理
在设计模式中我们学到过,代理模式是代码之间解耦合的一种方式,具体内容打个比方,相当于领导(具体实现类)和秘书的关系。秘书一般坐在领导门外的办公桌上。当有事务需要领导处理时,首先需要进办公室的门(即接口)向秘书(代理类)汇报,秘书就可以对事务进行预处理(方便领导),过滤(如果找错领导了就不让小事打扰领导),转发(经过秘书前期处理后发现确实需要领导拍板,就把报告给领导批示),实现类实现后的后续操作(领导审批完之后再交给秘书去交接)
在这里插入图片描述

如何使用Dao接口代理呢?

  • 在Spring.xml文件里面进行配置,对存放有Dao接口的包进行扫描
    在这里插入图片描述
 <!-- mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.alan.hrsys.dao"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
  • 将 value="com.alan.hrsys.dao"路径底下(即Dao接口)全部扫描注册成Java Bean,并且将Bean class设置为MapperFactoryBean。
    (作用)在业务(service)层使用@Autowires注入Dao接口时返回getObject()对象,即通过代理模式,使用Dao接口后调用了Dao .xml文件中的具体实现类。
    代码如下
@Service
public class DepartmentServiceImpl implements DepartmentService {

	@Autowired
	DepartmentDao depDao;
	@Autowired
	EmployeeDao empDao;

	@Override
	public List<Department> search() {
		List<Department> list = depDao.search();
		return list;
	}

	@Override
	public Department searchById(Integer id) {
		Department dep = depDao.searchById(id);
		return dep;
	}

	@Override
	public boolean add(Department dep) {
		int rs = depDao.add(dep);
		return rs > 0;
	}

	@Override
	public boolean update(Department dep) {
		int rs = depDao.update(dep);
		return rs > 0;
	}

	@Override
	public boolean delete(Integer id) {
		int rs = depDao.delete(id);
		rs = empDao.updateByDep(id);
		return rs > 0;
	}

}

总结
当我们在业务层调用Dao接口时,实际上调用的时invoke方法,再通过

<mapper namespace="com.alan.hrsys.dao.DepartmentDao">

找到被代理的实现类,即DepartmentDao.xml文件,就可以对SQL语句进行愉快的操作啦~~

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋蒸

大哥大嫂过年好,打个赏再走叭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值