zoukankan      html  css  js  c++  java
  • mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)

    mybatis开发dao的方法

      5.1 SqlSession使用范围

        5.1.1 SqlSessionFactoryBuilder

    通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory

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

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

      

        5.1.2 SqlSessionFactory

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

    将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。

      

        5.1.3 SqlSession

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

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

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

    struts中的action,接收参数需要在struts的类中通过成员变量定义来接收参数,如果用户提交了username属性,username就是一个数据域它放在成员变量里面就不可能用单例了,因为有可能多线程并发请求的话,每个线程共用了它们成员变量的值,这样导致我们访问冲突,所以说是不安全的,struts是多例管理的

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

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

        5.2.1 思路

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

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

        5.2.2 dao接口

      

        5.2.3 dao接口实现类

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

      

        5.2.4 测试代码:

        5.2.5 总结原始 dao开发问题

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

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

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

  • 相关阅读:
    你的系统需要做系统集成测试么?
    测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序
    RikMigrations 或 Migrator.NET 进行自动化的数据库升级
    单元测试
    C#反射
    J2EE--Struts2基础开发
    Dynamics CRM 客户端的插件调试
    于快速创建 IEqualityComparer<T> 实例的类 Equality<T>
    ToolBox Analysis & Design
    实现$.fn.extend 和$.extend函数
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8040340.html
Copyright © 2011-2022 走看看