Java框架篇---Mybatis 入门

一、Mybatis 介绍

MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的 XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到数据库中的记录。

二、MyBatis 工作流程

(1) 加载配置并初始化
  触发条件:加载配置文件
  配置来源于两个地方,一处是配置文件,一处是 Java 代码的注解,将 SQL 的配置信息加载成为一个个 MappedStatement 对象(包括了传入参数映射配置、执行的 SQL 语句、结果映射配置),存储在内存中。
(2) 接收调用请求
  触发条件:调用 Mybatis 提供的 API
  传入参数:为 SQL 的 ID 和传入参数对象
  处理过程:将请求传递给下层的请求处理层进行处理。
(3) 处理操作请求 触发条件:API 接口层传递请求过来
  传入参数:为 SQL 的 ID 和传入参数对象
  处理过程:
  (A) 根据 SQL 的 ID 查找对应的 MappedStatement 对象。
  (B) 根据传入参数对象解析 MappedStatement 对象,得到最终要执行的 SQL 和执行传入参数。
  (C) 获取数据库连接,根据得到的最终 SQL 语句和执行传入参数到数据库执行,并得到执行结果。
  (D) 根据 MappedStatement 对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
  (E) 释放连接资源。
(4) 返回处理结果将最终的处理结果返回。

orm 工具的基本思想

无论是用过的 hibernate,mybatis, 你都可以法相他们有一个共同点:

  •  从配置文件 (通常是 XML 配置文件中) 得到 sessionfactory.
  •  由 sessionfactory  产生 session
  •  在 session 中完成对数据的增删改查和事务提交等.
  •  在用完之后关闭 session 。
  •  在 java 对象和 数据库之间有做 mapping 的配置文件,也通常是 xml 文件。

功能架构

Mybatis 的功能架构分为三层:
  1. API 接口层:提供给外部使用的接口 API,开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  2. 数据处理层:负责具体的 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  3. 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。  

多需要添加的驱动包:

下面进行快速入门:

目录如下:

实体类 User

package com.oumyye.model;

public class User {
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}

}

映射文件 UserMapping.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="com.oumyye.mapping.UserMapping">
<!-- 在 select 标签中编写查询的 SQL 语句, 设置 select 标签的 id 属性为 getUser,id 属性值必须是唯一的,不能够重复
使用 parameterType 属性指明查询时使用的参数类型,resultType 属性指明查询返回的结果集类型
resultType="com.oumyye.model.User" 就表示将查询结果封装成一个 User 类的对象返回
User 类就是 users 表所对应的实体类
-->
<!--
根据 id 查询得到一个 user 对象
-->
<select id="getUser" parameterType="String"
resultType
="com.oumyye.model.User">
select * from user where id=#{id}
</select>
</mapper>

资源文件 mybatis.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">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">mapper </span><span style="color: rgba(255, 0, 0, 1)">resource</span><span style="color: rgba(0, 0, 255, 1)">="com/oumyye/mapping/userMapping.xml"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
 <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">mappers</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

</configuration>

测试类:

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
30
31
32
package test;
 
import java.io.InputStream;
 
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
import com.oumyye.model.User;
 
public class Tests {
    @Test
    public void test(){
        String resource = "mybatis.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = Tests.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        
        SqlSession session = sessionFactory.openSession();
        /**
         * 映射sql的标识字符串,
         * com.oumyye.mapping.UserMapping是userMapper.xml文件中mapper标签的namespace属性的值,
         * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        String statement = "com.oumyye.mapping.UserMapping.getUser";//映射sql的标识字符串
        //执行查询返回一个唯一user对象的sql
        User user = session.selectOne(statement, "1123");
        System.out.println(user.toString());
    }
}

 结果: