mybatis的两种Dao开发方式

Posted cyan-w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis的两种Dao开发方式相关的知识,希望对你有一定的参考价值。

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法

  1. 原始Dao

    使用MyBatis开发DAO实现以下的功能:根据用户id查询一个用户信息

    SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。

    通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。

    SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

    SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

    SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作方法。

    每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的(因为SqlSession底层对应的是Connection连接)。因此最佳的范围是请求或方法范围

  • 编写映射文件如下

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE mapper

    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <!-- namespace:命名空间,用于隔离sql -->

    <mapper namespace="test">

       <!-- 根据id查询用户 -->

       <select id="queryUserById" parameterType="Integer"

           resultType="com.mybatis.pojo.User">

           select * from user where id = #{id}

       </select>

    </mapper>
  • Dao接口

    public interface UserDao {

       /**

        * 根据id查询用户

        * @param id

        * @return

        */

       User queryUserById(int id);

    }
  • Dao实现类 publicclass UserDaoImpl implements UserDao {

       private SqlSessionFactory sqlSessionFactory;

       public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {

           super();

           this.sqlSessionFactory = sqlSessionFactory;

       }

       @Override

       public User queryUserById(intid) {

           // 创建SqlSession

           SqlSession sqlSession = this.sqlSessionFactory.openSession();

           // 执行查询逻辑

           User user = sqlSession.selectOne("test.queryUserById", id);

           // 释放资源

           sqlSession.close();

           returnuser;

       }

    }
  • Dao测试publicclass UserDaoTest {

       private SqlSessionFactory sqlSessionFactory;

       @Before

       publicvoid init() throws Exception {

           // 创建SqlSessionFactoryBuilder

           SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

           // 加载SqlMapConfig.xml配置文件

           InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

           // 创建SqlsessionFactory

           this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

       }

       @Test

       publicvoid testQueryUserById() {

           // 创建DAO

           UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);

           // 执行查询

           User user = userDao.queryUserById(2);

           System.out.println(user);

       }

    }
  1. 动态代理 Mapper动态代理方式

Mapper 动态代理开发方式只需要程序员开发 Mapper 接口(相当于 Dao 接口),Mybatis框架会根据接口定义创建接口的动态代理对象,代理对象的方法同 Dao接口实现类中的方法。

         Mapper 接口开发需要遵循以下 4 个规范:

  •                    Mapper 映射文件中的 namespace mapper 接口的类路径相同。
  •                    Mapper 接口方法名和 Mapper 映射文件中定义的每个 Sql id 相同
  •                    Mapper 接口方法的输入参数类型和 Mapper 映射文件中定义的每个 Sql  ParameterType 的类型相同
  •                    Mapper 接口方法的输出参数类型和 Mapper 映射文件中定义的每个 Sql  resultType 的类型相同

    采用动态代理的方法开发

        namespace必须写接口的全类名

        id属性必须与接口中的方法名称一致

            resultType:可以使用别名

            parameterType:也可以使用别名

定义Mapper映射文件UserMapper.xml,放在resourcesmapper目录下,

UserMapper.xml配置文件内容

技术分享图片

<!-- namespace:命名空间,用于隔离sql -->

<!-- 还有一个很重要的作用,使用动态代理开发DAO1. namespace必须和Mapper接口类路径一致 -->

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

   <!-- 查询所有用户 -->

   <!-- 2. id必须和Mapper接口方法名一致 -->

   <!-- 3. parameterType必须和接口方法参数类型一致 -->

   <!-- 4. resultType必须和接口方法返回值类型一致 -->

 

创建UserMapper接口代码如下:

技术分享图片技术分享图片

 

 

 

 

测试

public class UserMapperTest {

   private SqlSessionFactory sqlSessionFactory;

 

   @Before

   public void init() throws Exception {

       // 创建SqlSessionFactoryBuilder

       SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

       // 加载SqlMapConfig.xml配置文件

       InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

       // 创建SqlsessionFactory

       this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

   }

 

   @Test

   public void testQueryUserById() {

       // 获取sqlSession

       SqlSession sqlSession = this.sqlSessionFactory.openSession();

 

       // 从sqlSession中获取Mapper接口的代理对象

       UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

       // 执行查询方法

       List<User>users = userMapper.findAll();

      //遍历users

  //......

       sqlSession.close();

   }

}

 

以上是关于mybatis的两种Dao开发方式的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

Mybatis学习

MyBatis执行SQL的两种方式

MyBatis—传统 Dao开发方式分析

MyBatis注解开发的两种方法@Results和resultMap

mybatis开发dao的方式