我爱编程

Mybatis开发dao

2018-06-09  本文已影响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开发存在的问题:

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

思路:

// 拿到mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);

mybatis.xml全局配置文件

<mappers>
        <mapper class="com.zd.user.dao.UserMapper"></mapper>
        <!--批量加载-->
        <!--<package name="com.zd.user.dao" ></package>-->
    </mappers>

vo po pojo指代的含义:

输入输出映射

动态sql

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

需求:通过多个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>

上一篇下一篇

猜你喜欢

热点阅读