Mybatis的介绍和基本使用

276 阅读11分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

一、数据库操作框架的历程

1-1、JDBC

JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

优点:运行期:快捷、高效

缺点:编辑期:代码量大、繁琐异常处理、不支持数据库跨平台

image.png

jdbc核心api

1.DriverManager 连接数据库

2.Connection 连接数据库的抽象

3.Statment 执行SQL

4.ResultSet 数据结果集

1-2、DBUtils

DBUtils是Java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
DBUtils三个核心功能介绍

1、QueryRunner中提供对sql语句操作的API

2、ResultSetHandler接口,用于定义select操作后,怎样封装结果集

3、DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

1-3、Hibernate

Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的对象关系框架(ORM-object relationl mapping)。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。

ORM:
object java对象
relational 关系型数据(mysql/oracle/sql server)
mapping 映射

Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。

Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

image.png

1-3-1、Hibernate 优势

核心优势
1、可以通过pojo直接生成数据库
2、可以不用写sql语句,通过操作对象来实现对数据库的操作
3、跨数据库的,如果修改数据源,只需要修改数据库驱动即可实现

其他:
1、Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
2、为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
3、如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML文件属性。
4、抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java对象。
5、Hibernate 不需要应用程序服务器来操作。
6、操控你数据库中对象复杂的关联。
7、最小化与访问数据库的智能提取策略。
8、提供简单的数据询问。

1-3-2、Hibernate劣势

重要
1、就因为hibernate通过无sql操作,因此给sql优化带来了一些困难
2、在复杂业务的情况下,如果实现一些复杂的sql查询比较复杂

其他
1、hibernate的完全封装导致无法使用数据的一些功能。
2、Hibernate的缓存问题。
3、Hibernate对于代码的耦合度太高。
4、Hibernate寻找bug困难。
5、Hibernate批量数据操作需要大量的内存空间而且执行过程中需要的对象太多

1-4、JDBCTemplate

JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法.如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便利的模板方法。

优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务

缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存

二、什么是Mybatis

MyBatis 是一款优秀的持久层框架/半自动的ORM,它支持自定义SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

具体大家可以看下mybatis官网 mybatis.org/mybatis-3/z…

2-1、优点

1、与JDBC相比,减少了很多代码量
2、 最简单的持久化框架,简单易学
3、SQL代码从程序代码中彻底分离出来,可以重用
4、提供XML标签,支持编写动态SQL
5、提供映射标签,支持对象与数据库的ORM字段关系映射,支持缓存、连接池、数据库移植....

2-2、缺点

1、SQL语句编写工作量大,熟练度要高
2、数据库移植性比较差,如果需要切换数据库的话,SQL语句会有很大的差异

三、快速搭建Mybatis项目

3-1、在maven项目中引入mybatis 和mysql驱动包

mysql驱动包需要和提供服务的mysql版本匹配,否则无法连接的时候就会发生异常,具体可以参照mysql官网

选择java语言,先点击8.0的view image.png mysql匹配版本以及jdk版本

image.png

我这边使用mysql 5.7,并且jdk 1.8.x。因此驱动也就选择8.0.x版本了,如下:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

3-2、使用xml配置驱动

上面告诉打击mybatis的官网地址,我们打开官网地址,点击入门就可以看到怎么配置驱动了

3-2-1、创建mybatis.xml配置mysql驱动文件

<?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">
            <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="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

3-2-1-1、配置mysql驱动信息

如果记不住驱动信息可以按照如下方式查看: image.png 如上可以看到,当前8.0驱动版本,比低版本驱动多了 "cj",因此在配置驱动的时候,最好按照上面截图方式看一下,以免配置错误。

配置数据库连接信息,如果记不住也可以按照一下方式查看:

1、使用idea的DataSource选择mysql image.png

2、填写数据库地址、端口以及数据库生成url image.png

3、填写数据库账号密码 image.png

这样mysql数据库的驱动就配置完成了。

3-3、根据数据库表创建pojo

一般来说为了后期维护方便,我们需要创建的pojo名称最好和数据库表对应,并且字段也对应上,这样后面维护就方便多了,如果数据库字段有下划线,在pojo实体类中可以去掉字段的下划线改为驼峰命名法,如数据库中字段:user_name,实体类中可以为userName,在pojo中属性名首字母要小写。 image.png

3-4、创建pojo对应的Mapper.xml文件

我们pojo的名称为Emp,因此Mapper就命名为EmpMapper.xml(为了规范,名称要统一)

EmpMapper.xml放在resource中,那里面写那些内容呢,可以看下官网示例:

image.png 我们把上面那些拷贝到EmpMapper.xml中,并修改namespace(先临时这样,后面再进行处理),以及修改resultType(改为Emp的完整限定名),以及sql语句中的表名称

image.png

3-5、测试

3-5-1、构建SqlSessionFactory

添加一个测试类,并参照官网入门教程,构建SqlSessionFactory,如下:

image.png

将以上代码拷贝到测试类,并修改mapper文件路径 image.png

3-5-2 通过SqlSessionFactory获得sqlSession

