【JAVA - SSM】之MyBatis开发DAO

本文介绍了SSM框架中DAO层的两种开发方式:原始DAO开发和Mapper代理开发。原始DAO开发需要手动创建DAO接口及其实现类,而Mapper代理开发则利用MyBatis自动生成Mapper接口的代理对象,简化了开发过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件)。DAO开发(Mapper开发)有两种方式:原始DAO开发和Mapper代理代码。今天就来介绍一下这两种方式。


1、原始DAO开发

        原始DAO开发就是不仅需要创建DAO接口,还需要创建其实现类。代码如下:

        DAO接口中的代码如下:

public interface EmployeeDao {
	Employee findEmployeeById(int empNo) throws Exception;
	List<Employee> findEmployeeByName(String name) throws Exception;
	void insertEmployee(Employee employee) throws Exception;
	void updateEmployee(Employee employee) throws Exception;
	void deleteEmployee(int empNo) throws Exception;
}
        DAO实现类中的代码如下:

public class EmployeeDaoImpl implements EmployeeDao {
	private SqlSessionFactory factory;
		
	// 通过构造方法注入SqlSessionFactory对象
	public EmployeeDaoImpl(SqlSessionFactory factory) throws Exception {
		this.factory = factory;
	}

	@Override
	public Employee findEmployeeById(int empNo) throws Exception {
		SqlSession session = factory.openSession();
		Employee employee = session.selectOne("test.findEmployeeById", empNo);
		session.close();
		return employee;
	}

	@Override
	public List<Employee> findEmployeeByName(String name) throws Exception {
		SqlSession session = factory.openSession();
		List<Employee> list = session.selectList("test.findEmployeeByName", name);
		session.close();
		return list;
	}

	@Override
	public void insertEmployee(Employee employee) throws Exception {
		SqlSession session = factory.openSession();
		session.insert("test.insertEmployee", employee);
		session.commit();
		session.close();
	}

	@Override
	public void updateEmployee(Employee employee) throws Exception {
		SqlSession session = factory.openSession();
		session.update("test.updateEmployee", employee);
		session.commit();
		session.close();
	}

	@Override
	public void deleteEmployee(int empNo) throws Exception {
		SqlSession session = factory.openSession();
		session.delete("test.deleteEmployee", empNo);
		session.commit();
		session.close();
	}
}
        测试类代码如下:

public class EmployeeDaoImplTest {
	private SqlSessionFactory factory;

	// 此方法在执行下面的所有方法之前执行
	@Before
	public void setUp() throws Exception {
		// 创建SqlSessionFactory
		// MyBatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream is = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入MyBatis配置文件的信息
		factory = new SqlSessionFactoryBuilder().build(is);
	}

	@Test
	public void testFindEmployeeById() throws Exception {
		// 创建UserDao对象
		EmployeeDao dao = new EmployeeDaoImpl(factory);
		// 调用UserDao对象中的方法
		Employee employee = dao.findEmployeeById(7369);
		System.out.println(employee);
	}
}
从上面的代码中可以看到,原始DAO开发方法存在以下三个问题:

(1)DAO接口实现类中有大量的重复代码,如果把这些代码提取出来,可以大大减轻程序员的工作量。

(2)使用SqlSession的各个方法时都需要将statement的id以硬编码的方式写入到JAVA代码中,不利于维护。

(3)在调用SqlSession的各个方法时,即使参数类型错误,在编译阶段也不会报错,不利于程序debug。

针对上面的问题,我们推出Mapper代理方法开发DAO。


2、Mapper代理开发

        MyBatis可以自动生成Mapper接口的代理对象(即Mapper实现类),我们可以利用这一点来简化原始DAO开发的代码。 

        在Mapper代理开发DAO时,需要遵循以下四条开发规范:

        (1)Mapper.xml中的namespace是Mapper接口的全路径地址;

        (2)Mapper接口中的方法名和Mapper.xml文件中statement的id相同;

        (3)Mapper接口中方法的输入参数类型和Mapper.xml中statement的parameterType相同;

        (4)Mapper接口中方法的返回值类型和Mapper.xml中statement的resultType相同。


以下是代码:

Mapper.xml中的namespace代码:

<mapper namespace="com.itgungnir.hellomybatis.mapper.EmployeeMapper">
        ……
</mapper>
Mapper接口中的代码:

public interface EmployeeMapper {
	Employee findEmployeeById(int empNo) throws Exception;
	List<Employee> findEmployeeByName(String name) throws Exception;
	void insertEmployee(Employee employee) throws Exception;
	void updateEmployee(Employee employee) throws Exception;
	void deleteEmployee(int empNo) throws Exception;
}
测试代码:

public class EmployeeMapperTest {
	private SqlSessionFactory factory;

	// 此方法在执行下面的所有方法之前执行
	@Before
	public void setUp() throws Exception {
		// 创建SqlSessionFactory
		// MyBatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream is = Resources.getResourceAsStream(resource);
		// 创建会话工厂,传入MyBatis配置文件的信息
		factory = new SqlSessionFactoryBuilder().build(is);
	}

	@Test
	public void testFindEmployeeById() throws Exception {
		SqlSession session = factory.openSession();
		EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
		Employee employee = mapper.findEmployeeById(7369);
		session.close();
		System.out.println(employee);
	}
}
        由于Mapper代理方式简单,又避免了代码的硬编码,因此现在通常都使用这种方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值