zoukankan      html  css  js  c++  java
  • 02-Mybatis的dao层实现原理

    1.Mybatis的Dao层实现

    1.1 传统开发方式

    1.1.1编写UserDao接口
    public interface UserDao {
        List<User> findAll() throws IOException;
    }
    
    1.1.2.编写UserDaoImpl实现
    public class UserDaoImpl implements UserDao {
        public List<User> findAll() throws IOException {
            InputStream resourceAsStream = 
                        Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactory sqlSessionFactory = new 
                        SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            List<User> userList = sqlSession.selectList("userMapper.findAll");
            sqlSession.close();
            return userList;
        }
    }
    
    1.1.3 测试传统方式
    @Test
    public void testTraditionDao() throws IOException {
        UserDao userDao = new UserDaoImpl();
        List<User> all = userDao.findAll();
        System.out.println(all);
    }
    
    

    1.2 代理开发方式

    1.2.1 代理开发方式介绍

    采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。

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

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

    1) Mapper.xml文件中的namespace与mapper接口的全限定名相同

    2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

    3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

    4) Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

    1.2.2 编写UserMapper接口

    1.2.3测试代理方式
    @Test
    public void testProxyDao() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获得MyBatis框架生成的UserMapper接口的实现类
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(1);
        System.out.println(user);
        sqlSession.close();
    }
    

    1.3 知识小结

    MyBatis的Dao层实现的两种方式:

    手动对Dao进行实现:传统开发方式

    代理方式对Dao进行实现:

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

    2.MyBatis映射文件深入

    2.1 动态sql语句

    2.1.1动态sql语句概述

    Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。

    参考的官方文档,描述如下:

    2.1.2动态 SQL 之<if>

    我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

    <select id="findByCondition" parameterType="user" resultType="user">
        select * from User
        <where>
            <if test="id!=0">
                and id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
        </where>
    </select>
    
    

    当查询条件id和username都存在时,控制台打印的sql语句如下:

         … … …
         //获得MyBatis框架生成的UserMapper接口的实现类
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User condition = new User();
        condition.setId(1);
        condition.setUsername("lucy");
        User user = userMapper.findByCondition(condition);
        … … …
    

    当查询条件只有id存在时,控制台打印的sql语句如下:

     … … …
     //获得MyBatis框架生成的UserMapper接口的实现类
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    User condition = new User();
    condition.setId(1);
    User user = userMapper.findByCondition(condition);
    … … …
    
    

    2.1.3 动态 SQL 之<foreach>

    循环执行sql的拼接操作,例如:SELECT * FROM USER WHERE id IN (1,2,5)。

    <select id="findByIds" parameterType="list" resultType="user">
       select * from User
       <where>
           <foreach collection="array" open="id in(" close=")" item="id" separator=",">
               #{id}
           </foreach>
       </where>
    </select>
    

    测试代码片段如下:

     … … …
     //获得MyBatis框架生成的UserMapper接口的实现类
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    int[] ids = new int[]{2,5};
    List<User> userList = userMapper.findByIds(ids);
    System.out.println(userList);
    … … …
    
    

    foreach标签的属性含义如下:

    标签用于遍历集合,它的属性:

    •collection:代表要遍历的集合元素,注意编写时不要写#{}

    •open:代表语句的开始部分

    •close:代表结束部分

    •item:代表遍历集合的每个元素,生成的变量名

    •sperator:代表分隔符

    2.2 SQL片段抽取

    Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

    <!--抽取sql片段简化编写-->
    <sql id="selectUser" select * from User</sql>
    <select id="findById" parameterType="int" resultType="user">
        <include refid="selectUser"></include> where id=#{id}
    </select>
    <select id="findByIds" parameterType="list" resultType="user">
        <include refid="selectUser"></include>
        <where>
            <foreach collection="array" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
    

    2.3 知识小结

    MyBatis映射文件配置:

  • 相关阅读:
    奇数阶魔方问题
    《DSP using MATLAB》示例9.3
    《DSP using MATLAB》示例9.2
    《DSP using MATLAB》示例9.1
    找个目标很重要
    《DSP using MATLAB》示例Example 8.30
    《DSP using MATLAB》示例Example 8.29
    《DSP using MATLAB》示例Example 8.28
    《DSP using MATLAB》示例Example 8.27
    《DSP using MATLAB》示例Example 8.26
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/14427021.html
Copyright © 2011-2022 走看看