Mybatis简介与快速入门

本文最后更新于:1 年前

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

框架概念

框架,就是软件的半成品,完成了软件开发过程中的通用操作,程序员只需很少或者不用进行加工就能够实现特定的功能,从而简化开发人员在软件开发中的步骤,提高开发效率。

  • MVC框架:简化Servlet的开发步骤,如【SpringMVC】。
  • 持久层框架:完成数据库操作的框架,如【MyBatis】。
  • 胶水框架:Spring

原始jdbc缺点分析

查询数据

插入数据

原始jdbc开发存在的问题如下:

  • 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能。
  • sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
  • 查询操作时,需要手动将结果集中的数据手动封装到实体中;插入操作时,需要手动将实体的数据设置到 sql 语句的占位符位置。

应对上述问题给出的解决方案:

  • 使用数据库连接池初始化连接资源
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

Mybatis简介

MyBatis官网地址:http://www.mybatis.org/mybatis-3/

mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

mybatis 通过 xml 或注解的方式将要执行的各种 statement配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的sql语句

最后 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

MyBatis是一个半自动ORM框架。

  • ORM(Object Relational Mapping)对象关系映射,将Java中的一个对象与数据表中一行记录一一对应。

  • ORM框架提供了实体类与数据表的映射关系,通过映射文件的配置,实现对象的持久化。

MyBatis特点:

  • 支持自定义SQL、存储过程
  • 对原有的JDBC进行了封装,几乎消除了所有JDBC代码,让开发者只需关注SQL本身
  • 支持XML和注解配置方式自定完成ORM操作,实现结果映射

Mybatis快速入门

1. 导入MyBatis的坐标和其他相关坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>

2. 创建MyBatis配置文件

在 resources 中创建名为 mybatis-config.xml 的文件,在 mybatis-config.xml 文件配置数据库连接信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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配置数据库连接信息 -->
<!-- 在environments标签中可以定义多个environment标签,每个environment标签可以定义一套连接配置 -->
<!-- default属性,用来指定使用哪个environment标签 -->
<environments default="mysql">
<environment id="mysql">
<!--transactionManager标签用于配置数据库管理方式-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource标签就是用来配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>

</configuration>

3. 创建数据表

tb_students

4. 编写实体类

Student.java

5. 创建DAO接口,定义操作方法

StudentDao.java

6. 创建DAO接口的映射文件

在 resources 目录下,新建名为 mappers 的文件夹,在 mappers 中新建名为 StudentMapper.xml 的映射文件(根据模板创建。在映射文件中对DAO中定义的方法进行实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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文件相当于DAO接口的‘实现类’,namespace属性要指定`实现`DAO接口的全限定名-->
<mapper namespace="com.qfedu.dao.StudentDAO">

<insert id="insertStudent">
insert into tb_students(stu_num,stu_name,stu_gender,stu_age)
values(#{stuNum},#{stuName},#{stuGender},#{stuAge})
</insert>

<delete id="deleteStudent">
delete from tb_students where stu_num=#{stuNum}
</delete>

</mapper>

7. 将映射文件添加到主配置文件

mybatis-config.xml

8. 单元测试

  1. 添加单元测依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
  2. 在被测试类名后alt+insert — 选择Test

    StudentDao.java
  3. 测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class StudentDAOTest {

@org.junit.Test
public void insertStudent() {

try {
//加载mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//会话工厂
SqlSessionFactory factory = builder.build(is);
//会话(连接)
SqlSession sqlSession = factory.openSession();
//通过会话获取DAO对象
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
//测试StudentDAO中的方法
int i = studentDAO.insertStudent(new Student(0, "10001", "张三", "男", 21));
//需要手动提交
sqlSession.commit();
System.out.println(i);
} catch (IOException e) {
e.printStackTrace();
}
}

@org.junit.Test
public void deleteStudent() {
}
}

MyBatis的映射文件概述

过时