zoukankan      html  css  js  c++  java
  • 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();

       }

    }

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/Cyan-W/p/9865633.html
Copyright © 2011-2022 走看看