String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
// 获取SqlSessionFactory
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession
SqlSession session = factory.openSession();
try {
//method1
//Student student = session.selectOne("cn.cgq.demo.mybatis.mapper.StudentMapper.selectStudent", 10);
//method2
StudentMapper mapper=session.getMapper(StudentMapper.class);
Student student=mapper.selectStudent(new Long(10));
//输出结果
System.out.println(student.toString());
} finally {
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}

在method1中可以通过SqlSession实例直接执行已映射的SQL语句

而在使用method2也是一种更直白的方式,有很多优势,首先它不是基于字符串常量的,就会更安全;

其次,如果你的 IDE 有代码补全功能,那么你可以在有了已映射 SQL 语句的基础之上利用这个功能。

使用对于给定 语句能够合理描述参数和返回值的接口(比如说BlogMapper.class),你现在不但可以执行更清晰和类型安全的代码,而且还不用担 心易错的字符串字面值以及强制类型转换。

首先需要创建一个StudentMapper的接口类,其中定义的方式,是StudentMapper.xml映射文件中的<select>标签的id属性,作为方法名,resultType作为返回值

这样代码对了,但是执行后会报错,报什么错呢

Type interface cn.cgq.demo.mybatis.bean.mapper.StudentMapper is not known to the MapperRegistry.

意思是这个接口没有注册,那么你就需要再mybatis-config.xml的配置文件中添加映射,

在<mappers>中添加<mapper class="你的那个接口类的完全包名+类名" /> //因为是class,所以跟resource不同,要用“.”

这样还是不够的,因为你还会报错

Invalid bound statement (not found): cn.cgq.demo.mybatis.bean.mapper.StudentMapper.selectStudent

就是它,说没有找到方法。在其他人的博客中说有四种情况,可能是这四种情况中出了问题


1.mapper的namespace写的不对!!!注意系修改。

2.UserDao的方法在UserDao.xml中没有,然后执行UserDao的方法会报此

3. UserDao的方法返回值是List<User>,而select元素没有正确配置ResultMap,或者只配置ResultType!

4. 如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行,保存.问题解决


然而,看了看,你会发现这都对啊,没有错,。那么你的可能就是忘了为方法添加注解

@Select("select * from Student where sid=#{sid}")
public Student selectStudent(Long sid);

你没有注解是找不到这个方法的,所以会告诉你(not found),那天津爱是那个注解之后,就没什么问题了,可以正常显示

总结下来,需要这几步

1.

 StudentMapper mapper=session.getMapper(StudentMapper.class);
Student student=mapper.selectStudent(new Long(10));

那当然,获得SqlSession是必须的

2.创建接口类,定义方法,方法名要和,StudentMapper.xml的配置文件<select>的id一样,返回值为resultType

3.为方法添加注解

4.添加在mybaits-config.xml文件添加类的映射

关于使用mybatis中mapper instrances,通过session另一种操作方式的更多相关文章

  1. mybatis中mapper接口的参数设置几种方法

    方法一:忽略parameterType,加@param("xxx")注解 在mapper接口中加上@param("xxx")注解,则在配置文件中直接用即可 Li ...

  2. MyBatis 中 Mapper 接口的使用原理

    MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...

  3. 逆向工程生成的mybatis中mapper文件。mapper接口,实例化成对象

    逆向工程生成的mybatis中mapper文件中,*mapper文件只是接口,而不是类文件.但是却可以通过spring的容器获得实例. 例如: //1.获得mapper代理对象,从spring容器获得 ...

  4. Mybatis中使用association进行关联的几种方式

    这里以一对一单向关联为例.对使用或不使用association的配置进行举例.  实体类: @Data @ToString @NoArgsConstructor public class IdCard ...

  5. Action中取得request,session的四种方式

    Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...

  6. mybatis 中mapper 的namespace有什么用

    原文:http://zhidao.baidu.com/link?url=ovFuTn7-02s7Qd40BOnwHImuPxNg8tXJF3nrx1SSngNY5e0CaSP1E4C9E5J6Xv5f ...

  7. 关于Mybatis中Mapper是使用XML还是注解的一些思考

    XML 据说可以灵活的进行注解,但是修改以后还是要重新发布程序.当然,你可以说,在Tomcat中改了,然后热加载了,不就可以了.可是一般情况下都是几台,十几台服务器.都是用发布系统,持续集成的方式部署 ...

  8. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  9. ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

随机推荐

  1. C++中的RAII技法

    Resource Acquisition Is Initialization or RAII, is a C++ programming technique which binds the life ...

  2. 利用moment为基础,基于DOM实现一个多个倒计时同时进行的js库方便使用

    moment非常强大,提供了很多时间方法的封装,项目需要一个小倒计时的功能,网上找了很多不合适,决定自己写一个,直接上代码 //定义一个立即执行的函数(function () { var Ticts= ...

  3. BZOJ2002(分块)

    Bounce 弹飞绵羊 Time Limit:10000MS     Memory Limit:265216KB     64bit IO Format:%lld & %llu Submit  ...

  4. java_XML_比较【转】

    JAVA解析XML的方式DOM.SAX.DOM4J.JDOM.StAX之详解与比较 1.各种方式的详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官 ...

  5. ERP的基础管理-物料编码

    在企业ERP系统中,物料编码管理是所有数据的基础,可以这样说:"没有物料编码就没有ERP".实际上物料编码对于制造类企业供应链管理作用不可说不巨大,影响不可谓不深远,甚至我们在考虑 ...

  6. angular1.5 Components

    如今前端界angular react vue三大框架并驾齐驱,其中有一个共同点就是组件化开发,这也符合w3c 推行Web Components的趋势.现如今不懂组件化开发的前端绝对不是好厨子.跳槽新公 ...

  7. 理解volatile

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  8. HashSet、LinkedHashSet、TreeSet使用区别

    HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代: Tree ...

  9. BZOJ 1198: [HNOI2006]军机调度(搜索)

    直接暴搜就行了= = CODE: #include<cstdio> #include<iostream> #include<cstring> #include< ...

  10. 以setTimeout来聊聊Event Loop

    平时的工作中,也许你会经常用到setTimeout这个方法,可是你真的了解setTimeout吗?本文想通过总结setTimeout的用法,顺便来探索javascript里面的事件执行机制. setT ...