首页 > 代码库 > mybatis开发dao的方法——(三)

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是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

 

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

 

-----------2.   原始dao开发方法(程序员需要写dao接口和dao实现类)--------

  

1.    思路

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

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

 

2.    dao接口

 

技术分享

 

 

 

3.dao实现类

public class UserDaoImpl implements UserDao {    // 需要向dao实现类中注入SqlSessionFactory    // 这里通过构造方法注入    private SqlSessionFactory sqlSessionFactory;    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {        this.sqlSessionFactory = sqlSessionFactory;    }    @Override    public User findUserById(int id) throws Exception {        SqlSession sqlSession = sqlSessionFactory.openSession();        User user = sqlSession.selectOne("test.findUserById", id);        // 释放资源        sqlSession.close();        return user;    }    @Override    public void insertUser(User user) throws Exception {        SqlSession sqlSession = sqlSessionFactory.openSession();        //执行插入操作        sqlSession.insert("test.insertUser", user);        // 提交事务        sqlSession.commit();        // 释放资源        sqlSession.close();    }    @Override    public void deleteUser(int id) throws Exception {        SqlSession sqlSession = sqlSessionFactory.openSession();        //执行插入操作        sqlSession.delete("test.deleteUser", id);        // 提交事务        sqlSession.commit();        // 释放资源        sqlSession.close();    }}

 

 

4.     测试代码:

技术分享

 

5.  原始 dao开发问题

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

 

2、调用sqlsession方法时将statement的id硬编码了

 

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

 

--------------3.   mapper代理开发程序员只需要写mapper接口----------------------

1    思路(mapper代理开发规范)

程序员还需要编写mapper.xml映射文件

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

开发规范:

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

技术分享

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

 

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

 

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

 

总结:

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

User user = sqlSession.selectOne("test.findUserById", id);

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

 

2.    mapper.java

  技术分享

 

3.    mapper.xml

  技术分享

4.    在SqlMapConfig.xml中加载mapper.xml

技术分享

 

5.测试

技术分享

 

 

6.总结:

如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。

如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。

 

mybatis开发dao的方法——(三)