MyBatis初體驗

1、MyBatis

一、簡介

  曾命名IBatis(老版本), 交給Google維護後,更名爲MyBatis(新版本)。
學習文檔:
  https://mybatis.org/mybatis-3/zh/index.htmlhtml

二、做用:

  封裝了JDBC操做,簡化數據庫訪問代碼。
封裝功能:
(1)封裝了獲取鏈接,執行SQL語句,釋放鏈接。
(2)封裝了SQL參數設置。例如:insert into emp (name,age) values(#{name}, #{age})
(3)封裝了記錄映射成實體對象的過程。
注:java

  實體類屬性名與查詢結果集ResultSet中的列名(並不必定是數據庫中表的列名,而是取出時的列名、或者叫別名)要保持一致。mysql

三、如何使用

step1:導入相關jar包(mybatis包 + 數據庫驅動包)。
step2:編寫mybatis配置的xml文件。用於指定數據庫鏈接參數和SQL定義文件的位置。
step3:編寫相關實體類(以及接口類)。
step4:編寫sql語句的xml文件。用於定義SQL語句。
step5:使用SqlSession對象執行SQL操做(SqlSession 操做 是非線程安全的)。sql

四、最基本的使用方式

step1:導包。數據庫

 

 

 

step2:編寫mybatis配置的xml文件。apache

【config/mybatis-config.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="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可
                       此處以MySql爲例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加載SQL定義文件,須要修改
        如有多個SQL定義文件,可使用<mapper />標籤追加。
          文件路徑中存在.的話,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

step3:編寫相關實體類對象。編程

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
 * 實體類
 */
public class Employee implements Serializable{
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;

    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 getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

 

step4:編寫sql語句的xml文件。安全

【config/EmpMapper.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="mybatisDemo.entity.Employee">
    <!--
        namespace 指命名空間
        id 指的是sql語句惟一表示
        resultType 指的是sql的返回類型(使用全類名錶示)
        #{id}  表示接收參數,至關於佔位符,(可以使用 ${id},其將數據直接顯示在sql語句中)
    -->
    <select id="selectEmp" resultType="entity.Employee">
        select * from emp where id = #{id}
    </select>
</mapper>

 

step5:使用SqlSession對象執行SQL操做。網絡

【test.Demo.java】

package test;

import entity.Employee;
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.Test;

import java.io.IOException;
import java.io.InputStream;

public class Demo {

    @Test
    public void test() throws IOException {
        // step1:讀取配置文件
        String resource = "config/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // step2:建立一個 SqlSessionFactory 的對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // step3:獲取一個 SqlSession 的實例
        SqlSession session = sqlSessionFactory.openSession();
        try{
           // 根據惟一的sql id 定位到sql語句。
            Employee employee = session.selectOne("selectEmp", 1);
            System.out.println(employee);
        }finally {
            // step4:關閉 SqlSession 實例
            session.close();
        }
    }
}

 

step6:測試截圖session

 

 

 

五、接口式編程

(1)定義一個接口,裏面定義一系列方法,並將這些方法與 sql 語句的xml文件 進行映射。
(2)其中 方法名爲 xml 文件中 的 惟一id標識, 並使用 resultType、resultMap 來定義返回值類型。
(3)與基本的方式相比,增長了個 接口類,映射到 sql 的 xml 文件(經過命名空間 namespace 來映射接口,id 爲 接口的方法名),並經過接口類來進行sql的調用。
step1:導包

 

 

 

step2:編寫mybatis配置的xml文件。

【config/mybatis-config.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="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可
                       此處以MySql爲例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加載SQL定義文件,須要修改
        如有多個SQL定義文件,可使用<mapper />標籤追加。
          文件路徑中存在.的話,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

step3:編寫相關實體類對象。

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
 * 實體類
 */
public class Employee implements Serializable{
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;

    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 getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

 

step4:定義接口類

【mapper.EmpMapper.java】

package mapper;

import entity.Employee;

/**
 * 接口式編程,定義一系列方法,並根據方法映射到sql 的xml 文件中。
 */
public interface EmpMapper {
    public Employee getEmp(Integer id);
}

 

step5:編寫sql語句的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="mapper.EmpMapper">
    <!--
        namespace 指命名空間,用於指明接口類的位置
        id 指的是sql語句惟一表示,爲接口類中的方法
        resultType 指的是sql的返回類型(使用全類名錶示)
        #{id}  表示接收參數,至關於佔位符,(可以使用 ${id},其將數據直接顯示在sql語句中)
    -->
    <select id="getEmp" resultType="entity.Employee">
        select * from emp where id = #{id}
    </select>
</mapper>

 

step6:使用SqlSession對象執行SQL操做。

【test.Demo.java】

package test;

import entity.Employee;
import mapper.EmpMapper;
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.Test;

import java.io.IOException;
import java.io.InputStream;

public class Demo {

    @Test
    public void test() throws IOException {
        // step1:讀取配置文件
        String resource = "config/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // step2:建立一個 SqlSessionFactory 的對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // step3:獲取一個 SqlSession 的實例
        SqlSession session = sqlSessionFactory.openSession();
        try{
            // 獲取接口類的對象(內部爲接口類自動建立代理對象)
            EmpMapper empMapper = session.getMapper(EmpMapper.class);
            // 經過方法調用sql
            Employee employee = empMapper.getEmp(1);
            System.out.println(employee);
        }finally {
            // step4:關閉 SqlSession 實例
            session.close();
        }
    }
}

 

step7:測試截圖

 

 

 

2、全局配置文件

  用於 mybatis 的配置。

一、environments

  用於設置開發環境。每一個<environment>標籤能夠設置一個開發環境。使用 default能夠切換環境。

【environment內部的標籤】
    transactionManager: 用於指定事務管理器。type="[JDBC|MANAGED]"
    dataSource:用於指定數據源。type="[UNPOOLED|POOLED|JNDI]"
    
【舉例:】
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url"
                      value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
    <environment id="provided">
        <transactionManager type="MANAGED"/>
        <dataSource type="UNPOOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url"
                      value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

 

二、properties

  用於引入外部資源文件。好比 數據庫的配置信息 放在 (.properties) 文件中。能夠經過 <properties> 將 該文件引入。

【屬性:】
    url:引入網絡路徑 或者 磁盤下的路徑 下的文件
    resource: 引入當前項目類路徑下的文件
    
引入文件後,使用 ${} 來取出 文件的內容。

 

對上例接口式編程進行部分修改。
(1)增長一個 config/db.properties,用於保存數據庫鏈接信息。
(2)使用 <properties> 標籤引入 db.properties 文件, 並使用 ${} 來取出 文件的內容。

 

 

【db.properties】
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456


【config/mybatis-config.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>
    <properties resource="config/db.properties"></properties>

    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自帶鏈接池,只需配置數據庫鏈接的一些數據便可
                       此處以MySql爲例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url"
                          value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加載SQL定義文件,須要修改
        如有多個SQL定義文件,可使用<mapper />標籤追加。
          文件路徑中存在.的話,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

三、settings

  用於修改 mybatis 的默認設置。

【setting屬性:】
    name:要修改的配置的名字
    value:要修改的配置的值

 

 

 

(1)好比開啓 駝峯命名映射規則(mapUnderscoreToCamelCase)。
  默認狀況下,數據庫裏的數據,沒法自動轉換駝峯命名,獲取不到值。

 

 

開啓駝峯命名映射規則後,能夠獲取到值。

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

 

 

四、databaseIdProvider

  用於支持不一樣的數據庫。

【在全局配置文件中,添加如下信息:】
    name指的是不一樣的數據庫,value指的是別名。
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="MySQL" value="mysql"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>


【在sql的xml文件中,使用databaseId來區別數據庫】
<select id="getEmp" resultType="entity.Employee" databaseId="mysql">
    select * from emp where id = #{id}
</select>
<select id="getEmp" resultType="entity.Employee" databaseId="oracle">
    select * from emp where id = #{id}
</select>

 

五、mappers

  用於配置sql映射文件的讀取位置。

(1)使用 <mapper> 標籤來定義 sql 的xml文件。
【屬性:】
    url:引入網絡路徑 或者 磁盤下的路徑 下的文件
    resource: 引入當前項目類路徑下的文件
    class: 用於引入接口類(使用時須要將 xml 與 接口類 放在同一個包下)。
    
(2)使用 <package> 標籤來 批量定義映射器。
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

org.mybatis.builder 包下全部接口皆被定義爲映射器,
若使用 sql的xml配置文件,則需將配置文件與 接口同名 且置於同一包下。
若使用 註解,則無需編寫 sql語句 的 xml 配置文件。

注:

  使用class 屬性時,能夠在接口上使用 註解標記,並直接定義sql 語句(此時不須要sql的配置文件)。

相關文章
相關標籤/搜索