MyBatis总结三:使用动态代理实现dao接口

MyBatis总结三:使用动态代理实现dao接口

由于我们上一篇实现MyBatis的增删改查的接口实现类的方法都是通过sqlsession调用方法,参数也都类似,所以我们使用动态代理的方式来完善这一点

MyBatis动态代理生成dao的步骤:

  1. 编写数据管理的接口 XxxMapper.java

  2. 编写接口对应的配置文件 XxxxMapper.xml

    • namespace必须 和 dao接口的全路径保持一致  (即物理路径的文件夹名称相同)

    • statement的id必须 和 dao接口的方法名保持一致

    • statement的resultType类型 必须 和方法返回值类型保持一致

  3. 通过 sqlSession.getMapper(类的字节码对象) 获取代理之后的Mapper实现类对象

首先我们在之前项目的基础上编写Mapper接口(代替Dao接口):

package com.zy.mapper;

import com.zy.domain.User;

import java.util.List;

public interface UserMapper {
    /**
     * 根据id查询用户信息
     */
    public User getUserById(int id);

    /**
     * 查询所有用户信息
     */
    public List getUserList();

    /**
     * 添加用户信息
     */
    public void addUser(User user);

    /**
     * 修改用户信息
     */
    public void updateUser(User user);

    /**
     * 根据id删除用户信息
     */
    public void deleteUser(int id);
}

 mybatis-config.xml

xml version="1.0" encoding="UTF-8" ?>
DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    <properties resource="jdbc.properties"/>

    
    <typeAliases>
        <typeAlias type="com.zy.domain.User" alias="User">typeAlias>
    typeAliases>
    
    
    <environments default="development">
        
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            dataSource>
        environment>
    environments>

    
    <mappers>
        
        
        
        <package name="com.zy.mapper" />
    mappers>
configuration>

 

然后修改UserMapper.xml文件的物理路径以及内容:

由于我们mybatis-config里面映射器中使用的是package管理方式  所以mapper xml文件的物理路径需要跟其xml文件内的namespace值一致

所以把UserMapper.xml的位置改成如下:

这里需要注意一点 这个com.zy.mapper不是文件夹,是package,如果创建成普通文件夹的话,运行的时候会报 invalid bound statement (not found) 的错误

MyBatis总结三:使用动态代理实现dao接口_第1张图片

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">

<mapper namespace="com.zy.mapper.UserMapper">
    
    <select id="getUserById" parameterType="int" resultType="com.zy.domain.User">
        
        select * from user where id=#{id}
    select>
    
    <select id="getUserList" resultType="com.zy.domain.User">
        select * from user
    select>
    
    <insert id="addUser" parameterType="com.zy.domain.User">
        insert into user (id,name,age) values (null,#{name},#{age})
    insert>
    
    <update id="updateUser" parameterType="com.zy.domain.User">
        update user set name=#{name}, age=#{age} where id=#{id}
    update>
    
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    delete>
mapper>

 

然后进行单元测试(我们调用的时候 可以直接用接口调用方法执行sql语句了):

package com.zy.mapper;

import com.zy.dao.UserDaoTest;
import com.zy.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

import static org.junit.Assert.*;

public class UserMapperTest {
    UserMapper mapper;
    @Before
    public void setUp() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = UserDaoTest.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //使用反射
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void getUserById() throws Exception {
        User user = mapper.getUserById(1);
        System.out.println(user);
    }

    @Test
    public void getUserList() throws Exception {
        List list = mapper.getUserList();
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void addUser() throws Exception {
        User user = new User();
        user.setName("郭富城");
        user.setAge(18);
        mapper.addUser(user);
    }

    @Test
    public void updateUser() throws Exception {
        //先查
        User user = mapper.getUserById(2);
        //后改
        user.setName("黎明");
        user.setAge(17);
        mapper.updateUser(user);
    }

    @Test
    public void deleteUser() throws Exception {
        mapper.deleteUser(2);
    }

}

 

posted @ 2017-04-04 20:59 青衫仗剑 阅读( ...) 评论( ...) 编辑 收藏

你可能感兴趣的:(MyBatis总结三:使用动态代理实现dao接口)