传统的JDBC来做DAO层,做了下面这几件事:
  • 加载驱动
  • 获取连接
  • 执行SQL语句
  • 获取操作结果封装信息
  • 返回操作结果

而实际上DAO层最关心的是什么呢,就是后面三点就完事,JDBC显得太繁琐:
  • 执行SQL语句
  • 获取操作结果封装信息
  • 返回操作结果

所以说MyBatis作为持久层框架的出现,必然是有一个核心对象来只做上面这些事情,这个对象叫做SqlSession,从命名来说也很贴切了。

那么SqlSession到底有什么作用:
  • 向SQL语句传入参数
  • 执行SQL语句
  • 获取执行SQL语句的结果
  • 事务的控制

那么如何得到SqlSession:
  • 通过配置文件获取数据库连接相关信息
  • 通过读取到的配置信息构建SqlSessionFactory
  • 通过SqlSessionFactory打开数据库会话

<!--maven pom-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
12
 
1
<!--maven pom-->
2
<dependency>
3
    <groupId>org.mybatis</groupId>
4
    <artifactId>mybatis</artifactId>
5
    <version>3.4.6</version>
6
</dependency>
7

8
<dependency>
9
    <groupId>mysql</groupId>
10
    <artifactId>mysql-connector-java</artifactId>
11
    <version>5.1.6</version>
12
</dependency>
public class Demo {
public static void main(String[] args) throws IOException {
//读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession数据库会话对象
SqlSession sqlSession = factory.openSession(); //...
}
}
12
 
1
public class Demo {
2
    public static void main(String[] args) throws IOException {
3
        //读取配置文件
4
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
5
        //获取工厂类
6
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
7
        //获取SqlSession数据库会话对象
8
        SqlSession sqlSession = factory.openSession();
9
        
10
        //...
11
    }
12
}

这个配置文件 "mybatis-config.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事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dbgirl"/>
<property name="username" value="root"/>
<property name="password" value="dev"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmapper/GirlMapper.xml"/>
</mappers>
</configuration>
23
 
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE configuration
3
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
5

6
<configuration>
7
    <environments default="development">
8
        <environment id="development">
9
            <!-- 使用jdbc事务管理 -->
10
            <transactionManager type="JDBC"/>
11
            <!-- 数据库连接池 -->
12
            <dataSource type="POOLED">
13
                <property name="driver" value="com.mysql.jdbc.Driver"/>
14
                <property name="url" value="jdbc:mysql://localhost:3306/dbgirl"/>
15
                <property name="username" value="root"/>
16
                <property name="password" value="dev"/>
17
            </dataSource>
18
        </environment>
19
    </environments>
20
    <mappers>
21
        <mapper resource="sqlmapper/GirlMapper.xml"/>
22
    </mappers>
23
</configuration>

我们说过,SqlSession可以执行SQL语句,那么这个SQL语句又是哪里来?注意如上的配置文件中 <mapper resource="sqlmapper/GirlMapper.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="dulk.learn.mybatis.dao.GirlDao">
<select id="findById" parameterType="long" resultType="dulk.learn.mybatis.pojo.Girl">
SELECT * FROM girl WHERE id = #{id}
</select>
</mapper>
10
 
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

6
<mapper namespace="dulk.learn.mybatis.dao.GirlDao">
7
    <select id="findById" parameterType="long" resultType="dulk.learn.mybatis.pojo.Girl">
8
        SELECT * FROM girl WHERE id = #{id}
9
    </select>
10
</mapper>

原来如此,SQL语句直接写到xml文件中了,我们通过读取配置文件来获取SqlSessionFactory时,数据库连接信息和SQL语句就都是在配置文件里。既然这两样都有了,是不是意味着我们就可以直接用了?所以接着之前的Demo我们是这样用的,来获取一个对应数据库表的Girl对象:
public class Demo {
public static void main(String[] args) throws IOException {
//读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession数据库会话对象
SqlSession sqlSession = factory.openSession(); //获取一个对应数据库表的Girl对象
Girl girl = sqlSession.selectOne("dulk.learn.mybatis.dao.GirlDao.findById", 1L);
}
}
13
 
1
public class Demo {
2
    public static void main(String[] args) throws IOException {
3
        //读取配置文件
4
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
5
        //获取工厂类
6
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
7
        //获取SqlSession数据库会话对象
8
        SqlSession sqlSession = factory.openSession();
9

10
        //获取一个对应数据库表的Girl对象
11
        Girl girl = sqlSession.selectOne("dulk.learn.mybatis.dao.GirlDao.findById", 1L);
12
    }
13
}

我们在配置Mapper时,其中<mapper>标签的 "namespace" 属性,是为了限定和隔离不同的语句,避免重名。还有一点是, namespace 可以绑定接口,这意味着假如你的 namespace 的值为某个接口名(如上例中的 <mapper namespace="dulk.learn.mybatis.dao.GirlDao"> ),那么你可以直接通过MyBatis来获取一个该接口的实例,并调用其方法:
public class Demo {
public static void main(String[] args) throws IOException {
//读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取工厂类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession数据库会话对象
SqlSession sqlSession = factory.openSession(); //获取一个对应数据库表的Girl对象
//Girl girl = sqlSession.selectOne("dulk.learn.mybatis.dao.GirlDao.findById", 1L);
GirlDao girlDao = sqlSession.getMapper(GirlDao.class);
Girl girl = girlDao.findById(1L);
}
}
x
 
