Mybatis第一篇【介绍、快速入门、工做流程】

什么是MyBatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis。是一个基于Java的持久层框架java

为何咱们要用Mybatis?

不管是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!mysql

这里写图片描述

到目前为止,咱们已经在持久层中学了几种技术了…sql

  • Hibernate
  • jdbc
  • SpringDAO

那咱们为啥还要学Mybatis呢???如今Mybatis在业内大行其道,那为啥他能那么火呢??数据库

Hibernate是一个比较老旧的框架,用过他的同窗都知道,只要你会用,用起来十分舒服…啥sql代码都不用写…可是呢,它也是有的缺点::处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句apache

而JDBC很容易理解,就那么几个固定的步骤,就是开发起来太麻烦了,由于什么都要咱们本身干..markdown

而SpringDAO其实就是JDBC的一层封装,就相似于dbutils同样,没有特别出彩的地方….session

咱们能够认为,Mybatis就是jdbc和Hibernate之间的一个平衡点…毕竟如今业界都是用这个框架,咱们也不能不学呀!mybatis


Mybatis快速入门

其实咱们已经学过了Hibernate了,对于Mybatis入门其实就很是相似的。所以就很简单就能掌握基本的开发了…oracle

导入开发包

导入Mybatis开发包app

  • mybatis-3.1.1.jar
  • commons-logging-1.1.1.jar
  • log4j-1.2.16.jar
  • cglib-2.2.2.jar
  • asm-3.3.1.jar

导入mysql/oracle开发包

  • mysql-connector-java-5.1.7-bin.jar
  • Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar

准备测试工做

建立一张表

create table students( id int(5) primary key, name varchar(10), sal double(8,2) );

建立实体:

/** * Created by ozc on 2017/7/21. */

public class Student {
    private Integer id;
    private String name;
    private Double sal;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Double getSal() {
        return sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }
}

建立mybatis配置文件

建立mybatis的配置文件,配置数据库的信息….数据库咱们能够配置多个,可是默认的只能用一个…

<?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 resource="db.properties"/>

    <!-- 设置一个默认的链接环境信息 -->
    <environments default="mysql_developer">
        <!-- 链接环境信息,取一个任意惟一的名字 -->
        <environment id="mysql_developer">
            <!-- mybatis使用jdbc事务管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用链接池方式来获取链接 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>


        <!-- 链接环境信息,取一个任意惟一的名字 -->
        <environment id="oracle_developer">
            <!-- mybatis使用jdbc事务管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用链接池方式来获取链接 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <property name="driver" value="${oracle.driver}"/>
                <property name="url" value="${oracle.url}"/>
                <property name="username" value="${oracle.username}"/>
                <property name="password" value="${oracle.password}"/>
            </dataSource>
        </environment>
    </environments>


</configuration>

编写工具类测试是否获取到链接

使用Mybatis的API来建立一个工具类,经过mybatis配置文件与数据库的信息,获得Connection对象

package cn.itcast.javaee.mybatis.util;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/** * 工具类 * @author AdminTC */
public class MybatisUtil {
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory;
    /** * 加载位于src/mybatis.xml配置文件 */
    static{
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    /** * 禁止外界经过new方法建立 */
    private MybatisUtil(){}
    /** * 获取SqlSession */
    public static SqlSession getSqlSession(){
        //从当前线程中获取SqlSession对象
        SqlSession sqlSession = threadLocal.get();
        //若是SqlSession对象为空
        if(sqlSession == null){
            //在SqlSessionFactory非空的状况下,获取SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            //将SqlSession对象与当前线程绑定在一块儿
            threadLocal.set(sqlSession);
        }
        //返回SqlSession对象
        return sqlSession;
    }
    /** * 关闭SqlSession与当前线程分开 */
    public static void closeSqlSession(){
        //从当前线程中获取SqlSession对象
        SqlSession sqlSession = threadLocal.get();
        //若是SqlSession对象非空
        if(sqlSession != null){
            //关闭SqlSession对象
            sqlSession.close();
            //分开当前线程与SqlSession对象的关系,目的是让GC尽早回收
            threadLocal.remove();
        }
    }   
    /** * 测试 */
    public static void main(String[] args) {
        Connection conn = MybatisUtil.getSqlSession().getConnection();
        System.out.println(conn!=null?"链接成功":"链接失败");
    }
}

建立实体与映射关系文件

配置实体与表的映射关系

<?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 namespace="cn.itcast.javaee.mybatis.app04.Student"> 

    <!-- resultMap标签:映射实体与表 type属性:表示实体全路径名 id属性:为实体与表的映射取一个任意的惟一的名字 -->
    <resultMap type="student" id="studentMap">
        <!-- id标签:映射主键属性 result标签:映射非主键属性 property属性:实体的属性名 column属性:表的字段名 -->                         
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sal" column="sal"/>
    </resultMap>

</mapper>

如今咱们已经有了Mybatis的配置文件和表与实体以前的映射文件了,所以咱们要将配置文件和映射文件关联起来

<mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>

在测试类上,咱们是能够获取获得链接的

这里写图片描述


编写DAO

public class StudentDao {


    public void add(Student student) throws Exception {
        //获得链接对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        sqlSession.insert();
    }

    public static void main(String[] args) throws Exception {

        StudentDao studentDao = new StudentDao();

        Student student = new Student(1, "zhongfucheng", 10000D);
        studentDao.add(student);

    }
}

到如今为止,咱们实体与表的映射文件仅仅映射了实体属性与表的字段的关系…

咱们在Hibernate中若是想要插入数据什么的,只要调用save()方法就好了。Hibernate是自动化屏蔽掉了数据库的差别,而咱们Mybatis是须要本身手动编写SQL代码的

那么SQL代码是写在哪里的呢???明显地,咱们做为一个框架,不可能在程序中写SQL,咱们是在实体与表的映射文件中写的!

Mybatis实体与表的映射文件中提供了insert标签【SQL代码片断】供咱们使用

//在JDBC中咱们一般使用?号做为占位符,而在Mybatis中,咱们是使用#{}做为占位符
    //parameterType咱们指定了传入参数的类型
    //#{}实际上就是调用了Student属性的get方法

    <insert id="add" parameterType="Student">

        INSERT INTO ZHONGFUCHENG.STUDENTS (ID, NAME, SAL) VALUES (#{id},#{name},#{sal});
    </insert>

在程序中调用映射文件的SQL代码片断

public void add(Student student) throws Exception {
        //获得链接对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        try{
            //映射文件的命名空间.SQL片断的ID,就能够调用对应的映射文件中的SQL
            sqlSession.insert("StudentID.add", student);
            sqlSession.commit();
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }

值得注意的是:Mybatis中的事务是默认开启的,所以咱们在完成操做之后,须要咱们手动去提交事务!


Mybatis工做流程

  • 经过Reader对象读取Mybatis映射文件
  • 经过SqlSessionFactoryBuilder对象建立SqlSessionFactory对象
  • 获取当前线程的SQLSession
  • 事务默认开启
  • 经过SQLSession读取映射文件中的操做编号,从而读取SQL语句
  • 提交事务
  • 关闭资源
相关文章
相关标签/搜索