MyBatis 的前生为Apache的开源项目iBatis。其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口。
目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql,它只需要一个接口和XML(或者注解)。MyBatis提供自动映射、动态SQL、级联、缓存、注解、代码和SQL分离等特性,使用很方便,还能够对SQL就行优化。因为其具有封装少、映射多样化、支持存储过程、可以进行SQL优化等特点,使得它替代了Hibernate成为Java互联网中首选的持久框架。
下面简单介绍一下。

实体类Student

  1. public class Student {
  2. private int stuId;
  3. private String stuName;
  4. private String stuClass;
  5.  
  6. public int getStuId() {
  7. return stuId;
  8. }
  9.  
  10. public void setStuId(int stuId) {
  11. this.stuId = stuId;
  12. }
  13.  
  14. public String getStuName() {
  15. return stuName;
  16. }
  17.  
  18. public void setStuName(String stuName) {
  19. this.stuName = stuName;
  20. }
  21.  
  22. public String getStuClass() {
  23. return stuClass;
  24. }
  25.  
  26. public void setStuClass(String stuClass) {
  27. this.stuClass = stuClass;
  28. }
  29.  
  30. @Override
  31. public String toString() {
  32. return "Student [stuId=" + stuId + ", stuName=" + stuName + ", stuClass=" + stuClass + "]";
  33. }
  34.  
  35. }

1:xml方式进行数据库查询操作

  1. <!DOCTYPE mapper
  2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.zhao.dao.StudentDao">
  5. <select id="queryById" parameterType="int" resultType="Student">
  6. select * from student where stu_id=#{stuId}
  7. </select>
  8. </mapper>

先进行测试

  1. private InputStream inputStream;
  2. private SqlSessionFactory sqlSessionFactory;
  3. private SqlSession sqlSession;
  4. @Before
  5. public void before(){
  6. inputStream=StudentTest.class.getClassLoader().getResourceAsStream(resource);
  7. sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
  8. sqlSession=sqlSessionFactory.openSession();
  9. }
  10. @After
  11. public void after(){
  12. sqlSession.close();
  13. }
  14. @Test
  15. public void testXmlQueryById() {
  16. Student student=(Student)sqlSession.selectOne("com.zhao.dao.StudentDao.queryById", 1);
  17. System.out.println(student);
  18. }

xml的方式操作数据库,用了SqlSession的selectOne方法。

public abstract <T> T selectOne(String paramString, Object paramObject);

当然,我们在mybatis的配置文件中,定义了类的别名、StudentDao.xml 以及数据库

  1. <mappers>
  2. <mapper resource="com/zhao/mapper/StudentDao.xml"/>
  3. </mappers>

现在我们能查到结果

Student [stuId=1, stuName=ZHAO, stuClass=Java10班]

2:在dao层使用注解


  1. @Select("select * from student where stu_id=#{stuId}")
  2. public Student queryById(int stuId);
  3. }

为了避免混淆,再修改一下配置文件

  1. <mappers>
  2. <mapper class="com.zhao.dao.StudentDao"/>
  3. </mappers>

然后再进行测试

  1. @Test
  2. public void testAnnotationQueryById(){
  3. StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  4. Student student=studentDao.queryById(1);
  5. System.out.println(student);
  6. }

我们可以看到,是用了SqlSession的getMapper方法得到了一个Dao层接口对象,然后调用了其中的queryById方法查到的结果。

目前来看:

  xml和dao层注解之间并没有什么联系,是两个不同的查询方式。

  但是xml的配置比较简单,但是使用起来比较繁琐。而dao层注解需要在代码上进行操作,看起来也不舒服。

3:xml+dao

并不需要修改测试类

  1. @Test
  2. public void testAnnotationQueryById(){
  3. StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
  4. Student student=studentDao.queryById(1);
  5. System.out.println(student);
  6. }

这里跟用注解是一样的。不过Dao层接口中注解已经被我删除了

  1. public interface StudentDao {
  2. public Student queryById(int stuId);
  3. }

