1. Mybatis的介紹和基本使用

1 數據庫操作框架的歷程

1.1 JDBC

  1. JDBC(Java Data Base Connection,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序
  2. 優點:運行期:快捷、高效
  3. 缺點:編輯期:代碼量大、繁瑣異常處理、不支持數據庫跨平臺
    在這裏插入圖片描述

1.2 DBUtils

  1. DBUtils是Java編程中的數據庫操作實用工具,小巧簡單實用
  2. DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫代碼
  3. DBUtils三個核心功能介紹
    1. QueryRunner中提供對sql語句操作的API
    2. ResultSetHandler接口,用於定義select操作後,怎樣封裝結果集
    3. DBUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法

1.3 Hibernate

  1. Hibernate 是由 Gavin King 於 2001 年創建的開放源代碼的對象關係框架。它強大且高效的構建具有關係對象持久性和查詢服務的 Java 應用程序
  2. Hibernate 將 Java 類映射到數據庫表中,從 Java 數據類型中映射到 SQL 數據類型中,並把開發人員從 95% 的公共數據持續性編程工作中解放出來
  3. Hibernate 是傳統 Java 對象和數據庫服務器之間的橋樑,用來處理基於 O/R 映射機制和模式的那些對象。

在這裏插入圖片描述

1.3.1 Hibernate優點
  1. Hibernate 使用 XML 文件來處理映射 Java 類別到數據庫表格中,並且不用編寫任何代碼
  2. 爲在數據庫中直接儲存和檢索 Java 對象提供簡單的 APIs
  3. 如果在數據庫中或任何其它表格中出現變化,那麼僅需要改變 XML 文件屬性
  4. 抽象不熟悉的 SQL 類型,併爲我們提供工作中所熟悉的 Java 對象
  5. Hibernate 不需要應用程序服務器來操作
  6. 操控你數據庫中對象複雜的關聯
  7. 最小化與訪問數據庫的智能提取策略
  8. 提供簡單的數據詢問
  9. 數據移植性強
1.3.2 Hibernate缺點
  1. 過度工程化,性能較差,難以優化
  2. 學習難度較大
  3. 無法進行細緻操作,例如減少查詢出的列數
  4. 緩存機制不如redis
  5. 尋找bug困難
  6. 批量數據操作需要大量的內存空間而且執行過程中需要的對象太多
1.4 JDBCTemplate
  1. JdbcTemplate針對數據查詢提供了多個重載的模板方法,你可以根據需要選用不同的模板方法。如果你的查詢很簡單,僅僅是傳入相應SQL或者相關參數,然後取得一個單一的結果,那麼你可以選擇如下一組便利的模板方法
  2. 優點:運行期:高效、內嵌Spring框架中、支持基於AOP的聲明式事務
  3. 缺點:必須於Spring框架結合在一起使用、不支持數據庫跨平臺、默認沒有緩存

2 Mybatis

  1. MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來將原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)映射成數據庫中的記錄
  2. 優點
    1. 與JDBC相比,減少了50%的代碼量
    2. 最簡單的持久化框架,簡單易學
    3. SQL代碼從程序代碼中徹底分離出來,可以重用
    4. 提供XML標籤,支持編寫動態SQL
    5. 提供映射標籤,支持對象與數據庫的ORM字段關係映射:
      1. O就是Object,即java對象
      2. R表示關係,其實就是數據庫中的表
      3. M表示他們之間的映射關係
  3. 缺點
    1. SQL語句編寫工作量大,熟練度要高
    2. 數據庫移植性比較差,如果需要切換數據庫的話,SQL語句會有很大的差異

3 第一個Mybatis項目

  1. 創建普通的maven項目
  2. 添加pom依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>
  1. 創建對應的數據表
