深入浅出Mybatis(四)使用mapper开发dao接口

在上一节使用原始的方式开发dao的时候存在着一些问题。

1.存在大量的重复代码。

2.调用sqlsession的方式时传入的statement的id硬编码了。

3.调用sqlsession的方法传入的变量由于sqlsession使用泛型即使传入错误在编译阶段也不报错,不利于开发。



mapper代理开发dao。

只需编写mapper接口和mapper.xml映射文件。

程序员只需编写mapper接口需要遵循的规范,mapper可以自动生成mapper接口实现类代理对象。

开发规范:

1.在mapper.xml中namespace等于mapper接口的地址。

2.mapper接口的方法名和mapper.xml中statement的id一致。

3.mapper接口中的方法的输入参数类型和mapper.xml中parameterType指定的类型一致。

4.mapper接口中的方法的返回值类型和mapper.xml中的resultType的类型一致。

依照此规范来开发一个我们自己的mapper。

在resource文件夹下面新建一个mapper文件夹并在其下面新建一个userMapper.xml文件。

创建一个mapper接口。


将原先sqlmap文件夹下面的userMapper中的内容复制过来,将namespace改成mapper接口的路径。


然后在SqlMapConfig.xml中引入这个文件


在mapper接口中新建一个根据id查询的方法。

public interface UserMapper {
    /**
    *   @author:kevin
    *   @Description:   根据id查询用户
    *   @Date:21:18 2018/3/28
    */
     User selectUser(int id) throws Exception;
}
<select id="selectUser" parameterType="int" resultType="com.beyond.mybatis.po.User">
        select * from user WHERE id = #{value}
    </select>

通过上面的方法可以看到。方法名和sql的id都是selectUser,方法的输入参数和sql输入参数都是int类型,方法的返回值和sql的返回值类型都是User。


下面来测试一下这个借口。

public class UserMapperTest {
    private SqlSessionFactory factory;
    @Before
    public void loadFactory() throws Exception{
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂
        factory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testfindUserById() throws Exception{
        SqlSession sqlSession = factory.openSession();
        //通过反射拿到UserMapper的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.selectUser(1);
        System.out.println(user);

    }
}

依照此方法可以编写剩下的方法。

public interface UserMapper {
    /**
    *   @author:kevin
    *   @Description:   根据id查询用户
    *   @Date:21:18 2018/3/28
    */
     User selectUser(int id) throws Exception;

     /**
     *   @author:kevin
     *   @Description:   根据用户名模糊查询查询用户
     *   @Date:21:18 2018/3/28
     */
    List<User> selectUserByName(String name) throws Exception;

    /**
     *   @author:kevin
     *   @Description:   插入用户
     *   @Date:21:18 2018/3/28
     */
    void insertUser(User user) throws Exception;
    /**
     *   @author:kevin
     *   @Description:   删除用户
     *   @Date:21:18 2018/3/28
     */
    void deleteUserById(int id) throws Exception;

    /**
     *   @author:kevin
     *   @Description:   更新用户
     *   @Date:21:18 2018/3/28
     */
    void updateUser(User user) throws Exception;

}

测试方法这里不再演示,可以仿照查询的那个测试。

当输入参数有多个的话,可以将其包装成一个pojo类,然后在这个类里面来封装输入参数。




猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/79734330