zoukankan      html  css  js  c++  java
  • mybatis10 实现类代理对象开发

    mapper实现类代理对象开发
    要想让mybatis自动创建dao接口实现类的代理对象,必须遵循一些规则:
    SqlSession sqlSession = sqlSessionFactory.openSession();
    sqlSession.close();
    这2步好封装,代理类写死就可以了,以后自动生成就可以了。
    User user = sqlSession.selectOne("test.findUserById", id);不好封装,因为test.findUserById是变动的,难以通过代理自动生成。
    1、mapper.xml(UserMapper.xml)中namespace指定为mapper接口的全限定名
    <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
    此步骤目的:通过mapper.xml和mapper.java(UserMapper.java)进行关联。
    
    2、mapper.xml中statement的id就是mapper.java(UserMapper.java)中方法名
    
    3、mapper.xml中statement的parameterType和mapper.java(UserMapper.java)中方法输入参数类型一致
    
    4、mapper.xml中statement的resultType和mapper.java(UserMapper.java)中方法返回值类型一致.
    1.1.1mapper.xml(UserMapper.xml映射文件)
    mapper映射文件的命名方式建议:表名Mapper.xml
    namespace指定为mapper接口的全限定名

    Mapper(UserMapper.java)接口
    mybatis提出了mapper接口,相当 于dao 接口。
    
    mapper接口的命名方式建议:表名Mapper

    1.1.1将mapper.xml在SqlMapConfig.xml中加载

    mapper接口返回单个对象和集合对象
    不管查询记录是单条还是多条,在 statement中resultType定义一致,都是单条记录映射的pojo类型。
    mapper接口方法返回值,如果是返回的单个对象,返回值类型是pojo类型,生成的代理对象内部通过selectOne获取记录,如果返回值类型是集合对象,生成的代理对象内部通过selectList获取记录。

     测试:

        // 会话工厂
        private SqlSessionFactory sqlSessionFactory;
    
        // 创建工厂
        @Before
        public void init() throws IOException {
    
            // 配置文件(SqlMapConfig.xml)
            String resource = "SqlMapConfig.xml";
    
            // 加载配置文件到输入 流
            InputStream inputStream = Resources.getResourceAsStream(resource);
    
            // 创建会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
        }
    
        @Test
        public void testFindUserById() throws Exception {
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            User user = userMapper.findUserById(1);
    
            System.out.println(user);
    
        }
    
        @Test
        public void testFindUserByUsername() throws Exception {
    
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            List<User> list = userMapper.findUserByName("小明");
    
            System.out.println(list);
    
        }
    返回值的问题
    如果方法调用的statement,返回是多条记录,而mapper.java方法的返回值为pojo,此时代理对象通过selectOne调用,由于返回多条记录,所以报错:
    
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
    
    输入参数的问题
    使用mapper代理的方式开发,mapper接口方法输入参数只有一个,可扩展性是否很差??
    
    可扩展性没有问题,因为dao层就是通用的,可以通过扩展形参pojo(定义pojo包装类型)将不同的参数(可以是pojo也可以简单类型)传入进去。
  • 相关阅读:
    Taro api封装
    taro中如何定义全局变量
    移动端悬浮框可移动,可回弹,Vue and React
    VS2015 安装mvc4安装包以及vs2010 sp1后导致Razor语法失效代码不高亮(能正常运行)/视图页面无法智能提示(.cshtml)解决办法
    C#6.0新特性的尝试
    Visual Studio Code 添加设置代码段(snippet)
    AngularJs的$http发送POST请求,php无法接收Post的数据解决方案
    [Asp.net mvc] 在Asp.net mvc 中使用MiniProfiler
    [Asp.net mvc]实体更新异常:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。
    win8.1右键新建菜单添加新建php文件
  • 原文地址:https://www.cnblogs.com/yaowen/p/4869487.html
Copyright © 2011-2022 走看看