初識Mybatis,您可太棒了

這是學習Mybatis的第一天,沖沖衝!

一. 什麼是框架

簡而言之,框架其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。

框架的重要性

框架一般處在低層應用平臺(如 J2EE)和高層業務邏輯之間的中間層,框架封裝了很多細節,使開發者可以用極簡的方式開發功能,大大提高了開發效率
框架的重要性在於它實現了部分功能,並且能夠很好的將低層應用平臺和高層業務邏輯進行了緩和。
爲了實現軟件工程中的“高內聚、低耦合”。把問題劃分開來各個解決,易於控制,易於延展,易於分配資源。我們常見的 MVC 軟件設計思想就是很好的分層思想。
剛從javaweb上來的同學有必要了解一下三層架構在ssm框架中的對應關係
在這裏插入圖片描述

Mybatis框架概述

mybatis是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql語句本身, 而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。
mybatis通過xml 或註解的方式將要執行的各種statement配置起來,並通過java對象和statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並 返回。
採用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我 們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作。
ORM: object relational Mappging 對象關係映射
簡單的說就是: 把數據庫表實體類及實體類的屬性對應起來,讓我們操作實體類就實現操作數據庫表.
實體類中的屬性要和數據庫表的字段名保持一致:
user User
id id
user_name user_name

二. 持久層技術解決方案

  1. JDBC技術:
    connection
    preparedStatement
    ResultSet
  2. spring的JdbcTemplate
    Spring對jdbc的簡單封裝
  3. Apache的DButils
    它和spring的JdbcTemplate很像,也是對Jdbc的簡單封裝

以上都不是框架:
JDBC是規範
spring的JdbcTemplate和Apache的Dbutils都是工具類

JDBC程序回顧

public static void main(String[] args) {   
 Connection connection = null;    
 PreparedStatement preparedStatement = null;    
 ResultSet resultSet = null;    
 try {     
 //加載數據庫驅動     
 Class.forName("com.mysql.jdbc.Driver");
     
     //通過驅動管理類獲取數據庫鏈接     
     connection =  DriverManager .getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro ot", "root"); 
    
    //定義 sql 語句 ?表示佔位符    
    String sql = "select * from user where username = ?"; 
    //獲取預處理 statement
         preparedStatement = connection.prepareStatement(sql); 
    //設置參數,第一個參數爲 sql 語句中參數的序號(從 1 開始),第二個參數爲設置的 參數值    
    preparedStatement.setString(1, "王五");     //向數據庫發出 sql 執行查詢,查詢出結果集     
    resultSet =  preparedStatement.executeQuery(); 
    //遍歷查詢結果集     
    while(resultSet.next()){              System.out.println(resultSet.getString("id")+"   "+resultSet.getString("username"));     }    } catch (Exception e) {     e.printStackTrace(); 
   }finally{     //釋放資源     if(resultSet!=null){      try {       resultSet.close(); 
     } catch (SQLException e) {       e.printStackTrace();      }     }     if(preparedStatement!=null){     
      try {       preparedStatement.close();      } catch (SQLException e) {       e.printStackTrace();      }     }     if(connection!=null){      
      try {      
       connection.close();      } catch (SQLException e) {       
      // TODO Auto-generated catch block       
      e.printStackTrace();      }     }    }   } 
上邊使用 jdbc 的原始方法(未經封裝)實現了查詢數據庫表記錄的操作。 

jdbc 問題分析

1、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫連接池可解決此問題。
2、Sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大,sql 變動需要改變 java 代碼。
3、使用 preparedStatement 向佔有位符號傳參數存在硬編碼,因爲 sql 語句的 where 條件不一定,可能 多也可能少,修改 sql 還要修改代碼,系統不易維護。
4、對結果集解析存在硬編碼(查詢列名),sql 變化導致解析代碼變化,系統不易維護,如果能將數據庫記 錄封裝成 pojo 對象解析比較方便。

三. Mybatis入門

mybatis環境搭建

第一步:創建maven工程並導入座標
第二步:創建實體類和dao的接口
第三步:創建Mybatis的主配置文件
sqlMapconfig.xml
第四步:創建映射配置文件
IUserDao.xml

環境搭建的注意事項
第一個:創建IUserDao.xml和IUserDao.java是爲了和我們之前的知識保持一致。
在Mybatis中把持久層的操作接口名稱和映射文件也叫作:mapper
所以IUserDao和IUserMapper是不一樣的
第二個:在idea中創建目錄的時候,它和包是不一樣的包在創建時,com.zzd.dao是三級結構,目錄在創建時com.zzd.dao是一級目錄。
在這裏插入圖片描述
關於如何建目錄創建多級package:

在這裏插入圖片描述
點擊取消即可
第三個
mybatis的映射配置文件位置必須和dao接口的包結構相同
第四個
映射配置文件的mapper標籤namespace屬性的取值必須是dao接口的全限定類名
第五個
映射配置文件的操作配置(select),id屬性的取值必須是dao接口的方法名

