Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

在Spring+SpringMVC+MyBatis的整合开发中,MyBatis作为数据持久层框架起着至关重要的作用。MyBatis提供了灵活的数据库操作方式,其中原始Dao开发和mapper代理开发是两种常见的数据库访问实现方式。本文将深入探讨这两种开发方式,详细介绍它们的实现原理、开发步骤以及优缺点。

目录#

  1. MyBatis概述
  2. 原始Dao开发
    • 开发步骤
    • 代码示例
    • 优缺点分析
  3. Mapper代理开发
    • 开发规范
    • 代码示例
    • 优缺点分析
  4. 总结
  5. 参考资料

1. MyBatis概述#

MyBatis是一个优秀的基于Java的持久层框架,它内部封装了JDBC,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。MyBatis通过XML或注解的方式将数据库操作语句映射到Java对象上,实现了数据库操作的解耦,提高了开发效率。

2. 原始Dao开发#

2.1 开发步骤#

  1. 创建Dao接口:定义数据库操作的方法。
  2. 实现Dao接口:在实现类中通过SqlSession完成数据库操作。
  3. 配置映射文件:编写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 开发规范#

  1. Mapper接口方法名和映射文件中的SQL语句的id一致
  2. Mapper接口方法的输入参数类型和映射文件中SQL语句的parameterType一致
  3. Mapper接口方法的返回值类型和映射文件中SQL语句的resultType一致
  4. 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. 参考资料#