Mybatis 开发 dao 的方法

1、分析SqlSession使用范围

  1.1、SqlSessionFactoryBuilder 

  通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory

  将 SqlSessionFactoryBuilder 当成一个工具类使用即可,不需要使用单例管理 SqlSessionFactoryBuilder。

  在需要创建 SqlSessionFactory 时候,只需要 new 一次 SqlSessionFactoryBuilder 即可。

  1.2、SqlSessionFactory

  通过会话工厂 SqlSessionFactory 创建 SqlSession,通过单例模式管理 SqlSessionFactory(工厂一旦创建,一直使用一个实例)。

  将来 mybatis 和 spring 整合后,通过单例模式管理 SqlSessionFactory。

  1.3、SqlSession

  SqlSession 是一个面向用户(程序员)的接口。

  SqlSession 中提供了很多操作数据库的方法:selectOne(返回单个对象)、selectList(返回单个或多个对象)。

  SqlSession 是线程不安全的,在 SqlSession 实现类中除了有接口中的方法(操作数据库的方法),还有数据域的属性。

  SqlSession 最佳应用场合在方法体内,定义成局部变量。

2、原始 dao 的开发(程序员需要些 dao 接口和 dao 实现类)

  2.1、思路:

程序员需要些 dao 接口和 dao 实现类。

需要向 dao 实现类 中注入 SqlSessionFactory,在方法体内通过 SqlSessionFactory 创建 SqlSession

  

  2.2、dao接口:

public interface UserDao {

    // 根据id查询用户信息
    public User findUserById(int id) throws Exception;
    
    // 添加用户信息
    public void insertUser(User user) throws Exception;
    
    // 删除用户信息
    public void deleteUser(int id) throws Exception;
}

  2.3、dao层实现类:

public class UserDaoImpl implements UserDao {

    //向dao实现类中注入 SqlSessionFactory
    //通过构造方法注入
    private SqlSessionFactory sqlSessionFactory;
    
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById", id);
        // 释放资源
        sqlSession.close();
        return user;
    }

    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行插入的操作
        sqlSession.insert("test.insertUser", user);
        
        // 提交事务
        sqlSession.commit();
        
        // 释放资源
        sqlSession.close();
    }

    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行删除的操作
        sqlSession.insert("test.deleteUser", id);
        
        // 提交事务
        sqlSession.commit();
        
        // 释放资源
        sqlSession.close();
    }

}

  2.4、测试代码:

public class UserDaoImplTest {

    private SqlSessionFactory sqlSessionFactory;
    
    // 此方法是在执行 testFindUserById 之前执行
    @Before
    public void setUp() throws Exception{
        //创建sqlSessionFactory
        
        // mybatis配置文件
        String resource = "config/SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    @Test
    public void testFindUserById() throws Exception {
        // 创建UserDao对象
        UserDao userDao = new UserDaoImpl(sqlSessionFactory);
        
        // 调用UserDao的方法 
        User user = userDao.findUserById(1);
        
        System.out.println(user);
    }

}

  2.5、总结原始 dao 开发问题

  (1)dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

  (2)调用 sqlSession 方法时将 statement 的 id 硬编码。

  (3)调用 sqlSession 方法时传入的变量,由于sqlSession 方法使用泛型,即使变量类型传入错误,在编译阶段也不报错。 不利于程序员开发。

3、mapper代理方法(程序员只需要 mapper 接口——相当于 dao 接口)

  3.1、思路:

    程序员还需要编写 mapper.xml 映射文件(核心)

    程序员只需要编写 mapper 接口需要遵循一些开发规范,mybatis就可以自动生成 mapper 接口实现类代理对象

   

  3.2、mapper 开发规范:

    (1)在 mapper.xml 中,namespace 等于mapper接口的地址

    

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

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

      

    (4)mapper.java 接口中的方法返回值类型和 statement 的 resultType 的类型一致

      Mapper.xml 对比 Mapper.java

    

        

      

    总结——以上开发规范 主要是 对下边的代码 进行统一生成:

sqlSession.selectOne("test.findUserById", id);

sqlSession.selectList("test.findUserById", name);

sqlSession.insert("test.insertUser", user);

sqlSession.delete("test.deleteUser", id);

  3.3、mapper.java:

  

  3.4、mapper.xml:

  

  3.5、在 SqlMapConfig.xml 中加载 mapper.xml 文件

  

猜你喜欢

转载自www.cnblogs.com/xb1223/p/10198072.html