1
public class Demo {
2
    public static void main(String[] args) throws IOException {
3
        //读取配置文件
4
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
5
        //获取工厂类
6
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
7
        //获取SqlSession数据库会话对象
8
        SqlSession sqlSession = factory.openSession();
9

10
        //获取一个对应数据库表的Girl对象
11
        //Girl girl = sqlSession.selectOne("dulk.learn.mybatis.dao.GirlDao.findById", 1L);
12
        GirlDao girlDao = sqlSession.getMapper(GirlDao.class);
13
        Girl girl = girlDao.findById(1L);
14
    }
15
}

到这里,大概已经能看到一些MyBatis的优势了:
  • 不需要重复处理注册驱动,创建连接,设置参数等操作
  • SQL语句在配置文件中,而不是硬编码到代码中
  • 传统JDBC从数据库获取数据转为对象需要我们手动从ResultSet中get数据然后set到Java对象中,而MyBatis帮我们自动进行了转换

可以看到,MyBatis是对JDBC数据库的过程进行了封装,执行我们写好的SQL并将结果映射成Java对象返回:

注:
1、MyBatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器
2、MappedStatement也是个底层封装对象,它包装了MyBatis配置信息及SQL映射信息等。mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是MappedStatement的id
3、MappedStatement对SQL执行输入参数进行定义,包括HashMap、基本类型、POJO,Executor通过MappedStatement在执行SQL前将输入的Java对象映射至SQL中,输入参数映射就是JDBC编程中对PreparedStatement设置参数
4、MappedStatement对SQL执行输出结果进行定义,包括HashMap、基本类型、POJO,Executor通过MappedStatement在执行SQL后将输出结果映射至Java对象中,输出结果映射过程相当于JDBC编程中对结果的解析处理过程


参考链接:


[01] MyBatis概述的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  3. Mybatis概述

    mybatis概述 1 mybatis产生的意义 传统的jdbc, 及其存在的问题 package cn.rodge.jdbc;import java.sql.Connection;import ja ...

  4. 01 mybatis框架整体概况(2018.7.10)-

    01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...

  5. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

  6. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...

  7. 03 Mybatis:01.Mybatis课程介绍及环境搭建&&02.Mybatis入门案例

    mybatis框架共四天第一天:mybatis入门 mybatis的概述 mybatis的环境搭建 mybatis入门案例 -------------------------------------- ...

  8. 01 Mybatis 的配置和使用

    一.Mybatis 是什么 MyBatis 是一个支持普通SQL查询.存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装.MyB ...

  9. 01.MyBatis入门

        MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/  1.使用MyBatis前的准备 1.增加Maven依赖 <dependency> &l ...

随机推荐

  1. 如何用原生JS实现一个简单的promise

    我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...

  2. 网站pc端分享QQ好友,空间,微博

    在开发pc端网站的过程中,涉及到邀请好友的功能,之前单纯的复制粘贴已经无法满足用户的体验.故,仿照移动端添加自动分享到QQ好友,QQ空间,QQ微博的功能. 分享到QQ好友:http://connect ...

  3. oracle执行先决条件检查失败的解决方法

    在安装oracle 11g时,出现执行先决条件失败的情况如下: 你可以忽略所有强制安装,一般不会影响功能,但如果你想知道为什么会产生这种错误, 并且当出现以上情况时又该如何解决呢?如下列出了原因和解决 ...

  4. (后端)NoSuchMethodError

    这个错误是说编译时有这个方法,但运行时没有了 请使用:mvn clean install

  5. (后端)如何将数据库的表导出生成Excel?

    1.如何通过元数据拿到数据库的信息? 2.如何用Java生成Excel表? 3.将数据库中的表导出生成Excel案例 如何通过元数据拿到数据库的信息 元数据:描述数据的数据 Java中使用元数据的两个 ...

  6. scrapy系列(三)——基础spider源码解析

    前面两章介绍了scrapy的安装和项目的新建,那么这一章就讲讲spider吧. scrapy有个命令是runspider, 这个命令的作用就是将一个spider当做一个python文件去执行,而不用创 ...

  7. 【redis专题(5)】命令语法介绍之sets

    标签(空格分隔): Redis 关于 redis的无序集合有三个特点: 无序性, 确定性(描述准确) , 唯一性: 有点类似于数据容器: 增 SADD key member1 [member2] 作用 ...

  8. tkinter调取签名网而设计签名页面(十七)

    # --*-- coding:utf-8 --*-- import tkinter as tk import re import requests from tkinter import messag ...

  9. 洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器

    是的,我是想到什么知识点就说什么,没有固定的主题,我的标题都是在写完博客再给的.本篇博文说说列表进阶话题.其实列表应该是比较熟悉的了,而毫不夸张的说,在实际的开发中,列表也是使用的最多的,以后你会体会 ...

  10. JDBC数据类型、Java数据类型、标准sql类型

    本概述是从<JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference>这本书中摘引来的.JavaSoft ...