Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
在Spring+SpringMVC+MyBatis的整合开发中,MyBatis作为数据持久层框架起着至关重要的作用。MyBatis提供了灵活的数据库操作方式,其中原始Dao开发和mapper代理开发是两种常见的数据库访问实现方式。本文将深入探讨这两种开发方式,详细介绍它们的实现原理、开发步骤以及优缺点。
目录#
- MyBatis概述
- 原始Dao开发
- 开发步骤
- 代码示例
- 优缺点分析
- Mapper代理开发
- 开发规范
- 代码示例
- 优缺点分析
- 总结
- 参考资料
1. MyBatis概述#
MyBatis是一个优秀的基于Java的持久层框架,它内部封装了JDBC,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。MyBatis通过XML或注解的方式将数据库操作语句映射到Java对象上,实现了数据库操作的解耦,提高了开发效率。
2. 原始Dao开发#
2.1 开发步骤#
- 创建Dao接口:定义数据库操作的方法。
- 实现Dao接口:在实现类中通过SqlSession完成数据库操作。
- 配置映射文件:编写SQL语句,将其映射到Dao接口的方法上。
2.2 代码示例#
2.2.1 创建Dao接口#
public interface UserDao {
User findUserById(int id);
}2.2.2 实现Dao接口#
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}
}2.2.3 配置映射文件#
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>2.2.4 测试代码#
public class UserDaoTest {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(1);
System.out.println(user);
}
}2.3 优缺点分析#
- 优点:
- 实现简单,易于理解,适合初学者入门。
- 可以灵活控制SqlSession的生命周期和事务管理。
- 缺点:
- 代码冗余,需要编写大量的实现类和重复的SqlSession操作代码。
- 维护成本高,当业务逻辑复杂时,Dao实现类的代码会变得非常臃肿。
3. Mapper代理开发#
3.1 开发规范#
- Mapper接口方法名和映射文件中的SQL语句的id一致。
- Mapper接口方法的输入参数类型和映射文件中SQL语句的parameterType一致。
- Mapper接口方法的返回值类型和映射文件中SQL语句的resultType一致。
- Mapper接口的全限定名和映射文件的namespace一致。
3.2 代码示例#
3.2.1 创建Mapper接口#
public interface UserMapper {
User findUserById(int id);
}3.2.2 配置映射文件#
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>3.2.3 测试代码#
public class UserMapperTest {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
sqlSession.close();
}
}3.3 优缺点分析#
- 优点:
- 代码简洁,无需编写Dao实现类,减少了代码量。
- 符合面向接口编程的思想,提高了代码的可维护性和可扩展性。
- 缺点:
- 开发规范要求严格,需要遵循特定的命名规则和映射关系。
- 对于复杂的业务逻辑,可能需要使用注解或动态SQL来实现。
4. 总结#
原始Dao开发和mapper代理开发是MyBatis中两种不同的数据库访问实现方式。原始Dao开发适合初学者入门,能够深入理解MyBatis的底层原理;而mapper代理开发则更适合实际项目开发,能够提高开发效率和代码的可维护性。在实际开发中,我们可以根据具体的业务需求和项目规模选择合适的开发方式。
5. 参考资料#
- 《MyBatis从入门到精通》
- MyBatis官方文档:https://mybatis.org/mybatis-3/zh/index.html