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>

相关文章

  • 原始dao开发方法及其弊端

    原始dao开发方法及其弊端 标签(空格分隔): MyBatis dao 开发方法 这里总结一下mybatis中原始...

  • mybatis框架

    mybatis 入门程序:用户的增删改查 mybatis 开发dao的两种方法 原始dao开发方法 mybaits...

  • spring和mybatis整合开发

    mybatis和mybatis整合的思路: 一、传统的方式开发dao 编写dao接口 编写dao接口实现类继承Sq...

  • Mybatis 开发 Dao

    前言 | 使用Mybatis 开发 dao,通常有两个方法,即原始 dao 开发方法和 Mapper 动态代理开发...

  • MyBatis入门(二)

    学习内容: 使用Mybatis开发Dao,通常有两个方法: 原生Dao开发 Mapper接口开发方法 1. 原生D...

  • Mybatis开发dao

    原始dao开发方法 思路:编写dao和daoimpl ,向dao注入 SqlSessionFactory,在方法体...

  • Mybatis学习笔记(三)_Dao方法的代理开发

    Web后端开发中需要开发DAO层,现在先来看看在Mybatis中原始方法开发DAO. 即是通过接口—实现类的方式来...

  • 高并发秒杀API(二)

    前言 本篇将完成DAO层的设计与开发,包括: 数据库、DAO实体与接口设计与编码 基于MyBatis实现DAO编程...

  • spring boot教程

    描述 集成mybatis 首先要引入mybatis依赖 注解式开发 编写dao层,在接口中使用注解开发。@Mapp...

  • MyBatis开发dao方法

    一 SqlSession使用范围 SqlSessionFactoryBuilder通过SqlSessionFact...

网友评论

    本文标题:Mybatis开发dao

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