前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法

【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法

作者头像
DannyHoo
发布2018-09-13 12:32:22
3220
发布2018-09-13 12:32:22
举报
文章被收录于专栏:Danny的专栏Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337140

  MyBatis常用的开发DAO的方式有两种,第一种就是常用的原始DAO的开发方法,第二种就是Mapper代理的方法。

原始DAO开发方法


  原始DAO开发方法就是之前文章《【MyBatis框架点滴】——初识+环境搭建》中的DAO实现方法,编写相应pojo的xml文件,定义DAO接口及其实现类,限于篇幅,这里不再copy-paste~

Mapper代理方法


  使用Mapper代理方法开发,与原始DAO开发方法类似,编写mapper配置文件(相当于User.xml)、定义Mapper接口(相当于DAO接口)。

  mapper配置文件:

  UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD iBatis Mapper 3.0 //EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="com.danny.mybatis.mapper.UserMapper">
    <select id="findUserById" parameterType="int"
        resultType="com.danny.mybatis.po.User">
        select * from user where id=#{id}
    </select>   

    <select id="findUserByName" parameterType="java.lang.String"
        resultType="com.danny.mybatis.po.User">
        select * from user where username like '%${value}%'
    </select>

    <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
    </insert>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>

    <update id="updateUser" parameterType="com.danny.mybatis.po.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
         where id=#{id} 
    </update>
</mapper>

   Mapper接口:

   UserMapper.java

package com.danny.mybatis.mapper;

import java.util.List;

import com.danny.mybatis.po.Person;
import com.danny.mybatis.po.User;
/**
 * @ClassName:UserMapper
 * @Description:用户Mapper
 * @author Danny
 * @date 2016年5月29日上午9:06:58
 */
public interface UserMapper {

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     * @throws Exception
     */
    public User findUserById(int id) throws Exception;

    /**
     * 根据用户名模糊查询用户信息
     * @param userName
     * @return
     * @throws Exception
     */

    public List<User> findUserByName (String userName) throws Exception;
    /**
     * 添加用户信息
     * @param user
     * @throws Exception
     */
    public int insertUser(User user) throws Exception;

    /**
     * 删除用户信息
     * @param id
     * @throws Exception
     */
    public void deleteUser(int id) throws Exception;

    /**
     * 
     * @param 更新用户
     * @throws Exception
     */
    public void updateUser(User user) throws Exception;
}

   如上,对表数据库进行操作时,不需要手动实现mapper接口中的方法(MyBatis框架根据接口定义创建接口的动态代理对象,代理对象的方法跟上面DAO接口的实现类方法类似),直接调用即可。

   比如:

SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.selectByPrimaryKey(1);
System.out.println(null==user?"":user.getUsername());

  但是编写mapper配置文件与mapper接口有如下几条约束:

   1、mapper配置文件中的namespace必须为mapper接口的全路径(这里为com.danny.mybatis.mapper.UserMapper)

   2、mapper接口中的方法名必须为mapper配置文件中statement的id(这里的findUserById、findUserByName等)

   3、mapper接口中方法的输入参数类型必须与mapper配置文件中statement的parameterType指定的类型一致

   4、mapper接口中方法的返回值类型必须与mapper配置文件中statement的resultType指定的类型一致。

  当查询结果返回单条数据时(比如上面的findUserById方法),代理对象内部通过SqlSession的selectOne方法执行查询;当查询结果返回集合时(比如上面的findUserByName方法),代理对象内部通过SqlSession的selectList方法执行查询。

小结


  在原始DAO开发方法中,操作数据库需要用SqlSession提供的方法,且SqlSession中有些方法的参数类型为Object类型,所以操作的时候传入的变量类型如果错误,在系统编译阶段无法暴露出来,增加开发负担。

  利用Mapper代理开发,除了避免编写mapper接口的实现类,mapper接口、mapper映射文件甚至pojo也可以通过mybatis代码生成器——MyBatisGenerator来自动生成,具有快速、高效的特点。


【 转载请注明出处——胡玉洋《【MyBatis框架点滴】——MyBatis开发DAO的两种方法:原始DAO开发方法和Mapper代理方法 》】

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年05月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档