• 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 方法中建议不要使用包装类型。(不利于我们业务层的可扩展性)

      

  • 相关阅读:
    react 调用webIm
    css样式问题解决
    学习animejs
    vue,在模块中动态添加dom节点,并监听
    vue 关于solt得用法
    vue-cli 安装过程出现错误
    处理参数中存在多个连续空格,只显示一个空格,复制后搜索不到得问题
    http StatusCode(状态码)
    修改表单小技巧
    关于swiper中包含表单元素的bug
  • 原文地址:https://www.cnblogs.com/xb1223/p/10198072.html
Copyright © 2020-2023  润新知