IDEA創建步驟

  1. 創建Maven項目
  2. 在 pom.xml 文件中添加 Mybatis3.4.5 的座標,如下:
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

3.編寫 User 實體類

package com.zzd.domain;

import java.util.Date;

/**
 * @author 張振東
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句話描述該文件做什麼)
 * @date:
 */
public class User {
   private Integer id;
   private String username;
   private Date birthday;
   private String sex;
   private String address;

   public Integer getId() {
      return id;
   }

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

   public String getUsername() {
      return username;
   }

   public void setUsername(String username) {
      this.username = username;
   }

   public Date getBirthday() {
      return birthday;
   }

   public void setBirthday(Date birthday) {
      this.birthday = birthday;
   }

   public String getSex() {
      return sex;
   }

   public void setSex(String sex) {
      this.sex = sex;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String address) {
      this.address = address;
   }

   @Override
   public String toString() {
      return "User{" +
            "id=" + id +
            ", username='" + username + '\'' +
            ", birthday=" + birthday +
            ", sex='" + sex + '\'' +
            ", address='" + address + '\'' +
            '}';
   }
}
  1. 編寫持久層接口 IUserDao
package com.zzd.dao;

import com.zzd.domain.User;

import java.util.List;

/**
 * @author 張振東
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句話描述該文件做什麼)
 * @date:
 */
public interface IUserDao {
   /**
    * 查詢所有用戶   * @return
    */
   List<User> findAll();
}
  1. 編寫持久層接口的映射文件 IUserDao.xml
    要求: 創建位置:必須和持久層接口在相同的包中。
    名稱:必須以持久層接口名稱命名文件名,擴展名是.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.zzd.dao.IUserDao">   <!-- 配置查詢所有操作 -->
    <select id="findAll" resultType="com.zzd.domain.User">
   select * from user
    </select>
</mapper>
  1. 編寫 SqlMapConfig.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>
    <!-- 配置 mybatis 的環境 -->
    <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/firstdb?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="zzd..000"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 告知 mybatis 映射配置的位置 -->
    <mappers>
        <mapper resource="com/zzd/dao/IUserDao.xml"/>
    </mappers>
</configuration>
  1. 編寫測試類
import com.zzd.dao.IUserDao;
import com.zzd.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.InputStream;
import java.util.List;

/**
 * @author 張振東
 * @version V1.0
 * @Title:
 * @Package
 * @Description: (用一句話描述該文件做什麼)
 * @date:
 */
public class MybatisTest {
   public static void main(String[] args) throws Exception {
      //1.讀取配置文件
      InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
      //2.創建 SqlSessionFactory 的構建者對象
      SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
      //3.使用構建者創建工廠對象SqlSessionFactory
      SqlSessionFactory factory = builder.build(in);
      //4.使用 SqlSessionFactory 生產 SqlSession 對象
      SqlSession session = factory.openSession();
      //5.使用 SqlSession 創建 dao 接口的代理對象
      IUserDao userDao = session.getMapper(IUserDao.class);

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

}

補充(基於註解的 mybatis 使用)

  1. 在持久層接口中添加註解
/**  *   * <p>Title: IUserDao</p> 
 * <p>Description: 用戶的持久層操作</p> 
 *  * <p>Company: http://www.itheima.com/ </p>  
 *  */ public interface IUserDao {    /** 
  * 查詢所有用戶   * @return   */ 
  *  @Select("select * from user")  
  * List<User> findAll(); }
  1. 修改 SqlMapConfig.xml
<!-- 告知 mybatis 映射配置的位置 --> <mappers> 
 <mapper class="com.itheima.dao.IUserDao"/> </mappers> 
  1. 注意事項: 在使用基於註解的 Mybatis 配置時,請移除 xml 的映射配置(IUserDao.xml)

小結

通過快速入門示例,我們發現使用 mybatis 是非常容易的一件事情,因爲只需要編寫 Dao 接口並且按照 mybatis 要求編寫兩個配置文件,就可以實現功能。遠比我們之前的 jdbc 方便多了。(我們使用註解之後,將變得 更爲簡單,只需要編寫一個 mybatis 配置文件就夠了。)
但是,這裏麪包含了許多細節,比如爲什麼會有工廠對象(SqlSessionFactory),爲什麼有了工廠之後還 要有構建者對象(SqlSessionFactoryBuilder),爲什麼 IUserDao.xml 在創建時有位置和文件名的要求等等。
這些問題我們在自定義 mybatis 框架的章節,通過層層剝離的方式,給大家講解。
請注意:自定義 Mybatis 框架,不是讓大家回去自己去寫個 mybatis,而是讓我們能更好了瞭解 mybatis 內部是怎麼執行的,在以後的開發中能更好的使用 mybatis 框架,同時對它的設計理念(設計模式)有 一個認識

在這裏插入圖片描述
END!!! 下篇接着介紹。

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