Mybatis

一纯陨、Mybatis框架配置

  • 1港华、加入Mybatis驅(qū)動包 :mybatis-3.3.1.jar
  • 2赘风、導(dǎo)入Mybatis配置文件:F:\java\Mybatis\mybatis包和代碼\mybatis-3-mybatis-3.3.1源碼包 \src\test\java\org\apache\ibatis\submitted\complex_property的Configuration.xml文件 挡逼。直接將Configuration.xml文件拷入項(xiàng)目中从祝,修改其中內(nèi)容续语。
<dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
</dataSource>

二垂谢、Mybatis通過SqlSession對象實(shí)現(xiàn)Dao層的需求

Dao需求:

  • 1、對象能與數(shù)據(jù)庫交互
  • 2疮茄、能執(zhí)行SQL語句

SqlSession作用:

  • 1滥朱、向SQL語句中傳入?yún)?shù)。
  • 2力试、執(zhí)行SQL語句徙邻。
  • 3、獲取執(zhí)行SQL語句結(jié)果畸裳。
  • 4缰犁、事務(wù)的控制。

獲得SQLSession對象

  • 1躯畴、通過配置文件獲得數(shù)據(jù)庫連接相關(guān)信息民鼓。
    Reader reader=Resources.getResourceAsReader("包名/myBatis配置文件名");從根目錄src下開始寫,此時寫的是路徑蓬抄,應(yīng)該用“/”而不是“.”丰嘉。
  • 2、通過配置信息構(gòu)建SqlSessionFactory嚷缭。
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
  • 3饮亏、通過SqlSessionFactory打開一個數(shù)據(jù)庫會話耍贾。
    SqlSession sqlSession=sqlSessionFactory.openSession();
Paste_Image.png
 public List<Message>queryMessageList(String command,String description)
    {
        DbAccess dbAccess=new DbAccess (); 
        List<Message>messageList=new ArrayList<Message>();
        SqlSession  sqlSession = null;
        
        try {
             sqlSession = dbAccess.getSqlSession;
             //通過sqlSession執(zhí)行SQL語句,find表示配置文件中的id
            messageList=sqlSession.selectList("User.find")
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(sqlSession != null)
            {
                sqlSession.close();
            }
        }
}

通過SqlSession執(zhí)行SQL語句

  • 添加配置文件:F:\java\Mybatis\mybatis包和代碼\mybatis-3-mybatis-3.3.1源碼包 \src\test\java\org\apache\ibatis\submitted\complex_property的User.xml文件路幸。直接將文件拷入項(xiàng)目自己新建的包中荐开。
