MyBatis學習一:環(huán)境搭建與第一個Demo

1. 回顧JDBC編程步驟

  1. 加載數(shù)據(jù)庫驅(qū)動

  2. 創(chuàng)建并獲取數(shù)據(jù)庫鏈接

  3. 創(chuàng)建jdbc PreparedStatement對象

  4. 定義sql語句

  5. 設置sql語句中的參數(shù)(使用PreparedStatement)

  6. 通過statement執(zhí)行sql并獲取結果

  7. 對sql執(zhí)行結果進行解析處理

  8. 釋放資源(ResultSet攘蔽、PreparedStatement、Connection)


2. 問題總結

  1. 數(shù)據(jù)庫連接,使用時就創(chuàng)建伞剑,不使用立即釋放,對數(shù)據(jù)庫進行頻繁連接開啟和關閉傀蓉,造成數(shù)據(jù)庫資源浪費笛园,影響數(shù)據(jù)庫性能。

設想:使用數(shù)據(jù)庫連接池管理數(shù)據(jù)庫連接替久。

  1. 將sql語句硬編碼到Java代碼中,如果sql語句修改躏尉,需要重新編譯Java代碼蚯根,不利于系統(tǒng)維護。

設想:將sql語句配置在xml配置文件中醇份,即使sql變化稼锅,不需要對Java代碼進行重新編譯。

3)向preparedStatement中設置參數(shù)僚纷,對占位符號位置和設置參數(shù)值矩距,硬編碼在Java代碼中,不利于系統(tǒng)維護怖竭。

設想:將sql語句及占位符號和參數(shù)全部配置在xml中锥债。

  1. 從resultSet中遍歷結果集數(shù)據(jù)時,存在硬編碼痊臭,將獲取表的字段進行硬編碼哮肚,不利于系統(tǒng)維護。

設想:將查詢的結果集广匙,自動映射成Java對象允趟。


3. 引入MyBatis

(1)Mybatis 介紹

  1. Mybatis是一個持久層的框架,是apache下的頂級項目鸦致。

  2. Mybatis托管到goolecode下潮剪,再后來托管到github下

  3. Mybatis讓程序?qū)⒅饕Ψ旁趕ql上涣楷,通過Mybatis提供的映射方式,自由靈活生成(半自動化抗碰,大部分需要程序員編寫sql)滿足需要sql語句狮斗。

  4. Mybatis可以將向 PreparedStatement中的輸入?yún)?shù)自動進行輸入映射,將查詢結果集靈活映射成java對象弧蝇。(輸出映射)

MyBatis官方文檔:https://mybatis.org/mybatis-3/

MyBatis GitHub下載:https://github.com/mybatis/mybatis-3

(2)ORM

ORM :Object Relational Mapping 對象關聯(lián)映射

對象關系映射即是將Java中的對象一一對應映射到數(shù)據(jù)庫的Table(表)中碳褒,通過對對象各個屬性賦值來更新數(shù)據(jù)庫。官方的說看疗,對象關系映射(Object Relational Mapping沙峻,簡稱ORM)是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將面向?qū)ο笳Z言程序中的對象自動持久化到關系數(shù)據(jù)庫中鹃觉。


Java                                            MySQL

Object                                         Data

一個個對象                                    一條條記錄

用于實現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換专酗。從效果上說,它其實是創(chuàng)建了一個可在編程語言里使用的--“虛擬對象數(shù)據(jù)庫”盗扇。

ORM只是 對象關聯(lián)映射 設計思想,具體技術: Mybatis 沉填、Hibernate


(3)第一個Mybatis環(huán)境搭建

(1)新建Java項目疗隶,導入mybatis 、mysql-connector-java 相關依賴

(2)數(shù)據(jù)源配置 mybatis-config.xml

(3)實體類 pojo 

(4)dao 接口

(5)映射文件mapper

(6)MybatisUtil類設計

(7)測試

(3.1)maven 導入相關依賴

<!--=================依賴========================-->
  <dependencies>
    <!--mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.33</version>
    </dependency>

    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.0</version>
    </dependency> 
  
  </dependencies>

說明:

mybatis-config.xml: 從mybatis框架下載的源碼中獲取翼闹,復制到項目中

是Mybatis 核心配置文件: 配置了數(shù)據(jù)源斑鼻、連接池、映射mapper文件等

(3.2)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">

<!--Mybatis 核心配置文件:配置了數(shù)據(jù)源猎荠、連接池坚弱、映射mapper文件 -->

<configuration>

    <environments default="development">

        <environment id="development">

            <transactionManager type="JDBC">

                <property name="" value=""/>

            </transactionManager>

            <dataSource type="UNPOOLED">

                <property name="driver" value="com.mysql.jdbc.Driver"/>

                <property name="url" value="jdbc:hsqldb:mem:automapping"/>

                <property name="username" value="root"/>

            </dataSource>

        </environment>

    </environments>

<!-- 注冊mapper文件到mybatis-config.xml中-->

  <mappers>

    <mapper resource="com/aistar/dao/CustomerMapper.xml" />

  </mappers>

</configuration>

(3.2)定義dao接口

public interface CustomerDao {
    /**
     * 根據(jù)主鍵查詢用戶對象
     * @param id 指定查詢的用戶id
     * @return  返回對應的Customer對象
     */
    public Customer selectById(int id);
}

(3.3) Customer.java POJO類省略

(3.4) CustomerMapper.xml ( mybatis框架下載的源碼中獲取,復制到項目中 )

定義了執(zhí)行sql語句关摇,結果映射(數(shù)據(jù)庫表中記錄與java中對象的映射關系)

