传统的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. csharp:SMO run sql script

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. java.io.IOException No space left on device

    磁盘空间不足 1.df -k,发现程序所在的工作目录/data,居然到了100%. 1604050 free allocated Kb 535144219 used allocated Kb 100 ...

  3. 【读书笔记】iOS-如何推销你的Web应用

    1,利用Beta测试来邀请测试者. 2,利用新闻发布. 3,创建Web应用的宣传网站. 4,使用邮件营销. 5,创建YouTube视频教程. 6,提交到苹果Web应用门户. 7,提交到其它Web应用门 ...

  4. 《AngularJS入门与进阶》图书简介

    一.图书封面 二.图书CIP信息 图书在版编目(CIP)数据 AngularJS入门与进阶 / 江荣波著. – 北京 : 清华大学出版社, 2017 ISBN 978-7-302-46074-9 Ⅰ. ...

  5. Apex 的 Trigger 类简介

    Apex Triggers Apex 触发器(Apex Triggers)是一种特殊的 Apex 类.它的主要作用是在一条记录被插入.修改.删除之前或之后自动执行一系列的操作.每一个 Trigger ...

  6. Linux 学习笔记之超详细基础linux命令 Part 6

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 5----------------- ...

  7. wap2app(六)-- wap2app的原生标题头无法隐藏

    大概有一个星期没有用HBuilder打包,今天更新了HBuilder版本再继续打包,就出现了一系列问题.其中有一个就是打包之后,除首页外,其他页面多出了原生标题,如下图: 查阅资料,打开 sitema ...

  8. CRM原型

    https://files.cnblogs.com/files/wcLT/CRM.zip

  9. scrapy之spider模块

    scrapy中的spider的用法 : 1.scrapy命令行可以传参数给构造器 scrapy crawl myspider -a category=electronics 构造器接收传入的参数 im ...

  10. 【公众号系列】SAP S/4 HANA的移动平均价

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP S/4 HANA的移动平均 ...