可以看下官网给的示例,有两种如下: image.png

3-5-2-1、基于StatementId的方式去执行SQL

先用第一种拷贝到测试类中

package com.jony.test;

import com.jony.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyTest {

    @Test
    public void test01() throws IOException {
        //引入类的mapper文件
        String resource = "mybatis.xml";
        //构建一个输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //生成sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        try (SqlSession session = sqlSessionFactory.openSession()) {
            Emp emp = (Emp) session.selectOne("com.jony.pojo.EmpMapper.selectEmp", 1);
            System.out.println(emp);
        }
    }
}
3-5-2-1-1、修改mubatis.xml配置要加载的EmpMapper.xml

image.png

3-5-2-1-2、执行测试

image.png

3-5-2-1-3、小结

基于StatementId的方式去执行SQL
<mapper resource="EmpMapper.xml"/>

3-5-2-2、基于接口绑定的方式

3-5-2-2-1、创建Pojo对应的Mapper接口

新建一个Pojo对应的Mapper接口,并且新建一个方法,方法名称需要和mapper.xml里面的id一致。接口返回类型是Emp,对应mapper.xml中的resultType返回类型就必须是Emp类的完整限定名,如下: image.png

3-5-2-2-2、修改PojoMapper.xml

修改EmpMapper.xml并放到和EmpMapper同一级目录(可以自动扫描到),然后修改EmpMapper.xml的namespace为EmpMapper的完整限定名。 image.png

3-5-2-2-3、修改全局mybatis配置文件

在mybatis文件中,添加EmpMapper的映射 image.png

3-5-2-2-4、执行测试

image.png

3-5-2-2-5、小结

基于接口绑定的方式
1.新建数据访问层的接口: POJOMapper
2.添加mapper中对应的操作的方法
* 2-1.方法名要和mapper中对应的操作的节点的id要一致
* 2-2.返回类型要和mapper中对应的操作的节点的resultType要一致
* 2-3.mapper中对应的操作的节点的参数必须要在方法的参数中声明
3.Mapper.xml 中的namespace必须要和接口的完整限定名要一致
4.修改mybatis全局配置文件中的mappers,采用接口绑定的方式:
<mapper class="cn.tulingxueyuan.mapper.EmpMapper"></mapper>
5.一定要将mapper.xml和接口放在同一级目录中,只需要在resources新建和接口同样结构的文件夹就行了,生成就会合并在一起

3-6、搭建过程小结

Mybatis搭建过程步骤:
1、创建maven项目,并添加mybatis依赖(mybatis的核心jar包和数据库版本对应的驱动jar包)
2、连接数据库和表
3、添加mybatis全局配置文件(可以从官网复制)
4、修改mybatis 全局配置文件中的数据源配置信息
5、添加数据库表对应的POJO对象(相当于值为用的实体类)
6、添加对应的PojoMapper.xml(里面维护所有的sql)
7、修改mybatis全局配置文件,修改mapper。

四、去xml配置,使用注解的方式实现

上面演示了使用了两种方式实现mybatis对数据库的查询操作,但是都使用到了PojoMapper.xml,下面来看一下不使用xml如何实现。

同样打开mybatis官网,可以看到官网给的示例。

image.png

4-1、使用注解查询

4-1-1、在EmpMapper.java 新增一个查询方法

image.png

4-1-2、在测试方法中调用

image.png

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。

五、使用mybatis实现CRUD

5-1、通过xml的方式实现

5-1-1、查询

通过xml的方式实现查询上面已经演示。

5-1-2、更新

5-1-2-1、在xml中添加update方法

image.png

5-1-2-2、在EmpMapper中添加接口

需要注意的是,xml中的id名称一定要和EmpMapper中的接口名称一致 image.png

5-1-2-3、测试执行

可以看到数据已执行成功
需要注意的是这个地方一定要进行事务提交 session.commit()

在使用完成后进行关闭 session.close();

image.png

5-1-3、插入

5-1-3-1、在xml中添加insert方法

因为数据库中id为自增的,所有只需要插入name即可 image.png

5-1-3-2、在EmpMapper中添加insert方法

image.png

5-1-3-3、测试执行

image.png

5-1-4、删除

5-1-4-1、在xml中添加删除方法

image.png

5-1-4-2、在mapper中添加删除方法

image.png

5-1-4-2、测试执行

删除成功、李四已被删除。

image.png

5-1-5、小结

在xml中,针对CRUD分别使用不同的标签节点如:
< insert>:插入
< update>:更新
< select>:查询
< delete>:删除\

5-1、使用注解实现CRUD

使用注解主要区别就是EmpMapper中的接口,如下

@Select("select * from emp where id=#{id}")
Emp selectEmpAnnotation(Integer id);

@Update("update emp set ename=#{ename} where id= #{id}")
public int updateEmpAnnotation(Emp emp);

@Delete("delete from emp where id= #{id}")
public int deleteEmpAnnotation(Integer empno);

@Insert("insert into emp(id,user_name) values(#{id},#{username})")
public int insertEmpAnnotation(Emp emp);