mybatis 笔记(一) 入门

1.数据库脚本

本文采用mysql数据库,数据脚本如下

DROP DATABASE
IF EXISTS mybatis;

CREATE DATABASE mybatis;

USE mybatis;

DROP TABLE
IF EXISTS dept;

CREATE TABLE dept(
    dept_id INT AUTO_INCREMENT PRIMARY KEY ,
    dept_name NVARCHAR(50) NOT NULL
);

DROP TABLE
IF EXISTS employee;

CREATE TABLE employee(
    id INT AUTO_INCREMENT PRIMARY KEY ,
    `name` NVARCHAR(50) NOT NULL ,
    age INT ,
    birthday DATETIME ,
    dept_id INT ,
    CONSTRAINT fk_dept_id FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);

INSERT INTO dept(dept_name)
VALUES
    ('信息技术部') ,
    ('人事部') ,
    ('PCB事业部') ,
    ('无线终端部') ,
    ('测试部');

INSERT INTO employee(`name` , age , birthday , dept_id)
VALUES
    ('小花5760 ' , 0 , NOW() , 1) ,
    ('小花7238 ' , 1 , NOW() , 2) ,
    ('小花7985 ' , 11 , NOW() , 3) ,
    ('小花2438 ' , 24 , NOW() , 1) ,
    ('小花7386 ' , 8 , NOW() , 4) ,
    ('小花9787 ' , 8 , NOW() , 1) ,
    ('小花9711 ' , 4 , NOW() , 4) ,
    ('小花2119 ' , 21 , NOW() , 5);

2. 开发环境准备

开发工具为idea,使用maven构建项目,需要一定的maven基础,可以查看笔者之前关于maven的介绍配置http://www.jianshu.com/p/2eceee248836
先来一张项目结构图

项目结构图

mapper 包主要放置mapper接口以及mapper映射文件
model 包主要放置和数据库表对应的实体对象
util 包放置了一个关于 SQLSession 管理的类和io操作类
resources 目录下面防止了数据库配置文件以及mybatis核心配置文件,接下来笔者带大家一一分析

3. pom 文件主要是mybatis和jdbc驱动的配置

<dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>

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

        <!-- mybatis  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

    </dependencies>


    <build>
        <!--在maven中设置打包时将xml文件一起打包-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

4. 配置文件

jdbc.properties 文件主要存放和数据库连接相关的信息

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=

mybatis.xml 主要是mybatis核心配置文件,

<!-- 加载属性文件 -->
    <properties resource="jdbc.properties"/>

    <!-- 设置实体对象所在的包设置实体对象的别名,
        默认是将该类的名称首字母小写,也可以使用@Alias 注解自定义 
        也可以使用 typeAlias 单一指定
     -->
    <typeAliases>
        <package name="com.zzz.mybatis.model"/>
    </typeAliases>
    
    <!-- 开发配置信息 -->
    <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>

    <!-- mapper 接口所在的包,mybatis会自动扫描查找
        也可以使用 mapper 单独指定
     -->
    <mappers>
        <package name="com.zzz.mybatis.mapper"/>
    </mappers>

5. 先来看util包中的内容

首先看 SqlSessionFactoryUtil,这里面笔者都做了注释,后面在专门详细介绍,以及后面即将说到的 mapper。
IoUtils 主要负责IO对象的关闭,可自行查看源码,这里不做分析

package com.zzz.mybatis.util;

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 java.io.IOException;
import java.io.InputStream;

/**
 * Created by tao.zeng on 2017/9/28.
 */
public class SqlSessionFactoryUtil {

    private SqlSessionFactoryUtil() {
    }

    /**
     * 主要用来创建 SqlSession 相当于一次会话,类似于jdbc中的Connection对象
     * 当程序访问数据库时,就需要使用该对象构建 SqlSession,所以他应该位于整个生命周期
     * 并且不希望有多个实例对象,所以做成单例模式
     */
    private volatile static SqlSessionFactory mSqlSessionFactory;


    /**
     * 返回 SqlSession 对象 该对象主要用来执行 sql 语句
     * 它应该位于一个应用的请求和操作中,注意使用时需要及时关闭回收资源
     *
     * @return
     */
    public static SqlSession openSqlSession(){
        initSqlSessionFactory();
        return mSqlSessionFactory.openSession();
    }

    private static void initSqlSessionFactory() {
        InputStream in = null;
        try {
            // 加载 resources 目录下面的 mybatis.xml 文件
            in = Resources.getResourceAsStream("mybatis.xml");
            if (mSqlSessionFactory == null) {
                synchronized (SqlSessionFactoryUtil.class) {
                    if (mSqlSessionFactory == null) {

                        // SqlSessionFactoryBuilder 主要用来生成 SqlSessionFactory 对象
                        // 一旦 SqlSessionFactory 构建完成,就应该将它回收,所以他在方法内部维护就好
                        mSqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IoUtils.close(in);
        }
    }
}

6.编写 mapper 接口和 mapper映射文件

笔者在这里抽象出了一个 BaseMapper 接口,里面涉及基本的增删改查操作,在这里用到了泛型 T 表示当前操作实体对象的类型,E 表示实体对象id的类型。

package com.zzz.mybatis.mapper;

import java.util.List;

/**
 * Created by tao.zeng on 2017/9/28.
 */
public interface BaseMapper<T, E> {

    /**
     * 查询所有数据
     *
     * @return
     */
    List<T> findAll();

    /**
     * 根据 id 查询数据
     *
     * @param id
     * @return
     */
    T findById(E id);

    /**
     * 保存数据
     *
     * @param t
     * @return
     */
    int save(T t);

    /**
     * 修改数据
     *
     * @param t
     * @return
     */
    int update(T t);

    /**
     * 删除数据
     *
     * @param id
     * @return
     */
    int delete(E id);
}

如果没有特殊的要求,单纯的操作依赖于该类可以完成单表的基本操作。
这里贴一下操作部门的mapper,纳尼?空的?对,目前这里面什么都可以不用做,只需要通过泛型知道操作的是 Dept 对象已经Dept 对象中id的类型

package com.zzz.mybatis.mapper;

import com.zzz.mybatis.model.Dept;

/**
 * Created by tao.zeng on 2017/9/29.
 */
public interface DeptMapper extends BaseMapper<Dept, Long> {

}

贴出mapper映射文件

<?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">

<!-- namespace 指定当前 mapper 和 Mapper对象的映射关系 -->
<mapper namespace="com.zzz.mybatis.mapper.DeptMapper">
    
    <!-- 因为实体对象中的属性名称和数据库字段名称不一样,通过resultMap来进行映射 -->
    <resultMap id="deptMapper" type="com.zzz.mybatis.model.Dept">
        <!-- property 实体对象中的属性名称  column 数据库中字段的名称-->
        <id property="deptId" column="dept_id"/>
        <result property="deptName" column="dept_name"/>
    </resultMap>
    
    <!-- 通过 select 标签进行查询操作,这里查询的是所有信息 -->
    <select id="findAll" resultMap="deptMapper">
        select * from dept
    </select>
    
</mapper>

7. 测试运行

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

        SqlSession session = SqlSessionFactoryUtil.openSqlSession();

        DeptMapper mapper = session.getMapper(DeptMapper.class);

        List<Dept> depts = mapper.findAll();

        for (Dept dept : depts) {
            System.out.println(dept);
        }
        // 一定记得及时关闭 SqlSession 释放资源
        session.close();
    }
运行结果

以上记录了mybatis最基本的操作,完整代码见
https://github.com/zzz-tao/mybatis

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容