【mybatis05】Mapper动态代理模式开发

不用写Dao接口的实现类了,直接使用接口,但是接口怎么使用?

  • 需要编写mapper.xml文件
  • 需要编写mapper接口(相当于Dao接口)
    mapper.xml文件就相当于之前的UserMapper.xml,不同的是namespace要写成mapper接口的全限定名

接口

public interface UserDao {
    /**
     * 查全部
     * @return
     */
    public List<User> findAll();
    /**
     * 保存用户
     * @param user
     */
    public void save(User user);

    /**
     * 更新用户
     * @param user
     */
    public void update(User user);

    /**
     * 根据id删除用户
     * @param id
     */
    public void del(Integer id);
}

接口映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    动态代理模式:规范必须遵守
        namespace:必须是对应接口的全限类名
        select|update|insert|delete: 四个标签 id必须对应dao接口的方法名
-->
<mapper namespace="com.itheima.dao.UserDao">
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>

    <insert id="save" parameterType="com.itheima.domain.User">
         insert into user values(null ,"${username}",#{password},#{sex},#{address},#{birthday})
    </insert>
</mapper>

由于接口与映射文件是对应的,所以:

  • mapper.xml中namespace要为接口的全限定名
  • 接口中方法名与映射文件中statement的id一致
  • 接口中输入参数类型与映射文件中parameterType一致
  • 接口中方法返回值类型与映射文件resultType一致

测试程序TestMybatisProxy.java

如何产生接口的实现类对象呢?
通过sqlSession的getMapper方法,参数传接口字节码对象(接口名.class)
自动创建mapper接口的代理对象

public class TestMybatisProxy {
    SqlSessionFactory sessionFactory;
    @Before
    public void init(){
        sessionFactory = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
    }

    @Test
    public void testFindAll(){
        SqlSession sqlSession = sessionFactory.openSession();
        //获取Dao接口的动态代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

    @Test
    public void testSave(){
        SqlSession sqlSession = sessionFactory.openSession();
        //获取Dao接口的动态代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        User user = new User();
        user.setUsername("小红");
        user.setAddress("通州");
        user.setBirthday("1990-08-08");
        user.setSex("女");
        user.setPassword("xiaohong");
        userDao.save(user);
        //提交
        sqlSession.commit();

        sqlSession.close();
    }
}

小总结:

与之前的差别在于,解决了传统Dao开发中的弊端,按照规范修改了配置文件,通过反射方式生成接口代理对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值