--oracle
create table emp select * from scott.emp;
--mysql
/*
 Navicat Premium Data Transfer

 Source Server         : MySQL
 Source Server Type    : MySQL
 Source Server Version : 50562
 Source Host           : localhost:3306
 Source Schema         : test

 Target Server Type    : MySQL
 Target Server Version : 50562
 File Encoding         : 65001

 Date: 15/06/2019 11:21:30
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `deptno` int(2) NOT NULL,
  `dname` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `loc` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`deptno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NewYork');
INSERT INTO `dept` VALUES (20, 'RESEARCH', 'Dallas');
INSERT INTO `dept` VALUES (30, 'SALES', 'Chicago');
INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'Boston');

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`  (
  `empno` int(4) NOT NULL COMMENT '僱員編號',
  `ename` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `job` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `mgr` int(4) NULL DEFAULT NULL,
  `hiredate` date NULL DEFAULT NULL,
  `sal` decimal(7, 0) NULL DEFAULT NULL,
  `comm` decimal(7, 0) NULL DEFAULT NULL,
  `deptno` int(2) NULL DEFAULT NULL,
  PRIMARY KEY (`empno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20);
INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-07-13', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-07-13', 1100, NULL, 20);
INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);

-- ----------------------------
-- Table structure for salgrade
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade`  (
  `grade` int(7) NULL DEFAULT NULL,
  `losal` int(7) NULL DEFAULT NULL,
  `hisal` int(7) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of salgrade
-- ----------------------------
INSERT INTO `salgrade` VALUES (1, 700, 1200);
INSERT INTO `salgrade` VALUES (2, 1201, 1400);
INSERT INTO `salgrade` VALUES (3, 1401, 2000);
INSERT INTO `salgrade` VALUES (4, 2001, 3000);
INSERT INTO `salgrade` VALUES (5, 3001, 9999);

SET FOREIGN_KEY_CHECKS = 1;
  1. Emp.java:表對應的實體類對象
package com.mashibing.bean;

import java.util.Date;

public class Emp {

    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double sal;
    private Double common;
    private Integer deptno;

    public Emp() {
    }
	
	public Emp(Integer empno, String ename) {
        this.empno = empno;
        this.ename = ename;
    }
    
    public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Double sal, Double common, Integer deptno) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.common = common;
        this.deptno = deptno;
    }

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return sal;
    }

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

    public Double getCommon() {
        return common;
    }

    public void setCommon(Double common) {
        this.common = common;
    }

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", mgr=" + mgr +
                ", hiredate=" + hiredate +
                ", sal=" + sal +
                ", common=" + common +
                ", deptno=" + deptno +
                '}';
    }
}
  1. EmpDao.java:進行數據庫操作的dao層接口
package com.mashibing.dao;

import com.mashibing.bean.Emp;

public interface EmpDao {

    public Emp findEmpByEmpno(Integer empno);
    
}
  1. mybatis-config.xml:resources下建立配置文件
<?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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置數據庫連接-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="c50hst"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入每一個接口對應點xml文件-->
    <mappers>
        <mapper resource="EmpDao.xml"/>
    </mappers>
</configuration>
  1. EmpDao.xml:resource下建立映射文件,注意這個文件名要和Dao層的類名相同,我們不必自己再寫Dao層的具體實現
<?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">
<!--1. namespace:Dao接口的全限定類名,就是告訴要實現該配置文件是哪個接口的具體實現-->
<!--
8. DTD=類型定義(Documnet Type Definition)
9. XSD=XML結構定義 ( XML Schemas Definition )
-->
<mapper namespace="com.mashibing.dao.EmpDao">
    <!--
    2. select:表示這個操作是一個查詢操作
    3. id表示的是要匹配的方法的名稱
    4. resultType:表示返回值的類型,查詢操作必須要包含返回值的類型
    5. #{屬性名}:表示要傳遞的參數的名稱
    -->
    <select id="findEmpByEmpno" resultType="com.mashibing.bean.Emp">
        select * from emp where empno = #{empno}
  </select>
</mapper>
  1. log4j.properties:類路徑上添加
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.mashibing=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  1. MyTest.java:測試類
package com.mashibing.test;

import com.mashibing.bean.Emp;
import com.mashibing.dao.EmpDao;
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 MyTest {

    @Test
    public void test01() {
        // 1. 根據全局配置文件創建出SqlSessionFactory:負責創建SqlSession對象的工廠
        // 2. SqlSession:表示跟數據庫建議的一次會話
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Emp empByEmpno = null;
        try {
            // 3. 獲取要調用的接口類,此處實際上是通過jdk的動態代理得到的實現類
            EmpDao mapper = sqlSession.getMapper(EmpDao.class);
            empByEmpno = mapper.findEmpByEmpno(7369);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
        System.out.println(empByEmpno);
    }
}

4 增刪改查的基本操作

  1. EmpDao.java
package com.mashibing.dao;

import com.mashibing.bean.Emp;

public interface EmpDao {

    public Emp findEmpByEmpno(Integer empno);

    public int updateEmp(Emp emp);

    public int deleteEmp(Integer empno);

    public int insertEmp(Emp emp);

}
  1. EmpDao.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="com.mashibing.dao.EmpDao">
    <select id="findEmpByEmpno" resultType="com.mashibing.bean.Emp">
        select * from emp where empno = #{empno}
    </select>
    <!--1. 增刪改操作不需要返回值,返回的是影響的行數,mybatis會自動做判斷-->
    <insert id="insertEmp">
        insert into emp(empno,ename) values(#{empno},#{ename})
    </insert>
    <update id="updateEmp">
        update emp set ename=#{ename} where empno = #{empno}
    </update>
    <delete id="deleteEmp">
        delete from emp where empno = #{empno}
    </delete>
</mapper>
  1. MyTest.java
package com.mashibing.test;

import com.mashibing.bean.Emp;
import com.mashibing.dao.EmpDao;
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.Before;
import org.junit.Test;

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

public class MyTest {
    SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void init(){
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test01() {

        // 獲取數據庫的會話
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Emp empByEmpno = null;
        try {
            // 獲取要調用的接口類
            EmpDao mapper = sqlSession.getMapper(EmpDao.class);
            // 調用方法開始執行
            empByEmpno = mapper.findEmpByEmpno(7369);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
        System.out.println(empByEmpno);
    }

    @Test
    public void test02(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);
        int zhangsan = mapper.insertEmp(new Emp(1111, "zhangsan"));
        System.out.println(zhangsan);
        //1. 默認是開啓事務的,所以必須commit,也可以在openSession中傳入參數從而開啓或關閉事務
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void test03(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);
        int zhangsan = mapper.updateEmp(new Emp(1111, "lisi"));
        System.out.println(zhangsan);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void test04(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);
        int zhangsan = mapper.deleteEmp(1111);
        System.out.println(zhangsan);
        sqlSession.commit();
        sqlSession.close();
    }
}

5 註解的寫法

  1. mybatis支持使用註解的方式,可以不用寫配置文件,但如果sql非常複雜,還是建議寫配置文件
  2. EmpDaoAnnotation.java
package com.mashibing.dao;

import com.mashibing.bean.Emp;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

public interface EmpDaoAnnotation {

    @Select("select * from emp where empno = #{empno}")
    public Emp findEmpByEmpno(Integer empno);

    @Update("update emp set ename=#{ename} where empno = #{empno}")
    public int updateEmp(Emp emp);

    @Delete("delete from emp where empno = #{empno}")
    public int deleteEmp(Integer empno);

    @Insert("insert into emp(empno,ename) values(#{empno},#{ename})")
    public int insertEmp(Emp emp);

}
  1. mybatis-config.xml
<mappers>
    <mapper resource="EmpDao.xml"/>
    <mapper class="com.mashibing.dao.EmpDaoAnnotation"/>
</mappers>
  1. 測試代碼
@Test
public void test06(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmpDaoAnnotation mapper = sqlSession.getMapper(EmpDaoAnnotation.class);
    int zhangsan = mapper.insertEmp(new Emp(1111, "zhangsan"));
    System.out.println(zhangsan);
    //1. 默認是開啓事務的,所以必須commit,也可以在openSession中傳入參數從而開啓或關閉事務
    sqlSession.commit();
    sqlSession.close();
}

6 配置文件詳解

  1. 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">
<!--1. 填寫標籤時,需要注意相關配置的順序,順序寫錯加載也會失敗-->
<configuration>
    <!--1. 引入外部配置文件,類似於Spring中的property-placeholder
            1. resource:從類路徑引入,如果用的是idea,指resources資源目錄下配置文件
            2. url:從磁盤路徑或者網絡路徑引入-->
    <properties resource="db.properties"></properties>
    <!--1. settings:用來控制mybatis運行時的行爲,是mybatis中的重要配置,官網有其子標籤的各種值的具體含義-->
    <settings>
        <!--1. 設置列名映射的時候是否使用駝峯標識,不設置時,表與實體類映射關係爲:表中列名與實體類中屬性名一一對應
            2. 如果表中列明與屬性名不同,例如user_id與userId,會導致映射不上,無法將查出數據放入到指定對象中
            3. 開啓該標識,默認使用表中a_col列與實體類中aCol屬性名進行映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--1. typeAliases:表示爲我們引用的實體類起別名,默認情況下,在EmpDao.xml中,resultType處我們需要寫類的完全限定名
		2. 配置上後就可以使用此處配置的別名替代,使用的時候可以忽略大小寫
        3. 還可以通過alias屬性來表示類的別名
        4. 一般不怎麼使用,因爲沒有必要,而且使用別名後,在EmpDao.xml處就無法直接點入該類,不方便查看-->
    <typeAliases>
        <!--<typeAlias type="com.mashibing.bean.Emp" alias="Emp"></typeAlias>-->
        <!--1. 如果需要引用多個類,那麼給每一個類起別名肯定會很麻煩,因此可以指定對應的包名,可以指定具體的包來保證實體類不需要寫完全限定名-->
        <package name="com.mashibing.bean"/>
    </typeAliases>
    <!--1. 設置定義自己的類型處理器,類型處理器是用於將數據庫中內容轉換爲java中的某種類型用的,mybatis中默認內置了很多類型處理器,一般不需要自己實現-->
    <typeHandlers>
        <typeHandler handler=""></typeHandler>
        <package name=""/>
    </typeHandlers>
    <!--1. 當需要自定義對象工廠時,實現此標籤,完成結果集到java對象實例化的過程,就是如何將表中一條數據轉爲一個java中對象,一般不需要自己實現,底層使用反射實現-->
    <objectFactory type=""></objectFactory>
    <!--1. 設置插件,最常用的是pageHelper,是mybatis的分頁插件-->
    <plugins>
        <plugin interceptor=""></plugin>
    </plugins>
    <!--
    1. 在實際的開發過程中,我們可能分爲開發環境,生產環境,測試環境等等,每個環境的配置可以是不一樣的,比如不同環境配置不同數據源
    2. environments就用來表示不同環境的細節配置,每一個環境中都需要一個事務管理器以及數據源的配置
    3. 我們在後續的項目開發中幾乎都是使用spring中配置的數據源和事務管理器來配置,此處不需要研究
    -->
    <!--4. default:用來選擇哪個環境作爲運行時環境-->
    <environments default="development">
        <!--1. environment:配置具體的環境屬性-->
        <!--2. id:表示不同環境的名稱-->
        <environment id="development">
            <!--transactionManager:配置事務管理器,type表示事務管理器的類型
			    1. jdbc:表示使用jdbc原生的事務配置
			    2. managed:什麼都沒做-->
            <transactionManager type="JDBC"/>
            <!--1. 配置數據庫連接-->
            <!--2. 配置具體數據源類型,type:表示數據源類型
			        1. pooled:使用數據庫連接池
			        2. unpooled:每次都打開關和關閉一個連接-->
            <dataSource type="POOLED">
                <!--1. 使用${}來引入外部變量,如果爲連接池,還可以設置連接最大個數等相關信息-->
                <property name="driver" value="${driverClassname}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--1. databaseIdProvider:數據庫廠商標識,在不同的數據庫中,可能sql語句的寫法是不一樣的,爲了增強移植性,可以提供不同數據庫的操作實現
        2. 在編寫不同的sql語句的時候,可以指定databaseId屬性來標識當前sql語句可以運行在哪種數據庫中
            <select id="findEmpByEmpno" resultType="com.mashibing.bean.Emp" databaseId="mysql">
                select * from emp where empno = #{empno}
            </select>
            <select id="findEmpByEmpno" resultType="com.mashibing.bean.Emp" databaseId="orcl">
                select * from emp where empno = #{empno}
            </select>
	    3. type必須寫DB_VENDOR,DB_VENDOR實現會將mybatis自身的databaseId設置爲,數據庫產品名與property中name第一個相匹配的值,如果沒有匹配屬性,將設置爲null
    -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="SQL Server" value="sqlserver"/>
        <property name="Oracle" value="orcl"/>
    </databaseIdProvider>
    <!--1. mappers:用來在程序啓動時,對映射文件進行加載,需要注意,所有映射文件,都必須加入到mybatis-config.xml文件中-->
    <mappers>
        <!--1. class:直接引入接口的全限定類名,此時可以使用註解的方式來進行相關的配置
            <mapper class="com.mashibing.dao.EmpDaoAnnotation"></mapper>
                1. 如果不想用註解,也可以將xml文件放在dao接口的同級目錄下,文件名與dao接口名相同
                2. 如果是maven構建項目,由於maven只會自動編譯java文件,不會編譯xml文件,會導致xml文件無法進入項目真正的target文件夾中
                    1. 可以在resources資源目錄下,建立和dao層一樣的同級目錄,將xml配置文件放到該目錄中
                    2. 也可以在pom.xml中進行如下設置,表示編譯java文件的同時,也編譯xml文件
                    3. 經過以上兩者之一的配置後,target文件夾中,纔會在EmpDao.class同級目錄下生成EmpDao.xml
                    <build>
                        <resources>
                            <resource>
                                <directory>src/main/java</directory>
                                <includes>
                                    <include>**/*.xml</include>
                                </includes>
                            </resource>
                        </resources>
                    </build>
            2. url:從磁盤或者網絡路徑查找sql映射文件
            3. resource:在類路徑下尋找sql映射文件
                <mapper resource="EmpDao.xml"/>
            4. package:相當於批量註冊多個class,因此class配置時需要注意的點,package也需要注意-->
        <package name="com.mashibing.dao"/>
    </mappers>
</configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章