<?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">
<!--
    namespace: dao接口的類全名
-->
<mapper namespace="com.aistar.dao.CustomerDao">

   <resultMap id="customer" type="com.aistar.entity.Customer">
      <!--主鍵列 映射 id -->
      <id column="cust_id" property="custId"></id>
      <result column="cust_name" property="custName"></result>
      <result column="cust_pwd" property="custPwd"></result>
      <result column="cust_gender" property="custGender"></result>
      <result column="cust_telno" property="custTelno"></result>
      <result column="cust_email" property="custEmail"></result>
   </resultMap>

   <!--
      根據(jù)主鍵查詢用戶對象
      id:dao接口方法名
      parameterType: 方法的參數(shù)類型
      resultType: (類類型荒叶、基本數(shù)據(jù)類型)方法返回值類型
      resultMap: 返回的是自定義好的<resultMap id="">
    -->
   <select id="selectById" parameterType="int" resultMap="customer">
      select cust_id,cust_name,cust_pwd, cust_gender,cust_telno, cust_email
       from customer
       where cust_id = #{id} and cust_status =0
   </select>

</mapper>

(3.5)MybatisUtil.java

/**
 * 獲得SqlSession與關閉SqlSession
 */
public class MyBatisUtil {
    private static SqlSession sqlSession;
    private static   SqlSessionFactory sqlSessionFactory;

   static {
       //將mybatis-config.xml(還包含mapper.xml)加載到讀取流中
       InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream("config/mybatis-config.xml");
        System.out.println(is);
        //讀取mybatis-config.xml的數(shù)據(jù)源信息,建立數(shù)據(jù)庫連接
       sqlSessionFactory =  new  SqlSessionFactoryBuilder().build(is);

   }

    /**
     * SqlSession : 一級緩存 输虱,管理數(shù)據(jù)庫的sql語句操作(增刪改查操作)些楣,封裝的是PreparedStatement
     * @return 返回SqlSession對象
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

    /**
     * 關閉SqlSession
     */
    public static void closeSqlSession(){
        if(sqlSession!=null ){
            sqlSession.close();
        }
    }

}

(3.6)測試類

public class TestCustomer {
    public static void main(String[] args) {
              
        CustomerDao dao = MyBatisUtil.getSqlSession().getMapper(com.aistar.dao.CustomerDao.class);
        Customer customer = dao.selectById(101);
        System.out.println(customer);
    }
}

分析:

    mybatis-config.xml:
        <mappers>
        <mapper resource="com/aistar/dao/CustomerMapper.xml" />
        <mapper resource="com/aistar/dao/NoteMapper.xml" />
        <mapper resource="com/aistar/dao/TraceMapper.xml" />
        <mapper resource="com/aistar/dao/CommentMapper.xml" />
     </mappers>
     
    1. 
         mapper文件注冊到mybatis-config.xml 中心
         注冊:CustomerMapper.xml 【namespace="com.aistar.dao.CustomerDao"】
         注冊:NoteMapper.xml     【namespace="com.aistar.dao.NoteDao"】
    
    2. Statement Collection 容器
        namespace ="接口類全名1 com.aistar.dao.CustomerDao"
            <select id="接口的方法名">
            <insert id="接口的方法名">
            <update id="接口的方法名">
            <delete id="接口的方法名">
            <....   id="接口的方法名">
            
         namespace ="接口類全名2 com.aistar.dao.NoteDao"
            <select id="接口的方法名">
            <insert id="接口的方法名">
            <update id="接口的方法名">
            <delete id="接口的方法名">
            <....   id="接口的方法名">
  1. getMapper :底層產(chǎn)生一個CustomerDao代理對象(是CustomerDao的實現(xiàn)子類),CustomerDaoImplProxy到注冊中心 mybatis-config.xml 找對應namespace文件中的

  2. dao.selectById(..):CustomerDaoImplProxy 到Statement Collection 對應 namespace 有沒有匹配的id與當前方法同名宪睹,
    sqlSession封裝了 PreparedStatement.executeQuery( <select id="接口的方法名"> 轉(zhuǎn)換成sql語句)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愁茁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亭病,更是在濱河造成了極大的恐慌鹅很,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罪帖,死亡現(xiàn)場離奇詭異促煮,居然都是意外死亡邮屁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門污茵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樱报,“玉大人,你說我怎么就攤上這事泞当〖8颍” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵襟士,是天一觀的道長盗飒。 經(jīng)常有香客問我,道長陋桂,這世上最難降的妖魔是什么逆趣? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嗜历,結果婚禮上宣渗,老公的妹妹穿的比我還像新娘。我一直安慰自己梨州,他們只是感情好痕囱,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暴匠,像睡著了一般鞍恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上每窖,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天帮掉,我揣著相機與錄音,去河邊找鬼窒典。 笑死蟆炊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的崇败。 我是一名探鬼主播盅称,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼后室!你這毒婦竟也來了缩膝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤岸霹,失蹤者是張志新(化名)和其女友劉穎疾层,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贡避,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡痛黎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年予弧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湖饱。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掖蛤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出井厌,到底是詐尸還是另有隱情蚓庭,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布仅仆,位于F島的核電站器赞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墓拜。R本人自食惡果不足惜港柜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咳榜。 院中可真熱鬧夏醉,春花似錦、人聲如沸涌韩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贸辈。三九已至,卻和暖如春肠槽,著一層夾襖步出監(jiān)牢的瞬間擎淤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工秸仙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘴拢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓寂纪,卻偏偏與公主長得像席吴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捞蛋,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容