Mybatis 用Demo去入門 (使用數據庫的查詢操作測試)


一:首先知道什么叫 Mybatis      

       MyBatis 是支持普通 SQL查詢存儲過程和高級映射的優秀 持久層框架。MyBatis 消除了幾乎所有的 JDBC代碼和參數的手工設置以及 結果集的檢索。MyBatis 使用簡單的 XML或注解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
    每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。
用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創建的實例。MyBatis有一個實用類----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。
二: 執行流程:(比較抽象{拽文得大牛讀得懂哈哈---} 可參照 Demo 理解)
 
(1)加載配置並初始化
觸發條件:加載配置文件
處理過程:將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
(2)接收調用請求
觸發條件:調用Mybatis提供的API
傳入參數:為SQL的ID和傳入參數對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求
觸發條件:API接口層傳遞請求過來
傳入參數:為SQL的ID和傳入參數對象
處理過程:
(A)根據SQL的ID查找對應的MappedStatement對象。
(B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
(C)獲取數據庫連接,根據得到的最終 SQL語句和執行傳入參數到數據庫執行,並得到執行結果。
(D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連接資源。
(4)返回處理結果將最終的處理結果返回。
三:Demo 入門 Mybatis (本文 最主要的部分)[后期提供相應的代碼]
   首先看一下整個項目文件部署圖:

         (1)創建項目-----接着導入相關的jar 包;

(稍后提供相應的源碼)

        (2) 接着 創建好 相應的數據庫表 (Demo的數據庫名:hytc ;表名稱:users)

          (3) 創建相應的 entity 實體類 Users (Demo中 類的私有屬性和表重的元素----有些不同 這里大家先留意一下

  

package ankermaker.top.entity;
import java.util.Date;
/**
 * 
 * @author Ankermaker
 *  users 表對應的實體類
 */
public class Users {    
    protected Integer id;
    protected String name;
    protected String sex;
    protected String edu;
    protected Date birth;
    protected String remark;

    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 String getSex() {
        return sex;
    }

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

    public String getEdu() {
        return edu;
    }

    public void setEdu(String edu) {
        this.edu = edu;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
    @Override
    public String toString() {
        return "Users [id=" + id + ", name=" + name + ", sex=" + sex + ", edu="
                + edu + ", birth=" + birth + ", remark=" + remark + "]";
    }

}

    (4)接下來創建 Mybatis 的 核心配置xml文件 (命名 沒有要求 ),存放與src目錄下;[Demo中 以 conf.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>
<!-- 為 實體映射 文件 創建別名映射 -->
<typeAliases>

    <package name="ankermaker.top.entity"/><!--這個 包下面的 所有 實體類 別名 自動 創建 -->

</typeAliases>

    <environments default="development"><!-- 環境池 配置 :default 屬性值 默認環境名稱 -->
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置數據庫連接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/hytc" /><!-- 老陳寫法:jdbc:mysql:///hytc -->
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
     
     <mappers>      
        <mapper resource="ankermaker/top/mappers/Usersmapper.xml"/>       
    </mappers>
</configuration>

      (5)接下來創建 mapper 映射操作xml文件 (這個文件的作用:簡單的說:所有對表的增刪改查操作 的sql 語句和 該文件映射的借口類中的方法 在給文件中注冊體現;執行查詢的方法有多種,通過 映射文件創建映射借口,用戶調用Mapper接口中的方法,執行相應的sql語句 並返回查詢結果!大家在測試之后 可以仔細的感受該文件的作用!!!)

      Demo中的Mapper 映射操作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="ankermaker.top.mappers.Usersmapper"><!-- 映射接口類的 路徑!!! -->
     
     <!-- 實體類 中 與表名字 不同  使用 resultMap 來創建 別名映射!-->
     <resultMap type="users" id="userMap">
             <id column="u_id" property="id" jdbcType="INTEGER"/>
             <result column="u_name" property="name"/>
             <result column="u_sex" property="sex"/>    
     </resultMap>   
       <!-- 查詢 所有 數據 測試! -->  
    <select id="getObjects" resultMap="userMap"> <!-- 直接引用 上面的 resultMap --> 
     
        select u_id,u_name,u_sex from users
        
    </select>
  
</mapper>

      (6)接下來創建 mapper映射文件的 映射接口類:接口類名和映射操作xml文件 名一樣!!都為:Usersmapper

package ankermaker.top.mappers;

import java.util.List;


import ankermaker.top.entity.Users;

public interface Usersmapper {

    /**
     * 查詢所有用戶的信息
     * 
     * @return
     */
    public List<Users> getObjects();//測試 數據庫獲取所有的 記錄 方法;


}

        (7)接了下就是測試 數據庫操作的時候了  創建 測試類,

      

package ankermaker.top.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.After;
import org.junit.Before;
import org.junit.Test;
import ankermaker.top.entity.Users;
import ankermaker.top.mappers.Usersmapper;
public class AppText {

    private SqlSessionFactory sessionFactory;
    private static SqlSession session;
    private Usersmapper mapper;

    @Before
    public void setup() {
        String resource = "conf.xml";
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream(resource);
            sessionFactory = new SqlSessionFactoryBuilder().build(is);
            session = sessionFactory.openSession();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void getObjects() {
        // 分頁查詢
        // 獲取 映射 借口 對象 ;
        mapper = session.getMapper(Usersmapper.class);
        List<Users> list = mapper.getObjects();

        for (Users u : list) {
            System.out.println(u + "測試成功");
        }
    }

    @After
    public void result() {
        if (sessionFactory != null) {
            sessionFactory = null;
        }
        if (session != null) {
            session = null;

        }
    }
}

  使用 junit test 測試 getObjects方法; 

四:問題分析:論ResultMap 的作用!

大家看Usersmapper.xml 中的resultMap標簽的使用! 

<resultMap id="userMap" type="users">

  <id jdbcType="INTEGER" property="id" column="u_id"/>

  <result property="name" column="u_name"/>

  <result property="sex" column="u_sex"/>

</resultMap> 

....

select u_id,u_name,u_sex from users 

由於實體中的私有屬性和表中的列名不一致所以要使用 ResultMap 這個標簽讓他們之間產生映射,Demo中不能展現的很清楚大家可以在測試 按條件查詢的時候,會發現resultMap 的用處!

五:項目部署完成  但總感覺這篇寫的沒有什么思路希望大家看不明白了諒解,大家學習即可就好啦,我們大家一起進步;

項目源碼下載

 

 

 

    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM