解决Mapped Statements collection does not contain value for selectPersonByNo和改进方法

    科技2022-07-16  115

    这是今天在学习Mybatis时遇到的错误,搞了一下午 最后晚上终于整出来了,错误就是因为映射文件中的id和selectOne中的参数写的不一致

    造成这一异常的还有其他可能,搜了许多的博客,他们都是在说是因为Mybatis的配置文件中没有写映射文件 总之总算整完了,这MyBatis入门也太费事了吧orz。 更-----2020年10月5日17:37:53 为了使自己上面的情况再次发生,下面还有一种方案 编写一个接口:

    映射文件中(PersonMapper.xml): 接口中PersonMapper.java: namespaces=接口的全类名(eclipse)[namespaces=接口名(idea)] id =接口中的方法名 parameterType=方法中的参数类型 SQL语句中的参数=方法中的参数名 resultType=方法的返回值类型(若没有resultType时,返回值类型为void)

    编写好后,测试代码也需要改 原来的代码:

    Person person = session.selectOne("selectPersonByNo",2);

    更改过后

    PersonMapper personMapper = session.getMapper(PersonMapper.class); Person person = personMapper.selectPersonByNo(1); //session.commit();

    若要是进行增删改操作时需要进行session.commit操作。


    映射文件代码PersonMapper.xml

    <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="PersonMapper"> <select id="selectPersonByNo" parameterType="int" resultType="Person"> select * from person where no = #{no} </select> </mapper>

    Mybatis的配置文件Mybatis.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <!--事务提交的方式 JDBC:利用JDBC方式处理事务(commit,rollback,close) MANAGED:将事务交由其他组件去--> <transactionManager type="JDBC"/> <!--数据源类型: UNPOOLED:传统的JDBC模式(每次访问数据库,均需要打开,关闭数据库) POOLED:使用数据库连接池 JNDI:从tomcat中获取一个内置的数据库连接池 --> <dataSource type="POOLED"> <!-- 配置数据库信息--> <property name="driver" value="oracle.jdbc.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"/> <property name="username" value="scott"/> <property name="password" value="686900"/> </dataSource> </environment> </environments> <mappers> <!--加载映射文件--> <mapper resource="PersonMapper.xml"/> </mappers> </configuration>

    接口PersonMapper.java代码

    public interface PersonMapper { Person selectPersonByNo(int no); }

    测试代码:

    public static void selectPersonByNo()throws IOException { //加载Mybatis配置文件,为了访问数据库 Reader reader = Resources.getResourceAsReader("Mybatis.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); //这里的session相当于当时jdbc的connection SqlSession session = sqlSessionFactory.openSession(); // Person person = session.selectOne("selectPersonByNo",2); PersonMapper personMapper = session.getMapper(PersonMapper.class); Person person = personMapper.selectPersonByNo(1); System.out.println(person); session.close(); }
    Processed: 0.009, SQL: 8