现在需要把xml和dao 联系起来

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.zhao.dao.StudentDao">
  6. <select id="queryById" parameterType="int" resultType="Student">
  7. select * from student where stu_id=#{stuId}
  8. </select>
  9. </mapper>

其实我并没有修改这个mapper文件,我们可以看到 mapper便签的namespace属性就是Dao层接口的全路径,select的id属性就是Dao层接口的相应方法,这些名字都是一样的。当然 也必须是一样的。

然后修改配置文件

  1. <mappers>
  2. <mapper resource="com/zhao/mapper/StudentDao.xml"/>
  3. </mappers>

这样做就是为了让xml和dao能组合起来。配置文件中配置的是xml。但是这个xml指向了一个接口。我们在用的时候通过接口来进行相应操作,会更加清晰明了。在xml中修改sql代码也很舒服。

MyBatis框架的XML数据访问Dao层接口的组合使用的更多相关文章

  1. mapper.xml是怎样实现Dao层接口

    上午写了一个简单的 从xml读取信息实例化一个Bean对象.下午就开始想mybatis是怎么通过xml文件来实现dao层接口的,一开始想直接用Class.forName(String name)然后调 ...

  2. PDO数据访问抽象层

    PDO数据访问抽象层: 我们使用的mysqli是针对mysql这个数据库扩展的一个类,如果要用到别的数据库的话就可以用PDO来做 1.操作数据库 先来代码 <!--PDO--> <! ...

  3. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站

    用saxon框架对xml数据进行过滤 博客分类: Java   Saxon 是一个 XSLT 和XQuery处理器.它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一 ...

  5. PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05

    之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...

  6. PHP中关于PDO数据访问抽象层的功能操作

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...

  7. PDO:数据访问抽象层

    <?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...

  8. iBatis——自动生成DAO层接口提供操作函数(详解)

    iBatis——自动生成DAO层接口提供操作函数(详解) 在使用iBatis进行持久层管理时,发现在使用DAO层的updateByPrimaryKey.updateByPrimaryKeySelect ...

  9. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

随机推荐

  1. BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...

  2. P4147玉蟾宫——最大子矩阵

    悬线法裸题. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  3. Code-NFine:.NET快速开发平台 NFine.Framework Web框架

    ylbtech-Code-NFine:.NET快速开发平台 NFine.Framework Web框架 1.NFine.Framework 详细介绍返回顶部 1. NFine 是基于 C# 语言的极速 ...

  4. myeclipse配置

    windows->preference->MyEclipse->servers->tomcat 选项下 Tomcat 6.x 点 enable 设置tomcat directo ...

  5. hadoop各组件安装(非专业人士,不定期更新)

    压缩包下载http://www.cnblogs.com/bfmq/p/6027202.html 1.zookeepermkdir /usr/local/hadooptar zxf /root/zook ...

  6. 解决warning: LF will be replaced by CRLF in **(filename)

    使用Windows的Git使用 git add 时出现warning: LF will be replaced by CRLF in **(filename) 原因: CRLF -- Carriage ...

  7. 用于生成交易统计时间戳(常配合echarts走势图使用)

    <?php //获取交易统计时间戳 时间段内每小时 public function getPayCountTimeHours($start_date,$end_date){ $data = ar ...

  8. project工期出现小数问题

    进入“选项”,点击“日程”,将默认“开始”.“结束”时间调整为“9点~18点.原为PREJECT 日历 (注意是日历~!!)默认的“8点~17点”,与preject系统默认时间“9点~18点”有差别~ ...

  9. UVa 557 Burger (概率+递推)

    题意:有 n 个牛肉堡和 n 个鸡肉堡给 2n 个客人吃,在吃之前抛硬币来决定吃什么,如果剩下的汉堡一样,就不用投了,求最后两个人吃到相同的概率. 析:由于正面考虑还要要不要投硬币,太麻烦,所以我们先 ...

  10. vue.eslintrc.js常用配置

    vue.eslintrc.js module.exports = { root: true, env: { node: true }, extends: [ "plugin:vue/esse ...