Mybatis(2)基于命名空间的接口编程方式

第一个例子用的是完全限定类名方式操作映射的sql语句:

User user = session.selectOne("com.mybatis.entity.UserMapper.selectUserByID",1);

Mybatis提供了使用接口方式操作已经映射的sql语句:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
1.搭建环境省略
2.创建接口
package com.mybatis.interfac;

import com.mybatis.entity.User;

public interface IUserMapper
{
    /**
     * 该方法名对应User.xml中查询语句的id,User.xml中的namespace对应该接口的路径 
     * com.mybatis.interfac.IUserMapper
     */
    public User selectUserByID(int id);
}

3.更改User.xml中的namespace

<?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对应接口路径,否则抛出异常:"...is not known to the MapperRegistr" 
    每个select中id对应接口中的一个方法名
 -->
<mapper namespace="com.mybatis.interfac.IUserMapper">
    <select id="selectUserByID" parameterType="int" resultType="User">
        select * from tb_user where id = #{id}
    </select>  
</mapper>

4.测试

package com.mybatis.test;

import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.mybatis.entity.User;
import com.mybatis.interfac.IUserMapper;

public class MybatisDemo
{
    //这里采用了静态单列模式确保SqlsessionFactory的唯一性,
    private static SqlSessionFactory sessionFactory=null;
    private static Reader reader=null;
    static
    {
        try
        {
            reader = Resources.getResourceAsReader("Configuration.xml");
            //从xml配置文件中构建sessionFactory
            sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    private static SqlSessionFactory getSessionFactory()
    {
        return sessionFactory;
    }
    
    public static void main(String[] args)
    {
        SqlSession session = null;
        try
        {
            session = getSessionFactory().openSession();
        
            //方式1:User user = session.selectOne("com.mybatis.entity.UserMapper.selectUserByID",1);

            //方法2:接口编程
            IUserMapper usermapper = session.getMapper(IUserMapper.class);
            User user = usermapper.selectUserByID(1);
            System.out.println(user.getUserAddress());
            
        } catch (Exception e)
        {
            e.printStackTrace();
        }finally
        {
            session.close();
        }
    }

}

注意:(官网文档)

1.命名空间,在之前版本的 MyBatis 中是可选项,非常混乱也没有帮助。现在,命名空间是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句

命名空间使得接口绑定成为可能.

 

2.基于接口方式的编程有很多优点:

首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转换,同时 IUserMapper接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。

 

posted @ 2014-03-16 19:07  菟丝子  阅读(1649)  评论(0编辑  收藏  举报

============================================================================== 
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员

==============================================================================