MyBatis【一】環境搭建及入門案例

1. 框架的概念

什麼是框架?

  • 框架就是一個半成品軟件,它是軟件開發中的一套解決方案,不同的框架解決的是不同的問題。

爲什麼要使用框?

使用框架的好處:

  • 框架封裝了很多的細節,使開發者可以使用極簡的方式實現功能,大大提高開發效率。

框架要解決的問題是什麼?

  • 實現技術解耦。將研發集中在應用的設計上,而不是具體的技術實現。

2. MyBatis框架概述

【官方文檔】

MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

MyBatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 JDBC,使開發者只需要關注 SQL語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 Statement 等繁雜的過程。

MyBatis通過xml或註解的方式將要執行的各種 Statement 配置,並通過 java對象和 Statement 中 SQL 的動態參數進行映射生成最終執行的SQL語句,最後由 MyBatis 框架執行 SQL並將結果映射爲 java 對象並返回。

MyBatis採用 ORM 思想解決了實體和數據庫映射的問題,對JDBC進行了封裝,屏蔽了JDBC API底層訪問細節,不用與 JDBC API打交道,就可以完成對數據庫的持久化操作。

ORM:Oject Relational Mapping 對象關係映射

簡單的說:就是把數據庫表實體類實體類的屬性對應起來,讓我們可以操作實體類就實現操作數據庫表

在JavaBean對象的實體類中屬性和數據庫表的字段名稱要保持一致

DB_Table JavaBean
user user
id id
username username

3. 持久層技術解決方案

JDBC技術

  • Connection獲取連接

  • Preparedstatement 預處理SQL語句

  • Resultset 封裝結果集對象

SpringJdbcTemplate

  • Spring中對JDBC的簡單封裝

Apache DBUtils

  • 它和 Spring的 JabcTemplate很像,也是對JDBC的簡單封裝

以上這些都不是框架,JDBC是規範。Spring的JdbcTemplate和 Apache的DBUtils都只是工具類

4. MyBatis入門案例

Dao層下的接口無實現類,簡化開發

環境搭建的注意事項

  1. 創建IUserDao.xmlIUserDao.java時名稱是爲了和MVC以及三層架構的目錄結構保持一致。在 Mybatis中它把持久層的映射文件也叫做:Mapper。所以:IUserDaoIUserMapper是一樣的

  2. 在resource中創建MyBatis的映射配置文件時,MaBatis的映射配置文件位置必須和Dao接口的包結構相同(比如均爲org.iqqcode.dao)

  3. 映射配置文件的mapper標籤的namespace屬性的取值必須是dao接口的全限定類名

  4. 映射配置文件的操作配置( select),id屬性的取值必須是dao接口的方法名

當我們遵從了以上約定之後,我們在開發中就無須再寫dao的實現類,剩下的功能將由MyBatis實現

基於xml配置

MaBatis 基於xml環境搭建【目錄結構】:

第一步:創建maven工程並導入座標

<?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.iqqcode</groupId>
    <artifactId>MyBatis_SectionI</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--打包方式-->
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

第二步:創建實體類和dao的接口

User用戶實體類

//實現Serializable接口,將對象序列化
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private int id;
    private String name;
    private Date birthday;
    private String sex;
    private String address;
}

IuserDao用戶持久層接口(數據訪問層)

public interface IUserDao {
    /**
     * 查詢所有操作
     * @return
     */
    List<User> findAll();
}

第三步:創建Mybatis的主配置文件SqlMapConifg.xml

連接數據名爲 db_mybatistest,用戶實體表爲User

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

<!--MyBatis主配置文件-->
<configuration>
    <!--配置環境-->
    <environments default="mysql">
        <!--配置MySQL環境-->
        <environment id="mysql">
            <!--配置事務類型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置數據源(連接池)-->
            <dataSource type="POOLED">
                <!--配置連接數據庫的基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db_mybatistest"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件-->
    <mappers>
        <mapper resource="org/iqqcode/dao/IUserMapper.xml"/>
    </mappers>
</configuration>

第四步:創建映射配置文件IUserMapper.xml

此處包的路徑一定要和dao層下的 IUserDao保持一致,否則會出現

Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL 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">

<mapper namespace="org.iqqcode.dao.IUserDao">
    <!--配置查詢所有-->
    <select id="findAll" resultType="org.iqqcode.domain.User">
        select * from user;
    </select>
