(一)MyBatis从入门到入土——简介

这是MyBatis系列第1篇。大概会用十三篇的篇幅来说解MyBatis,喜欢这个系列的欢迎关注公众号【Java冢狐】获取最新文章。那么废话很少说,让咱们开始吧!java

没有MyBatis的时代

要提及MyBatis,那要从尚未MyBatis的时代的时候提及。那个时候咱们进行数据库开发的,大多使用jdbc来进行。可是JDBC的操做数据库用起来真的是头大。十分的繁琐和无聊,很容易出现问题和错误。其中具体的状况以下所示:mysql

JDBC时代

链接使用数据库的过程:
  • 加载驱动
  • 获取链接
  • 拼接sql
  • 执行sql
  • 获取结果
  • 解析结果
  • 关闭数据库

上面这些操做都是咱们使用jdbc链接数据库的时候必须通过的过程。能够看出步骤十分的繁琐,关键是这些步骤中不少都不是咱们程序员真正关心的,咱们程序员真正关心的只有拼接sql、执行sql和解析结果。程序员

可是基于JDBC得框架下,其余的操做又不得不去编写和操做,使得咱们在代码编写上十分的吃力和冗余,对于程序员来讲不是特别的友好。spring

JDBC缺点

正如上面所说的,JDBC有着一些很致命的缺点,整体来讲有一下几个方面:sql

  • 重复代码过多
  • 每一个操做耗时过多
  • 调试维护麻烦
  • 动态sql方面没有规范,难以维护

正是由于JDBC有着一些致命的缺点才致使咱们使用其余的框架来完成与数据库的交互,诸如Hibernate和MyBatis就是其中比较好的表明。数据库

Hibernate

介绍hibernate以前,咱们先了解一下什么是ORM?编程

ORM

ORM:对象关系映射,简单点说就是将数据库中的表和java中的对象创建映射关系,可让咱们操做对象来间接的操做数据库。session

ORM最好的框架就是hibernate,hibernate可让你经过java对象来间接的操做数据库。对于开发者来讲更加容易上手,也隐藏了底层jdbc和db的交互过程,对于程序员来讲兼容了不一样的数据库,可是对程序员来讲是无感的。只须要像操做对象同样操做数据库便可mybatis

其甚至方便到了即便你不会sql也能经过它来操做数据库,能够说是十分的友好了,尤为是对于初入职场和工做经验差的小伙伴来讲。app

优势

总结起来优势就是:

  • 简化了整个jdbc操做过程
  • 须要去操做对象,不须要关心sql,hibernate能够帮咱们自动生成所须要的sql
  • 代码移植性比较好,经过hibernate操做db都是经过操做对象来进行的,若是咱们须要切换db的类型,hibernate会自动适应,对于开发者业务代码来讲不须要作任何业务代码上的调整
  • 开发效率比较高

缺点

正所谓有的就有失,咱们得到了这些方便,那也有一些相应的缺点和不足。

  • sql优化比较艰难,各类操做最终发给db的,而sql是由hibernate自动生成的,对于开发者来讲若是想干预最终须要执行的sql,相对来讲比较困难
  • hibernate入门比较容易,精通难
  • 对于复杂的动态sql,代码中也须要写不少判断进行组装,动态sql这块的支持比较欠缺

因此说Hibernate只适合作一些简单的系统,或者是开发周期比较紧张的系统,对sql优化不高的项目。

MyBatis

而mybatis将sql交由开发者去控制,因此开发者来讲比较自由自在,没有过多的限制,能够尽情的实现各类公司各类奇奇怪怪的业务和逻辑,在SQL优化方面,也是可以发挥程序员的能力,可谓是好坏皆有本身定。而Mybatis只是帮咱们把重复性的工做优化到了极致,例如操做db的过程、动态sql的拼接,结果和对象的映射都帮咱们处理完成了,不须要咱们过多的操心和关注。让咱们把更多的精力放在sql的编写上,因此这也受到了国内不少大厂的青睐,因此要想年后进入大厂那必需要掌握起来。

言而总之MyBatis:

  • 是一款优秀的持久层框架
  • 几乎避免了全部的JDBC代码和寿佛那个设置参数以及获取结果集的过程。
  • 使用简单的XML或者注释来配置和映射原生信息,将接口和Java的实体类映射成数据库中的记录

mybatis开发项目的具体步骤

上面说的这么好,总归是骡子是马要拉出来遛一遛,那么接下来咱们就一块儿搭建一个Mybatis项目的架子,在下一篇文章中会将其填充完成。并进行演示

Spring项目中引入mybatis maven配置

首先第一步就是要引入mybatis

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>

上面的myba.ve.version版本,你们能够在maven仓库中寻找最新的,或者公司要求的版本。

建立mybatis配置文件

当咱们引入Mybatis后,接下来就是要编写mybatis的配置文件。配置文件为xml格式,通常放在resource目录下。

以下所示:

<?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>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>
    <environments default="development">
        <environment id="development">
            <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="mapper/user.xml"/>
    </mappers>
</configuration>

这个文件主要是对mybatis进行全局配置,好比数据源、事务的配置,如上面的datasource元素用来配置数据源,数据源中就须要指定数据库的一些配置信息;在这里我就设置了我使用到的数据库的连续信息,你们能够根据本身的数据库更改这个代码。

如今对于代码并非很了解没有关系,后续的文章会逐步进行讲解和分析。

建立mapper xml文件

这个文件中表示咱们全部对表的操做。完成后而后再由上面的mybatis的配置文件来引入,以下所示

<mappers>
    <mapper resource="mapper/user.xml"/>
