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
先来一张项目结构图

mybatis 笔记(一) 入门_第1张图片
项目结构图

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

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



        
            junit
            junit
            4.9
        

        
        
            mysql
            mysql-connector-java
            6.0.6
        

        
        
            org.mybatis
            mybatis
            3.4.5
        

    


    
        
        
            
                src/main/java
                
                    **/*.xml
                
            
        
    

4. 配置文件

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

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

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


    

    
    
        
    
    
    
    
        
            
            
                
                
                
                
            
        
    

    
    
        
    

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 {

    /**
     * 查询所有数据
     *
     * @return
     */
    List 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 {

}

贴出mapper映射文件







    
    
    
        
        
        
    
    
    
    
    

7. 测试运行

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

        SqlSession session = SqlSessionFactoryUtil.openSqlSession();

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

        List depts = mapper.findAll();

        for (Dept dept : depts) {
            System.out.println(dept);
        }
        // 一定记得及时关闭 SqlSession 释放资源
        session.close();
    }
mybatis 笔记(一) 入门_第2张图片
运行结果

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

你可能感兴趣的:(mybatis 笔记(一) 入门)