</mapper>

log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

測試

MyBatisXmlTest

package com.iqqcode.test;

import org.iqqcode.dao.IUserDao;
import org.iqqcode.domain.User;
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;
import java.util.List;

/**
 * @Author: Mr.Q
 * @Date: 2020-04-08 15:45
 * @Description:入門基於xml測試案例
 */
public class MyBatisXmlTest {
    public static void main(String[] args) throws IOException {
        //1.讀取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

        //2.創建SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);

        //3.使用工廠生產SqlSession對象
        /**此時session可以操縱數據庫了,但是我們要用Dao來操縱數據庫,所以產生Dao代理對象**/
        SqlSession session = factory.openSession();

        //4.使用SqlSession創建Dao接口的代理對象
        IUserDao userDao = session.getMapper(IUserDao.class);

        //5.使用代理對象執行方法
        List<User> users = userDao.findAll();
        for (User user : users) {
            System.out.println(user);
        }

        //6.釋放資源
        session.close();
        in.close();
    }
}

執行結果,打印User表內容


基於Annotation配置

把resources下的IUserDao.xml移除
在這裏插入圖片描述

在Dao接口的方法上使用@Select註解

public interface IUserDao {
    /**
     * 查詢所有操作
     * @return
     */
    @Select("select * from user")
    List<User> findAll();
}

並且指定SQL語句時在SqlMapConfig.xml中的 mapper配置使用class屬性指定dao接口的全限定類名

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

<!--MyBatis主配置文件-->
<configuration>
    <!--配置環境-->
    <environments default="mysql">
        <!--配置MySQL環境-->
        <environment id="mysql">
            <!--配置事務類型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置數據源(連接池)-->
            <dataSource type="POOLED">
                <!--配置連接數據庫的基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db_mybatistest"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每個dao獨立的配置文件
    如果是用註解來配置的話,此處應該使用class屬性指定被註解的dao全限定類名-->
    <mappers>
        <mapper class="org.iqqcode.dao.IUserDao"/>
    </mappers>
</configuration>

Dao層下的接口有實現類

UserDaoImpl

public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory;

	//構造方法初始化參數,防止空參傳遞
    public UserDaoImpl(SqlSessionFactory  factory){
        this.factory = factory;
    }

    public List<User> findAll(){
        //1.使用工廠創建SqlSession對象
        SqlSession session = factory.openSession();
        //2.使用session執行查詢所有方法
        List<User> users = session.selectList("org.iqqcode.dao.IUserDao.findAll");
        session.close();
        //3.返回查詢結果
        return users;
    }
}

測試類

DaoImplementsTest

/**
 * @Author: Mr.Q
 * @Date: 2020-04-08 16:27
 * @Description:dao有實現類測試
 */
public class DaoImplementsTest {
    public static void main(String[] args) throws IOException {
        //1.讀取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

        //2.創建SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);

        //3.使用工廠創建dao對象
        IUserDao userDao = new UserDaoImpl(factory);

        //4.使用代理對象執行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
        //5.釋放資源
        in.close();
    }
}

5. MyBatis入門案例分析

第一步:讀取配置文件

在開發中,我們並不是通過寫路徑名來讀取到配置文件的,而是動態獲取路徑

  • 絕對路徑:G:\Test\Config

如果此電腦無G盤,或者操作系統不同,盤符分割符不同則無法找到配置文件

  • 相對路徑:src/main/resources

如果此項目部署在服務器上,則不存在src目錄,文件無法找到

正確的做法應該是:

  1. 使用類加載器(只能獲取類路徑的配置文件)

  2. 使用ServletContext對象的getRealPath()


第二步:創建SqlSessionFactory工廠

創建工廠MyBatis使用了構建者模式builder就是構建者

把繁瑣的細節封裝起來,讓構建者去實現

構建者模式:把對象的創建細節隱藏,直接調用方法拿到對象


第三步:創建 SqlSession

生產者SqlSession使用了工廠模式,而不是直接new,降低了類之間的耦合度


第四步:創建Dao接口的代理對象
在這裏插入圖片描述
getMapper(IUserDao.class)創建Dao接口實現類使用了代理模式

優勢:在不修改源碼的基礎上對已有方法功能增強

第五步:執行dao中的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章