深入浅出MyBatis:JDBC和MyBatis介绍_abc_1114的博客-程序员秘密

技术标签: java  数据库  设计模式  

JDBC相关概念

Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一些列规范,只定义了接口规范,具体实现由各个数据库厂商去实现,它是一种典型的桥接模式。

桥接模式是一种结构型设计模式,它的主要特点是把抽象与行为实现分离开来,分别定义接口,可以保持各部分的独立性以及应对他们的功能扩展。

JDBC规范

所谓规范,就是自己定义了标准接口,做了如下抽象:用Connection代表和数据库的连接,用Statement执行SQL,用ResultSet表示SQL返回的结果,提供了对数据的便利。从Connection可以创建Statement,Statement执行查询得到ResultSet。

上面说的Connection、Statement、ResultSet都应该是接口,具体实现由各个数据库提供商提供。有了规范,可以通过统一的接口,访问多种类型的数据库,可随便切换数据库。

数据库驱动

上面提到,接口的实现由各个厂商提供,那么实现类的类名就会不统一,去创建Connection对象时,代码就会写死某个实现类,切换数据库时,就需要修改代码,这样不太好。为了解决这个问题,抽象了Driver驱动的概念。

Connection con=MySqlConnectionImpl("127.0.0.1",3306,"mi_user",userName,pwd);

每个数据库都需要实现Driver接口,通过Driver可获得数据库连接Connection,通过反射机制动态创建。

Class.forName("com.mysql.jdbc.Drier");

同一个程序可能访问不同的数据库,通过DriverManager来管理驱动,Driver在初始化的时候,需要注册到DriverManager中。

DriverManager提供了一个getConnection方法,用于建立数据库Connection:

Connection con=DriverManager.getConnection("127.0.0.1",3306,"mi_user",userName,pwd);

如果有多个数据库驱动,DriverManager如何区分呢,需要在数据库连接url中指定,比如mysql需要添加jdbc:mysql前缀:

String url= "jdbc:mysql://127.0.0.1:3306/mi_user";
Connection con=DriverManager.getConnection(url,userName,pwd)
数据源

数据源DataSource包含连接池和连接池管理2个部分,习惯上称为连接池。在系统初始化的时候,将数据库连接作为对象存储在内存中,当需要访问数据库时,从连接池中取出一个已建立的空闲连接对象。

使用数据源,获取其DataSource对象,通过该对象动态的获取数据库连接。另外,DataSource对象可以注册到名字服务(JNDI)中,可以通过名字服务获得DataSource对象,无需硬性编码驱动。

DriverManager是JDBC1提供的,DataSource是JDBC2新增的功能,提供了更好的连接数据源的方法。

对比Hibernate和MyBatis

通过上面的介绍,传统的JDBC编程给我们带来了连接数据库的功能,但其工作量相对较大,首先连接,然后处理JDBC底层事务,处理数据类型,还要对可能产生的异常进行捕捉处理并正确的关闭资源。

实际工作中,很少使用JDBC进行编程,提出了ORM模型,主要解决数据库数据和POJO对象的相互映射。

Hibernate和Mybatis都是ORM模型,Hibernate提供的是一种全表映射的模型,对JDBC的封装程度比较高。但Hibernate也有不少缺点,列举如下:

  • 全表映射带来的不便,比如更新时需要发送所有的字段;

  • 无法根据不同的条件组装不同的SQL;

  • 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为POJO;

  • 不能有效支持存储过程;

  • 虽然有HQL,但性能较差,大型互联网系统往往需要优化SQL,而Hibernate做不到。

大型互联网环境中,灵活、SQL优化,减少数据的传递是最基本的优化方法,Hibernate无法满足要求,而MyBatis提哦给你了灵活、方便的方式,是一个半自动映射的框架。

MyBatis需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系。

MyBatis可以配置动态SQL,可以解决Hibernate的表名根据时间变化,不同的条件下列明不一样的问题。可以优化SQL,通过配置决定SQL映射规则,也能支持存储过程,对于一些复杂和需要优化性能的SQL的查询它更加方便。

核心组件

核心组件主要包括以下几个:

  • SqlSessionFactoryBuilder:会根据配置信息或代码来生成SqlSessionFactory;

  • SqlSessionFactory:依靠工厂来生成SqlSession;

  • SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口;

  • SQL Mapper:是MyBatis新设计的组件,由一个Java接口和XML文件构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

构建SqlSessionFactory

每个MyBatis应用都是以SqlSessionFactory的实例为中心的,它的任务是创建SqlSession。SqlSesion类似于一个JDBC的Connection对象。

