传统的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. logcat use

    将已经存在的工程导入到eclipse步骤: ①:首先复制当前工程所在的路径. ②:然后在eclipse,右键->Import->General->Existing Projects ...

  2. mysql数据库备份与导入

    1.数据库的备份 注意:导出的数据里是没有 use mydb; 这句话 **************************************************************** ...

  3. Lucene创建索引流程

    1.创建索引流程 原始文档:互联网上的网页(爬虫或蜘蛛).数据库中的数据.磁盘上的文件 创建文档对象(非结构化数据) 文档对象中的属性不叫属性现在成为域. 每个 Document 可以有多个 Fiel ...

  4. 山西WebGIS项目总结

    有一段时间没写blog了,说实话,最近的心态一直在变化,看了一部日剧,回想了这一年所学所见,感觉生活目标变了. 做国土项目这段时间不是很忙,由于数据一直给不到位,时间拖得很久,所以在这期间也在继续学习 ...

  5. 超简单,Centos7 安装 rabbitMQ

    首先声明,本人是Linux新手一枚.经历了在阿里云Centos上部署rabbitMQ与重装的痛苦经历,后多方查找终于找到了简单方法.Linux高人来说请跳过本篇文章,新手可以试试. 1.设置Cento ...

  6. ASP.NET MVC从请求到响应发生了什么

    *过程描述 当浏览器发出一个http请求后,该请求被UrlRoutingModule截获,UrlRoutingModule根据请求上下文去系统路由表(RouteTable)中匹配,从中获取一个Rout ...

  7. 洗礼灵魂,修炼python(59)--爬虫篇—httplib模块

    httplib 1.简介 同样的,httplib默认存在于python2,python3不存在: httplib是python中http协议的客户端实现,可以用来与 HTTP 服务器进行交互,支持HT ...

  8. Linux 查看对外开放端口

    备忘命令: netstat -anpt | grep 514 # 查看 rsyslog tcp 端口是否开放 保持更新,转载请注明出处.

  9. 静态库lib调试

    1.首先生成lib文件的解决方案编译通过. 2.将最新的lib和头文件在需要调用的exe中,替换掉. 3.复制需要调试的cpp文件到exe解决方案下,并添加现有项. 4.运行无错误后,添加断点即可调试 ...

  10. Activity声明周期2

    FirstActivity.java import android.os.Bundle; import android.view.View; import android.view.View.OnCl ...