MyBatis系列(一)--MyBatis入门篇

mituan 2018-09-28

MyBatis其实很简单。我们在工作中使用的通常是与Spring整合,Spring作为框架粘合剂,简化了很多使用实现细节。为了研究MyBatis源码,我们需要单从MyBatis的使用来作为入口,循着会用到源码来深入。

一、MyBatis是什么?能做什么?

我研究东西喜欢知其然知其所以然,这样,不会有困惑。那么MyBatis是什么?总得问个为什么。

在官方地址中(http://www.mybatis.org/mybatis-3/),有介绍,我们摘取一段:

写道
MyBatis is a first class persistence framework with support for custom SQL, stored procedures
and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of
parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration
and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

总体意思就是:

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

二、入门使用

使用maven构建一个MyBatis的测试工程,maven的使用这里我不想赘述,网上文章很多。

这里,我们使用MySQL数据库,使用MyBatis作为持久化框架。

为了使项目中职责清楚,我们需要划分目录结构,一般的dao层用来访问与数据访问接口相关的内容,model层用来放与实体相关部分,mapper目录用来存放与对象与数据映射关系的配置文件。当然,我们需要一张数据表,开搞。

1、新建一张数据表(直接使用navicat工具新建即可)

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `mallt_user`
-- ----------------------------
DROP TABLE IF EXISTS `mallt_user`;
CREATE TABLE `mallt_user` (
  `ID` int(100) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `NAME` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '用户姓名',
  `MOBILE` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '手机号码',
  `EMAIL` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2、新建一个maven工程,建议大家使用IntelliJ IDEA (大家自行百度创建maven工程的方法),这里不细说,我们只说下pom文件依赖部分:

<dependencies>
        <!-- 添加junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.6</version>
        </dependency>

        <!-- 添加mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.12</version>
        </dependency>

    </dependencies>

这里我们使用3.2.6稳定版本作为示例版本,目前官网的最新版本是3.4.x。

搭建完的工程目录结构如下:

MyBatis系列(一)--MyBatis入门篇
3、我们分别介绍下目录中的内容

①在dao层中,MalltUserDao是接口类,里面提供了查询、插入等方法。

package com.zhaodf.dao;

import com.zhaodf.model.MalltUser;

import java.util.List;

public interface MalltUserDao {
    public int insert(MalltUser malltUser);
    public MalltUser findMalltUserById (int id);
}

 ②在model层,是实体类MalltUser,包含跟数据表列对应的属性名

package com.zhaodf.model;

public class MalltUser {
    private int id;
    private String name;
    private String mobile;
    private String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

 ③在mappers目录下,malltUserDao-mapper.xml是关系映射文件,我们这里包含select和insert两种映射语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.zhaodf.dao.MalltUserDao">
    <select id="findMalltUserById" resultType="com.zhaodf.model.MalltUser" >
      select * from mallt_user where id = #{id}
    </select>
    <insert id="insert" parameterType="com.zhaodf.model.MalltUser">
        insert into mallt_user(name,mobile,email) values(#{name}, #{mobile}, #{email});
    </insert>
</mapper>

 ④关键部分:MyBatis的核心配置文件db-core.properties,里面包含了我们要使用的大部分configuration 配置。

<?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属性来传递 -->
    <properties resource="db-info.properties"></properties>
    <!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找。-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <!-- 事务管理器的配置,这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域-->
            <transactionManager type="JDBC"/>
            <!-- 有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”),POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。-->
            <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>
        <!--定义完SQL 映射语句,首先我们需要告诉 MyBatis 到哪里去找到这些语句。 最佳的方式是告诉 MyBatis 到哪里去找映射文件。可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。-->
        <!-- 使用相对于类路径的资源引用 -->
        <mapper resource="mappers/malltUserDao-mapper.xml"/>
    </mappers>
</configuration>

 ⑤在db-info.properties文件中,配置连接MySQL的驱动类,数据库连接,用户名、密码等

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://ip:端口/数据库名
username=用户名
password=密码

 ⑥在test目录下,放置的是测试类信息:

import com.zhaodf.dao.MalltUserDao;
import com.zhaodf.model.MalltUser;
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.Assert;
import org.junit.Test;

import java.io.IOException;


public class MyBatisDemoTest {
    @Test
    public void findUserById() {
        SqlSessionFactory sessionFactory = null;
        SqlSession sqlSession = null;
        try {
            sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("db-core.xml"));
            sqlSession = sessionFactory.openSession();
            MalltUserDao malltUserDao = sqlSession.getMapper(MalltUserDao.class);
            MalltUser user = malltUserDao.findMalltUserById(9);
            Assert.assertEquals("zhaodf",user.getName());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }

    @Test
    public void inserMalltUser() {
        SqlSessionFactory sessionFactory = null;
        SqlSession sqlSession = null;
        try {
            sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("db-core.xml"));
            sqlSession = sessionFactory.openSession();
            MalltUserDao malltUserDao = sqlSession.getMapper(MalltUserDao.class);
            MalltUser user = new MalltUser();
            user.setName("baixw");
            user.setMobile("18333828888");
            user.setEmail("[email protected]");
            malltUserDao.insert(user);
            sqlSession.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }
    }
}

这里要注意的是,单独用MyBatis进行示例测试时,插入语句执行最后要进行commit操作( sqlSession.commit();) 。

 测试执行,插入数据和查询数据都正常。

以上就是MyBatis的基本用法,后续帖我们从SqlSessionFactory的创建开始讲起,从源码角度来逐渐剖析MyBatis。

相关推荐