MyBatis入門(3)

前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!

jar包

加入mybatis核心包、依賴包、數據驅動包。

配置日誌

在classpath下創建log4j.properties如下:

# Global loggingconfiguration

log4j.rootLogger=DEBUG, stdout

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis默認使用log4j作爲輸出日誌信息。

 配置SqlMapConfig.xml

在SqlMapConfig.xml文件中配置:

SqlMapConfig.xml就是myBatis的全局配置文件

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC"-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

  <!-- 和spring整合後 environments配置將廢除-->

   <environmentsdefault="development">

      <environment id="development">

     <!--jdbc事務管理-->

         <transactionManagertype="JDBC"/>

      <!--數據庫連接池-->

         <dataSource type="POOLED">

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

            <property name="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>

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

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

         </dataSource>

      </environment>

   </environments>

</configuration>

SqlMapConfig.xmlmybatis核心配置文件,上邊文件的配置內容爲數據源、事務管理。

 映射文件

映射文件命名:

舉例:

           User.xml(原始ibatis命名),mapper代理開發映射文件名稱叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在映射文件中配置sql語句。


parameterType:定義輸入到sql中的映射類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。

resultType定義結果映射類型。mybatis將sql查詢結果的一行記錄數據映射爲resultType指定類型的對象。

#{id}表示使用preparedstatement設置佔位符號並將輸入變量id傳到sql。

#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。#{}可以接收簡單類型值或pojo屬性值如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。

${}表示拼接sql串,通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換,${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value

    在SqlMapConfig.xml中加載映射文件

舉例:

      在sqlMapConfig.xml中加載User.xml:

   

     自增主鍵返回

mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。

通過mysql函數獲取到剛插入記錄的自增主鍵:

LAST_INSERT_ID()

是insert之後調用此函數。

修改insertUser定義:


<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">

       <!-- selectKey將主鍵返回,需要再返回 -->

       <selectKey keyProperty="id"

                   order="AFTER"

                   resultType="java.lang.Integer">

          select LAST_INSERT_ID()

       </selectKey>

       insert into user(username,birthday,sex,address)

        values(#{username},#{birthday},#{sex},#{address});

</insert>

添加selectKey實現將主鍵返回:

     keyProperty:返回的主鍵存儲在pojo中的哪個屬性

     orderselectKey的執行順序,是相對與insert語句來說,

             由於mysql的自增原理執行完insert語句之後纔將主鍵生成,

             所以這裏selectKey的執行順序爲after

     resultType:返回的主鍵是什麼類型

       LAST_INSERT_ID():mysql的函數,返回auto_increment自增列新記錄id值。

select LAST_INSERT_ID()得到剛insert進去記錄的主鍵值,只適用於自增主鍵。

     非自增主鍵返回(使用uuid())

1.        使用mysql的uuid()函數生成主鍵,需要修改表中id字段類型爲string,長度設置成35位。

   執行思路:

      先通過uuid()查詢到主鍵,將主鍵輸入到sql語句中。

       執行uuid()語句順序相對於insert語句之前執行。


注意這裏使用的order是“BEFORE

2.        通過oracle的序列生成主鍵:

<selectKeykeyProperty="id"

            order="BEFORE"

            resultType="java.lang.String">

         SELECT序列名.nextval()

</selectKey>

insert into user(id,username,birthday,sex,address)

       value(#{id},#{username},#{birthday},#{sex},#{address})

注意這裏使用的order是“BEFORE

    總結

1.        parameterType 在映射文件中通過parameterType指定輸入 參數的類型。

2.        resultType 在映射文件中通過resultType指定輸出結果的類型。

3.        #{}和${}

           #{}表示一個佔位符號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。

           如果接收簡單類型,#{}中可以寫成value或其它名稱。

           #{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。

          ${}表示一個拼接符號,會引用sql注入,所以不建議使用${}

          ${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。

           如果接收簡單類型,${}中只能寫成value。

          ${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。

4.        selectOne和selectList

           selectOne表示查詢出一條記錄進行映射。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個對象)。

           selectList表示查詢出一個列表(多條記錄)進行映射。如果使用selectList查詢多條記錄,不能使用selectOne。

如果使用selectOne報錯:

org.apache.ibatis.exceptions.TooManyResultsException:Expected one result (or null) to be returned by selectOne(), but found: 4



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