提供了2种方式创建SqlSessionFactory:一种是XML配置的方式,一种是代码的方式,推荐使用XML配置的方式。

定义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> <properties resource="application.properties"> </properties> <!-- 定义别名 --> <typeAliases> <typeAlias alias="role" type="com.learn.chapter2.po.Role"/> </typeAliases> <!-- 定义数据库信息.默认使用development数据库构建环境 --> <environments default="development">    <environment id="development">    <!-- 采用jdbc事务管理 -->        <transactionManager type="JDBC"/>        <dataSource type="POOLED">            <property name="driver" value="${driver}"/>            <property name="url" value="${url}"/>            <property name="username" value="${username}"/>            <property name="password" value="${password}"/>        </dataSource>    </environment> </environments> <!-- 定义映射器 --> <mappers> <mapper resource="com\learn\chapter2\mapper\roleMapper.xml"/> </mappers></configuration>

创建SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
创建SqlSession

SqlSession是一个接口类,扮演者门面的作用,真正干活的是Executor接口。需要保证每次用完正常关闭它。

SqlSession sqlSession=null;try{
    sqlSession=sqlSessionFactory.openSession();    //some code
    sqlSession.commit();
} catch(Exception ex){
    sqlSession.roolback();
} finally{    if(sqlSession!=null){        sqlSession.close();    } }
映射器

映射器是由Java接口和XML文件(或注解)共同组成的,作用如下:

  • 定义参数类型

  • 描述缓存

  • 描述SQL语句

  • 定义查询结果和POJO的映射关系

首先,定义Java接口:

public interface RoleMapper{    public Role getRole(Long id); }

然后,定义映射XML文件,RoleMapper.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"> <mapper namespace ="com.learn.chapter2.mapper.RoleMapper">    <select id="getRole" paramterType="long" resultType="role" >        select id,role_name as roleName , note from t_role where id=#{id}    </select> </mapper>

POJO对象Role的定义比较简单,就不列出了。#{id}为这条SQL的参数,SQL列的别名和POJO的属性名称保持一致,会把这条语句的查询结果自动映射到Role属性上,这就是自动映射。

执行查询

RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);
String roleName=role.getRoleName();
组件生命周期

SqlSessionFactory在MyBatis应用的整个生命周期中,每个数据库只对应一个SqlSessionFactory,可以实现一个工具类,以单例模式获取该对象。

SqlSession的生命周期在请求数据库处理事务的过程中,它是一个线程不安全的对象,在涉及多线程的时候要特别当心。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

Mapper的作用是发送SQL,然后返回需要的结果,或者执行SQL修改数据库的数据,所以它应该在一个SqlSession事务方法之内,如同JDBC中一条SQL语句的执行,它最大的范围和SqlSession是相同的。

书的整体结构

本书分为3个部分,依次介绍了MyBatis的基础应用、原理及插件开发、实战应用。

基础应用

主要介绍如何高效地使用MyBatis:

  • MyBatis特性

  • 核心组件及其生命周期

  • MyBatis配置

  • 映射器

  • 动态SQL

MyBatis原理

深入源码理解MyBatis的内部运行原理以及插件的开发方法和技巧:

  • 介绍MyBatis的解析和运行原理,将了解到SqlSession的构建方法,以及四大对象是如何工作的

  • 介绍MyBatis的插件

实战应用

主要讲解MyBatis的一些实用的场景:

  • 介绍MyBatis-Spring,讲解如何在Spring项目中集成MyBatis应用

  • 介绍MyBatis的实用场景,精选一些典型场景,解析每个场景下,开发人员需要注意避免的一些错误和性能上的损失

下篇会介绍MyBatis的相关配置,更好的配置MyBatis以适用于不同的业务场景,以及提供给我们的扩展。

转载于:https://www.cnblogs.com/kkdn/p/8650066.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abc_1114/article/details/101679248

智能推荐

2018.6.13 三周第三次课 su命令 sudo命令 限制root远程登录_chonghaozhi7746的博客-程序员秘密

一、su命令 切换用户 命令su的格式:su – username;普通用户的su命令不加username时,就是切换到root用户 [[email protected] ~]$ su -密码:上一次登录:三 4月 4 22:38:52 CST 2018pts/0 上...

小汽车的位置_Love_Lemonade的博客-程序员秘密

