码上敲享录 > Mybatis面试题 > Mybatis中的动态代理是什么?如何使用?

Mybatis中的动态代理是什么?如何使用?

上一章章节目录下一章 2023-07-16已有167人阅读 评论(0)

在 MyBatis 中,动态代理是一种将接口与其实现类进行绑定的机制,可以在运行时动态地生成代理对象来实现接口方法的调用。动态代理是 MyBatis 实现数据库访问的核心机制之一。


使用动态代理可以将数据库操作的实现与业务代码解耦,提供了一种更简洁、灵活的编程方式。在 MyBatis 中,动态代理通过 Java 的反射机制实现。


使用动态代理的步骤如下:


1. 创建 Mapper 接口:首先创建一个接口,该接口定义了数据库操作的方法,例如查询数据、插入数据、更新数据等。注意,方法的名称和参数与具体的 SQL 语句保持一致。


  ```java

  public interface UserMapper {

      User getUserById(Long id);

      void insertUser(User user);

      void updateUser(User user);

  }

  ```


2. 创建 Mapper XML 文件:在 MyBatis 的配置文件中,为每个 Mapper 接口创建对应的 Mapper XML 文件,该文件定义了具体的 SQL 语句和映射关系。


  ```xml

  <!-- UserMapper.xml -->

  <mapper namespace="com.example.UserMapper">

      <select id="getUserById" resultType="com.example.User">

          SELECT * FROM user WHERE id = #{id}

      </select>

      <insert id="insertUser" parameterType="com.example.User">

          INSERT INTO user (name, age) VALUES (#{name}, #{age})

      </insert>

      <update id="updateUser" parameterType="com.example.User">

          UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}

      </update>

  </mapper>

  ```


3. 配置 MyBatis:在 MyBatis 的配置文件中,配置数据库连接信息、Mapper 接口的包路径、Mapper XML 文件的位置等。


  ```xml

  <!-- mybatis-config.xml -->

  <configuration>

      <environments default="development">

          <environment id="development">

              <transactionManager type="JDBC"/>

              <dataSource type="POOLED">

                  <property name="driver" value="com.mysql.jdbc.Driver"/>

                  <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>

                  <property name="username" value="root"/>

                  <property name="password" value="password"/>

              </dataSource>

          </environment>

      </environments>

      <mappers>

          <mapper resource="com/example/UserMapper.xml"/>

      </mappers>

  </configuration>

  ```


4. 获取代理对象:在代码中,通过 MyBatis 的 `SqlSessionFactory` 获取代理对象。


  ```java

  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);

  ```


  通过以上步骤,`UserMapper` 的代理对象已经创建完成,可以直接调用接口中的方法来执行数据库操作。


  ```java

  User user = userMapper.getUserById(1L);

  ```


需要注意的是,使用动态代理时,接口的方法名必须与对应的 Mapper XML 文件中定义的 SQL 语句 id 保持一致,方法的参数与 SQL 语句中的参数保持一致。MyBatis 在底层会根据调用的接口方法动态生成 SQL 语句,并执行对应的数据库操作。


向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交