zoukankan      html  css  js  c++  java
  • 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代理开发规范):

        程序员还需要编写 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 文件

      

      3.6、测试代码

    @Test
    public void testFindUserById() throws Exception {
    
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        // 创建一个 UserMapper对象,mybatis自动生成mapper代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    // 调用userMapper的方法
        User user = userMapper.findUserById(1);
        
        System.out.println(user);
        
    }

       

    3、一些问题的总结  

      3.1、代理对象内部调用 selectOne 或 selectList

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

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

      3.2、mapper 接口方法参数只能有一个,这是否影响系统开发  

        mapper 接口方法参数只能有一个,系统是否不利于维护,系统框架中,dao 层的代码是被业务层公用的。

        即使 mapper 接口只有一个参数,可以使用包装类型的 pojo 来满足不同的业务方法的需求。

        注意:持久层方法的参数可以用包装类型、map.....,service 方法中建议不要使用包装类型。(不利于我们业务层的可扩展性)

      

  • 相关阅读:
    streamsets 集成 cratedb 测试
    streamsets k8s 部署试用
    streamsets rest api 转换 graphql
    StreamSets sdc rpc 测试
    StreamSets 相关文章
    StreamSets 多线程 Pipelines
    StreamSets SDC RPC Pipelines说明
    StreamSets 管理 SDC Edge上的pipeline
    StreamSets 部署 Pipelines 到 SDC Edge
    StreamSets 设计Edge pipeline
  • 原文地址:https://www.cnblogs.com/xb1223/p/10198072.html
Copyright © 2011-2022 走看看