题目描述有一辆智能小车,最初(时间为0)的位置为(0,0),我们想知道它最后的位置。小车以每小时10公里的速度向北移动(以北为y轴正向,以东为x轴正向)。小车会受到一系列依照时间戳记排序的命令,1表示“向左转”,2表示“向右转”,3表“停止”。每个命令的前面有一个时间戳记,所以我们知道该命令是何时发出的。最后一个命令一定是“停止”。我们另外假设,这辆小车非常灵活,它可以在瞬间转弯。以下列输入...

攻防世界 Misc高手进阶区 3分题 misc1_思源湖的鱼的博客-程序员秘密

继续ctf的旅程,攻防世界Misc高手进阶区的3分题,本篇是misc1的writeup

linux shell编程学习——数组使用_linux shell 数组操作下标变量_雙湖之梦的博客-程序员秘密

linux的shell的编程方面很强大,在日常的shell脚本里,数组是一种常见的数据结构。本文主要介绍了shell数据的定义,引用,赋值,遍历,删除,切片,替换等数组操作。

人工智能教育平台_格物斯坦机器人的博客-程序员秘密

每个学生都有一个机器学习伴侣,可以帮助学生整理学习笔记、发现学习中的问题,帮助学生更有效率地学习。格物斯坦表示:在未来几年中可以做得更好,关键就是数据。所有的教育专家们一定要关注教育的数据,因为有两种数据不可再生,也是别人不可给你期待的,一种就是医疗数据,只有你自己的身体产生,还有一个就是学生学习的数据,只有这个学生的学习是个性化的。先来辨别机器人和人工智能的区别:简单来说,机器人更像是替代人类完成一些技术型的工作或任务,通过编程输入程序让机器人能够顺利完成动作——强调的是通过技术实现动作;人工智能强调

北京工业计算机英语口语复试,北京工业大学复试回忆_陈嘉栋的博客-程序员秘密

北京工业大学复试回忆零零零、复试准备(2013年2月底-2013年4月初)2月底出成绩,虽然分数线还要等一个月,但可以参照一下往年的分数线以及王道等计算机复试的群,确定一下自己的排名情况,如果感觉自己能够或者有希望过线,就应该着手准备复试了。至于怎么准备,大家都是从初试过来的就不用说了吧。北京工业大学的分数线及复试安排貌似是在3.30好公布的。2013年计算机科学与技术专业(即学硕)同国家线295...

随便推点

java spring Bean的配置方式之FactoryBean_SHAN_9W的博客-程序员秘密

实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象先自定义FactoryBean Ca...

解决 THCudaCheck FAIL file=/pytorch/aten/src/THC/THCGeneral.cpp line=405 error=11 : invalid argument_thcudacheck fail file=src/riroi_align_kernel.cu li_qian99的博客-程序员秘密

如题,原因是显卡用的RTX 2080Ti,CUDA就要装10以上,这个时候pytorch不能直接用pip装,要这样:pip3 install https://download.pytorch.org/whl/cu100/torch-1.0.0-cp36-cp36m-linux_x86_64.whl源码装应该也可以。...

python数据分析(数据可视化)_数据可视化分析python_星之空殇的博客-程序员秘密

数据分析初始阶段,通常都要进行可视化处理。数据可视化旨在直观展示信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量。本章用的程序库matplotlib是建立在Numpy之上的一个Python图库,它提供了一个面向对象的API和一个过程式类的MATLAB API,他们可以并行使用。

Android刷Recovery_aswang的博客-程序员秘密

在刷Android ROM的时候,有的时候需要刷Recovery,这里将刷Recovery的各种方法记录如下: 1、通过android系统中的超级终端来刷Recovery将你下载的recovery文件拷贝到sd卡的根目录,如/sdcard/recovery.img。(注意,recovery文件的后缀是img)打开android的超级终端,输入su,获取root权限,在弹出的...

Deep Learning Techniques for Text Classification_Omni-Space的博客-程序员秘密

The exponential growth in the number of complex datasets every year requires more enhancement in machine learning methods to provide robust and accurate data classification. Lately, deep learning appr...

pycharm安装mysqlclient_柚子丿李的博客-程序员秘密

在pycharm安装mysqlclient正常路径一:在setting中安装(具体不演示,因为基本都报错)正常路径二:在终端输入pip install mysqlclient大概率会出现报错,原因是要指定mysqlclient的版本和你安装的python版本重点来了!重点来了!重点来了!路径三:先去下载正确的mysqlclient包,然后在下载文件夹下打开cmd输入pip install (你下载的包名)具体演示如下:1 去 https://www.lfd.uci.edu/~gohlke

推荐文章

热门文章

相关标签