<mapper namespace="User">
<select id="find" parameterType="long" resultMap="UserResult">
    SELECT * FROM user WHERE id = #{id:INTEGER}
  </select>
  <select id="version" parameterType="long" resultType="int">
    SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="delete" parameterType="UserAlias">
    DELETE FROM user WHERE id = #{id:INTEGER}
  </delete>
  <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
    INSERT INTO user
    ( id,
    username,
    password,
    administrator
    )
    VALUES
    ( #{id},
    #{username,jdbcType=VARCHAR},
    #{password.encrypted:VARCHAR},
    #{administrator,jdbcType=BOOLEAN}
    )
  </insert>
  <update id="update" parameterType="UserAlias">
    UPDATE user SET
    username = #{username,jdbcType=VARCHAR},
    password = #{password.encrypted,jdbcType=VARCHAR},
    administrator = #{administrator,jdbcType=BOOLEAN}
    WHERE
    id = #{id,jdbcType=INTEGER}
  </update>
  <!--   Unique constraint check -->
  <select id="isUniqueUsername" parameterType="map" resultType="boolean">
    SELECT (count(*) = 0)
    FROM user
    WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
    NULL)  <!-- other than me -->
    AND (username = #{username,jdbcType=VARCHAR})
  </select>
</mapper>

可以通過配置文件中的select中的id信息調(diào)用不同的SQL語句執(zhí)行,id的名字必須唯一简肴;如果有多個配置文件晃听,文件中的id想要重復(fù)命名,可以通過“<mapper namespace="Message">”標(biāo)簽來區(qū)分砰识。此時調(diào)用SQL語句是應(yīng)該增加namespaca的名字:

sqlSession.select("Message.find")

數(shù)據(jù)庫中的字段與Java類中的屬性對應(yīng)

通過配置文件實(shí)現(xiàn)

//type表示類的全名能扒,包括包名;id同sql語句中的id
<resultMap type="UserAlias" id="UserResult">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="username" jdbcType="VARCHAR" property="username"/>
    <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>
    <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>
 </resultMap>

子標(biāo)簽包括id標(biāo)簽和result標(biāo)簽辫狼,如果數(shù)據(jù)庫中一個字段為主鍵是用id標(biāo)簽初斑,如果是普通的列就用result標(biāo)簽。column表示數(shù)據(jù)庫中的字段名膨处,property表示類中的對象名见秤。數(shù)據(jù)庫中的字段類型與jdbcType中的類型或者Type類下面的常量名有對應(yīng)關(guān)系。

最后將這個配置文件添加到核心配置文件中

 <mappers>
    <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml"/>
  </mappers>

三真椿、SQL語句拼接

配置文件中的select接受參數(shù)時(用parameterType接受傳遞的參數(shù)鹃答,只寫傳遞參數(shù)的類型,不寫參數(shù)名)瀑粥,只能接受一個挣跋,如果Java代碼要傳遞兩個或以上參數(shù),需要進(jìn)行封裝狞换,然后進(jìn)行傳遞。

<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
    select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
    <where>
        <!--&quot代表""-->
        <if test="command != null and !"".equals(command.trim())">
            and COMMAND=#{command}
        </if>

ONGL表達(dá)式(區(qū)分大小寫)

Paste_Image.png

Paste_Image.png

應(yīng)用log4j(日志)調(diào)試動態(tài)SQL:
1舟肉、jar包和配置文件
2修噪、log4j.properties
<1>log4j.rootLogger=DEBUG,Console:輸出級別(級別<由低到高>debug/info/warn/error)和輸出位置(控制臺)
<2>log4j.appender.Console=org.apache.log4j.ConsoleAppender:配置這個類才會輸出在控制臺(可在別處)
<3>log4j.appender.layout=org.apache.log4j.PatternLayout:布局(按照自己的想法去輸出)<4>log4j.appender.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n:
%d:產(chǎn)生日志的時間
[%t]:產(chǎn)生日志所處線程的線程名稱
%-5p:輸出日志的級別、
"5":代表輸出的字符會占5位字符,不足則會用空格補(bǔ)齊;
"-":指的是補(bǔ)齊的空格在右邊,沒有則在左邊.
[%c]:指輸出這個日志時處于的那個類的全名,包括包名
%m:輸出的時候附加的信息
%n輸出換行
<5>log4j.logger.org.apache=INFO:為不同包配不同的級別,把總的覆蓋,可看到自己想看的信息
log4j配置詳解
一路媚、log4j.rootLogger=INFO, stdout, R
第一個參數(shù)為等級黄琼,后面可跟一到多個參數(shù),為輸出的位置整慎;
例句的意思為將等級為INFO的日志信息使用stdout和R進(jìn)行輸出脏款,stdout和R可以自己命名;
等級可分為OFF裤园、FATAL撤师、ERROR、WARN拧揽、INFO剃盾、DEBUG腺占、ALL,OFF是關(guān)閉痒谴,不輸出任何信息衰伯,其他級別按這個順序依次降低,如果 指定一個級別积蔚,如INFO意鲸,則比該級別高的信息都會輸出

四、對應(yīng)關(guān)系

  • 1尽爆、一對多關(guān)系
    Java代碼中反應(yīng)一對多關(guān)系是通過主表中包含一個子表的集合怎顾;xml中反應(yīng)一對多關(guān)系,和Java代碼一樣教翩,用collection標(biāo)簽實(shí)現(xiàn)杆勇。
<resultMap type=" "id=" ">
<id column='select語句查詢出的列名,如果列名取了別名饱亿,這里應(yīng)該是別名' property=""/>
<result column=" "property='對應(yīng)的實(shí)體的屬性名'/>
<!-- 一對多關(guān)系 -->
<collection property=''子表集合對象名 "   resultMap='實(shí)體類所對應(yīng)的結(jié)果集蚜退,跨文件,所以需要指定命名空間,語法是:namespace.resultMapId'/>
</resultMap>

注意:column表示數(shù)據(jù)庫中的列名彪笼,此時的列名并不是數(shù)據(jù)庫表中的列名钻注,而是select語句查詢結(jié)果集的列名,兩者可能不相同配猫,select語句中可以設(shè)置別名幅恋。

五、常用標(biāo)簽

Paste_Image.png

六泵肄、接口編程

意義:為了規(guī)范如何去訪問配置文件捆交,為了規(guī)避namespace.與sql關(guān)聯(lián)的id,傳入的參數(shù)腐巢,返回值這種寫法容易出錯的毛病品追,采用接口試編程。

  • mybatis接口式編程的步驟:
    1.創(chuàng)建一個接口
    2.統(tǒng)一命名空間【接口所在類的全線類名作為xml文件的namespace】
    2.想要為哪條SQL語句代言冯丙,就在接口中定義和id相同名的方法
    3.SQL語句的返回值類型就是接口的返回值類型
    Dao層中MessageDao類新建一個方法肉瓦,想要查詢數(shù)據(jù)表Message中的信息。首先新建一個接口IMessage胃惜,接口中創(chuàng)建一個方法queryMessage()泞莉,然后再M(fèi)essage配置文件中新建一個select標(biāo)簽,標(biāo)簽id為方法名queryMessage船殉,并在標(biāo)簽中填寫完整的SQL語句鲫趁,MessageDao類中可以直接調(diào)用接口使用,通過SqlSession獲取接口(IMessage imessage=sqlSession.getMapper(IMessage.class);)捺弦,然后通過接口調(diào)用其中的方法(imessage.queryMessage)饮寞,獲取數(shù)據(jù)庫中的信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孝扛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幽崩,更是在濱河造成了極大的恐慌苦始,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慌申,死亡現(xiàn)場離奇詭異陌选,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蹄溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門咨油,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柒爵,你說我怎么就攤上這事役电。” “怎么了棉胀?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵法瑟,是天一觀的道長。 經(jīng)常有香客問我唁奢,道長霎挟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任麻掸,我火速辦了婚禮酥夭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脊奋。我一直安慰自己熬北,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布诚隙。 她就那樣靜靜地躺著蒜埋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最楷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天待错,我揣著相機(jī)與錄音籽孙,去河邊找鬼。 笑死火俄,一個胖子當(dāng)著我的面吹牛犯建,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓜客,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼适瓦,長吁一口氣:“原來是場噩夢啊……” “哼竿开!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玻熙,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤否彩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗦随,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列荔,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年枚尼,在試婚紗的時候發(fā)現(xiàn)自己被綠了贴浙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡署恍,死狀恐怖崎溃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盯质,我是刑警寧澤袁串,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站唤殴,受9級特大地震影響般婆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朵逝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一蔚袍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧配名,春花似錦啤咽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芋膘,卻和暖如春鳞青,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背为朋。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工臂拓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人习寸。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓胶惰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霞溪。 傳聞我的和親對象是個殘疾皇子孵滞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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