</mappers>

mappers元素中能够有多个mapper文件,咱们开发的项目中可能有不少表须要操做,那么对应会有不少mapper xml文件,咱们都须要在mappers元素中进行引入,而后mybatis才会使用到。通常来讲一个表对应一个mapper文件。

建立Mapper接口

上面咱们建立了mybatis的配置文件和表操做文件,后面咱们就须要用一个Mapper接口来和咱们上面一步中的mapper.xml来创建映射关系。

后续当咱们调用Mapper接口中的方法的时候,会间接的调用到mapper xml中的各类数据的sql操做。

Mapper接口与xml文件关联

上面咱们建立了Mapper接口和xml文件,可是这二者又是如何创建关联的呢?

这就须要uesr.xml中进行配置,以下所示

<mapper namespace="zhonghu.mybatis.chat01.UserMapper"

注意上面的namespace的值,对应的是UserMapper这个接口完整的引用,经过这个namespace,UserMapper接口就能够user.xml创建了映射关系。

user.xml中又有不少db操做,这些操做会和UserMapper接口中的方法创建映射关系,当调用UserMapper中的方法的时候,间接的会调用到user.xml中对应的操做。

如user.xml中有下面一段配置:

<!-- 批量插入 -->
<insert id="insertBatch" parameterType="map">
    <![CDATA[ INSERT INTO `user` (`id`, `name`, `age`, `salary`) VALUES ]]>
    <foreach collection="list" separator="," item="item">
        (#{item.id}, #{item.name}, #{item.age}, #{item.salary})
    </foreach>
</insert>

而UserMapper中有个insertBatch方法和上面这个insert批量插入对应,以下:

/**
 * 批量插入用户信息
 *
 * @param userModelList
 */
void insertBatch(List<UserModel> userModelList);

因此当咱们调用UserMapper中的insertBatch方法的时候,会间接调用到user.xml中的id ="insertBatch"这个操做。

下面咱们就可使用mybatis来操做db了。

接口和mapper xml映射起来间接调用,是经过java动态代理实现的。

经过mybatis获取Mapper接口执行对db的操做

上面咱们说了,咱们能够经过mapper接口来执行对db的操做,获取Mapper的主要代码以下:

SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

上面代码中使用到了mybatis中的核心组件,咱们具体来看一下。

Mybatis核心对象介绍

SqlSessionFactoryBuilder

这个是一个构建器,是用来构建SqlSessionFactory对象的,SqlSessionFactoryBuilder能够经过读取mybatis的配置文件,而后构建一个SqlSessionFactory对象。

SqlSessionFactoryBuilder将mybatis配置文件、mapper xml文件、mapper xml文件和Mapper 接口的映射关系,这些都先给解析好,而后放在java对象中,java对象存在于内存中,内存中访问会很是快的,那么咱们每次去用的时候就不须要从新去解析xml了,SqlSessionFactoryBuilder解析配置以后,生成的对象就是SqlSessionFactory,这个是一个重量级的对象,建立他是比较耗时的,因此通常一个db咱们会建立一个SqlSessionFactory对象,而后在系统运行过程当中会一直存在,而SqlSessionFactoryBuilder用完了就能够释放了。

SqlSessionFactory

经过名字能够知道,这个是一个工厂,是用来建立SqlSession的工厂。

如上面所说SqlSessionFactory是一个重量级的对象,通常一个db对应一个SqlSessionFactory对象,系统运行过程当中会一直存在。

SqlSessionFactory是一个接口,这个接口有2个实现DefaultSqlSessionFactory和SqlSessionManager,通常都是经过SqlSessionFactoryBuilder来建立SqlSessionFactory对象。

经过SqlSessionFactoryBuilder来建立SqlSessionFactory对象主要有2种方式,一种经过读取mybatis配置文件的方式,另一种是硬编码的方式。

SqlSession

咱们经过jdbc操做数据库须要先获取一个Connection链接,而后拿着这个链接去对db进行操做,在mybatis中SqlSession就相似于jdbc中Connection链接对象,在mybatis中叫作Sql会话对象,通常咱们一个db操做使用一个SqlSession对象,因此这个对象通常是方法级别的,方法结束以后,这个对象就销毁了,这个对象能够调用sqlSessionFactory.openSession的方法来进行获取。

咱们能够直接经过SqlSession对象来调用mapper xml中各类db操做,须要指定具体的操做的id,id的格式为namespace.操做的id。

Mapper接口

咱们能够经过SqlSession直接调用mapper xml中的db操做,不过更简单的以及推荐的方式是使用Mapper接口,Mapper接口中的方法和mapper xml文件中的各类db操做创建了映射关系,是经过Mapper接口完整名称+方法名称和mapper xml中的namespace+具体操做的id来进行关联的,而后咱们直接调用Mapper接口中的方法就能够间接的操做db了,使用想当方便,Mapper接口须要经过SqlSession获取,传入Mapper接口对应的Class对象,而后会返回这个接口的实例,如:

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

最后

  • 若是以为看完有收获,但愿能关注一下,顺便给我点个赞,这将会是我更新的最大动力,感谢各位的支持
  • 欢迎各位关注个人公众号【java冢狐】,专一于java和计算机基础知识,保证让你看完有所收获,不信你打我
  • 求一键三连:点赞、转发、在看。
  • 若是看完有不一样的意见或者建议,欢迎多多评论一块儿交流。感谢各位的支持以及厚爱。

——我是冢狐,和你同样热爱编程。

欢迎关注公众号“Java冢狐”获取最新消息

相关文章
相关标签/搜索