MyBatis開發(fā)步驟

MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優(yōu)秀持久層框架励背。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索俄精。MyBatis 使用簡單的 XML 或注解用于配置和原始映射,將接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 對象)映射成數(shù)據(jù)庫中的記錄朦拖。

MyBatis的前身是iBatis,MyBatis在iBatis的基礎(chǔ)上面侯养,對代碼結(jié)構(gòu)進行了大量的重構(gòu)和簡化;大量的參考了Hibernate的設(shè)計
MyBatis沒有hibernate方便,功能沒有hibernate強大;易學(xué),性能更好的被程序猿控制

1.導(dǎo)jar包:
MyBatis的核心包:mybatis-3.1.1.jar
MyBatis依賴的jar包:lib/*.jar
MySQL的驅(qū)動包:mysql-connector-java-5.1.7-bin.jar


2.在數(shù)據(jù)庫(mybatis)中創(chuàng)建一張表(user)

3.根據(jù)表創(chuàng)建實體類:User


4.MyBatis的主配置文件:mybatis-config.xml
配置事務(wù)管理器/連接池/映射器

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">
<configuration>
<!-- 聲明一些屬性Properites 
<properties>
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql:///mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</properties>
-->
<properties resource="db.properties" />
<!-- 為類型配置別名 -->
<typeAliases>
    <typeAlias type="com.jd.pss.query.User" alias="User"/>
    <typeAlias type="com.jd.pss.query.UserQueryObject" alias="UserQueryObject"/>
</typeAliases>
<!-- 配置環(huán)境
    default代表mybatis默認(rèn)使用哪個環(huán)境
    問題,mybatis可以配置多個數(shù)據(jù)庫環(huán)境,目的是什么?
    1,容易在不同數(shù)據(jù)庫之間切換(default)
    2,mybatis是天生支持多數(shù)據(jù)庫,多數(shù)據(jù)庫類型的持久化框架;
 -->
<environments default="default">
    <!-- 配置一個環(huán)境,每個環(huán)境有自己的id-->
    <environment id="default">
        <!-- transactionManager:事務(wù)管理器,在定義這個環(huán)境中應(yīng)該怎么使用事務(wù)
             JDBC:注意大小寫,JDBC一定是一種Mybatis里面定義的TranscationManager的類型的別名;代表使用JDBC的事務(wù)管理
         -->
        <transactionManager type="JDBC" />
        <!-- datasource:數(shù)據(jù)庫連接池,定義在這個環(huán)境中連接數(shù)據(jù)庫相關(guān)信息
            POOLED:注意大小寫,POOLED也一定是一種mybatis里面定義的DataSource的別名,是代表需要緩存的連接池
         -->
        <dataSource type="POOLED">
            <!-- 使用property元素對數(shù)據(jù)庫連接信息進行配置 -->
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>
<!-- 在完成映射文件之后,需要告訴mybatis -->
<mappers>
    <mapper resource="com/jd/pss/query/UserMapper.xml"/>
</mappers>
</configuration>

** 5.MyBatis的映射文件**
UserMapper.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節(jié)點上的namespace屬性
namespace:命名空間,默認(rèn)情況下,這個namespace可以隨意寫,只是要求不同mapper文件之間的namespace不要重復(fù);
 -->
<mapper namespace="com.jd.pss.UserMapper">

<!-- 聲明一個resultMap來對結(jié)果集到對象的映射規(guī)范
    type屬性:這個resultMap要返回的對象類型
    id屬性:為這一個resultMap起一個名字
 -->
<resultMap type="User" id="base_mapping">
    <!-- 設(shè)置一個id屬性,
        column:對應(yīng)的列名;
        property:對應(yīng)對象中的屬性名
        javaType:對應(yīng)的java類型;
        jdbcType:對應(yīng)的數(shù)據(jù)庫中的類型;javaType+jdbcType=====hibernate的<property元素中的type
        默認(rèn)情況下一般不需要設(shè)置jdbcType和javaType,mybatis會自動識別
     -->
    <id column="id" property="id"/>
    <!-- 使用result來映射普通屬性 -->
    <!-- 普通的屬性映射 -->
<result column="name" property="name"/>
<result column="salary" property="salary"/>
<result column="hiredate" property="hiredate"/>
</resultMap>

<resultMap type="User" id="select_list_mapping">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
</resultMap>

<!-- 元素上都有一個id屬性,這個id屬性唯一的在這個mapper文件中定義了這個元素的名字
     這個元素的全名:namespace.id
     mybatis的CRUD操作元素中,寫的是SQL
     keyColumn:代表主鍵的列名;
     keyProperty:代表在對象中表示OID的屬性名字
     useGeneratedKeys:采用JDBC的獲取自動生成主鍵的方式獲取主鍵
 -->
<insert id="add" parameterType="User" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
    <!-- 在SQL中使用#{}來對應(yīng) parameterType中的對應(yīng)屬性的值-->
    INSERT INTO user(name,hiredate,salary) 
    VALUES (#{name},#{hiredate},#{salary})
</insert>

<!-- 添加一個update節(jié)點 -->
<update id="update" parameterType="User">
    update user set name=#{name},salary=#{salary},hiredate=#{hiredate} where
    id=#{id}
</update>

<!-- 添加一個刪除節(jié)點
<delete id="delete" parameterType="com.jd.mybatis.User">
    注意,這個時候,#{id}中id指的是傳入的User實例中的id屬性值
    DELETE FROM user WHERE id = #{id}
</delete>
 -->
<delete id="delete" parameterType="long">
    <!-- 注意,如果傳入的參數(shù)值是一個普通類型,那么在SQL中,就隨便寫名字 -->
    DELETE FROM user WHERE id = #{id}
</delete>

<!-- 在mybatis里面是不區(qū)分get和select的,get僅僅就是一個select 
    1,resultType:查詢出來的結(jié)果集中每一行結(jié)果集要包裝成的對象
    2,這里面會有一個問題,列和對象的屬性是怎么對應(yīng)的呢?
      可以使用resultMap來自定義列和對象屬性的映射關(guān)系;
     [注意]:一個select只能有一個resultType或者一個resultMap
-->
<!-- 編寫查詢語句 -->
<select id="get" parameterType="Long" 
resultMap="base_map">
select *from user where id=#{id}
</select>
<select id="list" resultMap="base_map">
select *from user 
</select>
</mapper>
sql語句

測試類

測試類

查詢測試類

查詢測試類

監(jiān)控MyBatis的運行

Domain的修改|刪除|查詢操作
mybatis找參數(shù)的方式:
1.首先使用屬性名的方式去找
必須:保存操作傳入的是一個User對象,所以在SQL中的#{name},的name使用的是User對象中的屬性名
2.如果在傳入的類型中找不到對應(yīng)的屬性,必如刪除操作,傳入的是一個long類型,在long中找不到一個叫做id的屬性,此時就直接使用傳進來的值作為參數(shù)

MyBatis的運行流程:
1.加載配置文件:mybatis-config.xml
得到事務(wù)管理器,使用JDBC的事務(wù)管理器來管理事務(wù)
得到連接池對象,然后設(shè)置相關(guān)的屬性,創(chuàng)建出對應(yīng)的連接池:POOLED,mybatis自身提供的連接池
創(chuàng)建一個SqlSessionFactory對象(相當(dāng)與一個連接池)
2.打開一個會話(和數(shù)據(jù)庫的會話) SqlSession,相當(dāng)于一個連接對象:Connection
3.使用SqlSession中的方法獲取到映射文件中的SQL語句,并且執(zhí)行SQL,獲取到執(zhí)行的結(jié)果
namespace+sqlid
insert into user(name, salary, hiredate) values(#{name},#{salary},#{hiredate})
將SQL中的占位符翻譯成符合預(yù)編譯語句對象的SQL :帶有占位符
insert into user(name, salary, hiredate) values(?,?,?)
創(chuàng)建一個預(yù)編譯語句對象
Connection對象.prepredStatement(sql);
設(shè)置參數(shù)
使用#{}指定的參數(shù)來作為SQL的參數(shù),#{}取的是指定類型對象的屬性值
執(zhí)行SQL
4.結(jié)果如果是一個結(jié)果集:查詢操作
此時需要將結(jié)果集數(shù)據(jù)封裝成指定類型(使用resultType來指定)的對象
注意:此時要求Java中的對象的屬性的類型(名稱)必須和數(shù)據(jù)庫中列的類型(名稱)的要一致

獲取自動生成的主鍵:
當(dāng)用戶執(zhí)行保存操作之后,立即將保存到數(shù)據(jù)庫中自動生成的主鍵返回回來
在JDBC中可以手動設(shè)置返回自動生成的主鍵:
在MyBatis中如何獲取?

2.在項目中,為自定義的類型設(shè)置別名
在主配置文件中做如下的配置:


3.在項目上線之后,需要管理人員來維護項目,所以,管理人員有可能去修改相關(guān)的配置:如連接數(shù)據(jù)庫的密碼等
為管理人員少犯低級錯誤(將配置文件修改錯),需要將這些需要修改的配置抽取到一個單獨的文件中:db.properties

**4.問題:在執(zhí)行查詢操作(增刪改沒有)的時候,如果屬性名和列名不一致,將造成數(shù)據(jù)封裝失敗的問題
**

解決方案:使用resultMap來對屬性和列做映射

此時,在查詢的SQL中,使用resultMap來指定結(jié)果集的封裝方式
注意:resultType和resultMap不能同時用

使用Mapper接口:
問題:1.在執(zhí)行CRUD操作的時候,需要去獲取到對應(yīng)的SQL語句(通過namespace+sqlid),如果將字符串寫錯,在編譯時期發(fā)現(xiàn)不了...
2.參數(shù)的類型接受的是Object類型的,所以,如果將參數(shù)類型設(shè)置錯了,在編譯時期發(fā)現(xiàn)不了...

解決方案: 使用Mapper接口來解決上面的問題
觀察獲取語句的字符串

com.jd.pss.domain.UserMapper.save
com.jd.pss.domain.UserMapper.delete
com.jd.pss.domain.UserMapper.update
com.jd.pss.domain.UserMapper.get
com.jd.pss.domain.UserMapper.list

上面的字符串很像在指定一個類的全限定名+類中的方法

接口的定義的要求:

public interface UserMapper {
void save(User u);
void delete(Long id);
void update(User u);
User get(Long id);
List<User> list();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲸鹦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跷跪,更是在濱河造成了極大的恐慌馋嗜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吵瞻,死亡現(xiàn)場離奇詭異葛菇,居然都是意外死亡,警方通過查閱死者的電腦和手機橡羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門眯停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卿泽,你說我怎么就攤上這事莺债。” “怎么了签夭?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵齐邦,是天一觀的道長。 經(jīng)常有香客問我第租,道長措拇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任慎宾,我火速辦了婚禮丐吓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟据。我一直安慰自己券犁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布之宿。 她就那樣靜靜地躺著族操,像睡著了一般。 火紅的嫁衣襯著肌膚如雪比被。 梳的紋絲不亂的頭發(fā)上色难,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音等缀,去河邊找鬼枷莉。 笑死,一個胖子當(dāng)著我的面吹牛尺迂,可吹牛的內(nèi)容都是我干的笤妙。 我是一名探鬼主播冒掌,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹲盘!你這毒婦竟也來了股毫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤召衔,失蹤者是張志新(化名)和其女友劉穎铃诬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苍凛,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡趣席,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醇蝴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣肚。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悠栓,靈堂內(nèi)的尸體忽然破棺而出霉涨,到底是詐尸還是另有隱情,我是刑警寧澤闸迷,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布嵌纲,位于F島的核電站,受9級特大地震影響腥沽,放射性物質(zhì)發(fā)生泄漏逮走。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一今阳、第九天 我趴在偏房一處隱蔽的房頂上張望师溅。 院中可真熱鬧,春花似錦盾舌、人聲如沸墓臭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窿锉。三九已至,卻和暖如春膝舅,著一層夾襖步出監(jiān)牢的瞬間嗡载,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工仍稀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼滚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓技潘,卻偏偏與公主長得像遥巴,于是被迫代替她去往敵國和親千康。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 1. 簡介 1.1 什么是 MyBatis 铲掐? MyBatis 是支持定制化 SQL拾弃、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評論 0 4
  • Java數(shù)據(jù)持久化之mybatis 一. mybatis簡介 1.1 原始的JDBC操作: Java 通過 Jav...
    小Q逛逛閱讀 4,918評論 0 16
  • Spring 技術(shù)筆記Day 1 預(yù)熱知識一、 基本術(shù)語Blob類型摆霉,二進制對象Object Graph:對象圖...
    OchardBird閱讀 978評論 0 2
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • 1.虛擬機中的Linux怎么進入命令方式砸彬? 虛擬機安裝Linux開啟進入系統(tǒng)后,常用的兩種進入終端命令界面方法: ...
    太陽的后裔90閱讀 222評論 0 0