Mybatis开发dao

作者: 城南一霸賈十七 | 来源:发表于2018-06-09 23:39 被阅读16次

    原始dao开发方法

    思路:编写daodaoimpl ,向dao注入 SqlSessionFactory,在方法体内通过 SqlSessionFactory创建SqlSession。与spring整合之后,直接定义 SqlSessionFactory属性就可以了。

    public class UserDaoImpl implements UserDao {
        // 通过构造方法传入SqlSessionFactory
        // 如果与Spring整合,直接通过注解和SqlSessionFactory属性就可以完成注入。
        private SqlSessionFactory sqlSessionFactory;
        public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
            this.sqlSessionFactory = sqlSessionFactory;
        }
        public User findUserById(int id) throws Exception {
            // SqlSession线程不安全,需要在内部创建。
            SqlSession sqlSession = sqlSessionFactory.openSession();
            /**
             * @param  参数一:调用sqlSession方法时,statement id 属于硬编码,
             * @param  参数二:类型属于泛型,在编译阶段不报错。,
             */
            User user = sqlSession.selectOne("com.zd.user.dao.UserMapper.findUserById", id);
            //session.commit();// 提交事务
            sqlSession.close();
            return user;
        }
    }
    

    原始dao开发存在的问题:

    • dao接口实现类存在大量模版方法,试图将这些代码提取出来。
    • 调用sqlSession方法时将statement的id硬编码了
    • 调用sqlSession方法时传入了泛型变量,编译时不报错

    使用mapper代理方法(只需要提供mapper接口(相当于dao接口))

    思路:

    • 编写mapper.xml映射文件
    • 编写mapper接口,需要遵循一些开发规范,就可以自动生成mapper接口实现类代理对象。
      • 开发规范:
        • mapper.xml中,namespace 等于mapper接口地址
        • mapper.java接口中方法名和mapper.xml中的statementid一致
        • mapper.java接口中方法输入参数类型和mapper.xml中的statementparameterType指定的类型一致
        • mapper.java接口中方法输入参数类型和mapper.xml中的statementresultType指定的类型一致
    // 拿到mapper代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.findUserById(1);
    
    • 代理对象内部调用selectOne selectList
      • mapper返回单个pojo,代理对象内部通过调用selectOne查询数据库
      • mapper返回集合对象,代理对象内部通过调用selectList查询数据库
    • 系统框架中,dao层的代码是被业务层公用的。即使mapper接口很自由一个参数,也可以通过包装类型pojo满足不通的业务方法需求。

    mybatis.xml全局配置文件

    • 将数据库的链接单独配置在db.properties中,只需要在mybatis.xml中加载即可。
    • properties:属性
    • typeHandler: 类型处理器
    • typeAliases类型别名
    • mapper:映射器*(mapper配置)
      • 通过resource或者url加载
      • 通过mapper接口加载映射文件
    <mappers>
            <mapper class="com.zd.user.dao.UserMapper"></mapper>
            <!--批量加载-->
            <!--<package name="com.zd.user.dao" ></package>-->
        </mappers>
    

    vo po pojo指代的含义:

    • vo:试图层面的对象 view object
    • po:持久层的对象
    • pojo:自定义的,类似po或vo的简单综合javabean

    输入输出映射

    • 输入映射,pojo的包装类型

    动态sql

    mybatissql语句灵活操作,通过表达式判断,对sql进行灵活拼接、组装。

    • if判断
    • sql片段
    • foreach

    需求:通过多个id查询用户。

    <select id="queryUserWhere" parameterType="com.zd.user.vo.UserQueryVo" resultType="com.zd.user.entity.User">
            select * from user where userCustom.sex = #{userCustom.sex} and user.name like '%${userCustom.name}%';
        </select>
    
        <select id="queryUsersByIds" >
            SELECT * from USER where 1=1 and (id=1 or id=10 or id=15) and ...
        </select>
        <!--
            id:sql片段的唯一标识
            经验:是基于单表来定义sql片段,这样sql片段的重用性才高,在sql片段中不要包括where
        -->
        <!-- 使用foreach遍历传入的ids
        collection:指定输入对象的集合
        item:每次遍历生成的对象
        open:开始遍历时拼接的串
        close:结束遍历时拼接的串
        separator:遍历的两个对象中需要拼接的串
        -->
        <sql id="query_user_where">
            <if test="user!= null">
                <if test="user.sex != null and user.sex!= ''">
                    and user.sex = #{user.sex}
                </if>
                <if test="user.name != null and user.name!=''">
                    and user.name like '%${user.name}%'
                </if>
                <if test="ids != null">
                    /*SELECT * from USER where 1=1 and (id=1 or id=10 or id=15) and ...*/
                    <foreach collection="ids" item="item_id" open="AND(" close=")" separator="or">
                        <!-- 每个遍历需要拼接的串-->
                        id=#{item_id}
                    </foreach>
                </if>
            </if>
    
        </sql>
    
    

    相关文章

      网友评论

        本文标题:Mybatis开发dao

        本文链接:https://www.haomeiwen.com/subject/nipxeftx.html