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

       }

    }

  • 相关阅读:
    Android 音视频开发(六): MediaCodec API 详解
    Android 音视频开发(五):使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
    Android 音视频开发(四):使用 Camera API 采集视频数据
    Android 音视频开发(三):使用 AudioTrack 播放PCM音频
    Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
    Android 音视频开发(一) : 通过三种方式绘制图片
    Android 使用View绘制文字(DrawText)技术总结
    Mac OS 中安装 autoconf 和 automake
    Android 自定义 View 绘制
    关于 Socket 设置 setSoTimeout 误用的说明
  • 原文地址:https://www.cnblogs.com/Cyan-W/p/9865633.html
Copyright © 2011-2022 走看看