Mybatis

一、Mybatis框架配置

  • 1、加入Mybatis驅動包 :mybatis-3.3.1.jar
  • 2、導入Mybatis配置文件:F:\java\Mybatis\mybatis包和代碼\mybatis-3-mybatis-3.3.1源碼包 \src\test\java\org\apache\ibatis\submitted\complex_property的Configuration.xml文件 。直接將Configuration.xml文件拷入項目中,修改其中內容。
<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對象實現Dao層的需求

Dao需求:

  • 1、對象能與數據庫交互
  • 2、能執行SQL語句

SqlSession作用:

  • 1、向SQL語句中傳入參數。
  • 2、執行SQL語句。
  • 3、獲取執行SQL語句結果。
  • 4、事務的控制。

獲得SQLSession對象

  • 1、通過配置文件獲得數據庫連接相關信息。
    Reader reader=Resources.getResourceAsReader("包名/myBatis配置文件名");從根目錄src下開始寫,此時寫的是路徑,應該用“/”而不是“.”。
  • 2、通過配置信息構建SqlSessionFactory。
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
  • 3、通過SqlSessionFactory打開一個數據庫會話。
    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執行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執行SQL語句

  • 添加配置文件:F:\java\Mybatis\mybatis包和代碼\mybatis-3-mybatis-3.3.1源碼包 \src\test\java\org\apache\ibatis\submitted\complex_property的User.xml文件。直接將文件拷入項目自己新建的包中。
<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信息調用不同的SQL語句執行,id的名字必須唯一;如果有多個配置文件,文件中的id想要重復命名,可以通過“<mapper namespace="Message">”標簽來區分。此時調用SQL語句是應該增加namespaca的名字:

sqlSession.select("Message.find")

數據庫中的字段與Java類中的屬性對應

通過配置文件實現

//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>

子標簽包括id標簽和result標簽,如果數據庫中一個字段為主鍵是用id標簽,如果是普通的列就用result標簽。column表示數據庫中的字段名,property表示類中的對象名。數據庫中的字段類型與jdbcType中的類型或者Type類下面的常量名有對應關系。

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

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

三、SQL語句拼接

配置文件中的select接受參數時(用parameterType接受傳遞的參數,只寫傳遞參數的類型,不寫參數名),只能接受一個,如果Java代碼要傳遞兩個或以上參數,需要進行封裝,然后進行傳遞。

<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表達式(區分大小寫)

Paste_Image.png

Paste_Image.png

應用log4j(日志)調試動態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:產生日志的時間
[%t]:產生日志所處線程的線程名稱
%-5p:輸出日志的級別、
"5":代表輸出的字符會占5位字符,不足則會用空格補齊;
"-":指的是補齊的空格在右邊,沒有則在左邊.
[%c]:指輸出這個日志時處于的那個類的全名,包括包名
%m:輸出的時候附加的信息
%n輸出換行
<5>log4j.logger.org.apache=INFO:為不同包配不同的級別,把總的覆蓋,可看到自己想看的信息
log4j配置詳解
一、log4j.rootLogger=INFO, stdout, R
第一個參數為等級,后面可跟一到多個參數,為輸出的位置;
例句的意思為將等級為INFO的日志信息使用stdout和R進行輸出,stdout和R可以自己命名;
等級可分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,OFF是關閉,不輸出任何信息,其他級別按這個順序依次降低,如果 指定一個級別,如INFO,則比該級別高的信息都會輸出

四、對應關系

  • 1、一對多關系
    Java代碼中反應一對多關系是通過主表中包含一個子表的集合;xml中反應一對多關系,和Java代碼一樣,用collection標簽實現。
<resultMap type=" "id=" ">
<id column='select語句查詢出的列名,如果列名取了別名,這里應該是別名' property=""/>
<result column=" "property='對應的實體的屬性名'/>
<!-- 一對多關系 -->
<collection property=''子表集合對象名 "   resultMap='實體類所對應的結果集,跨文件,所以需要指定命名空間,語法是:namespace.resultMapId'/>
</resultMap>

注意:column表示數據庫中的列名,此時的列名并不是數據庫表中的列名,而是select語句查詢結果集的列名,兩者可能不相同,select語句中可以設置別名。

五、常用標簽

Paste_Image.png

六、接口編程

意義:為了規范如何去訪問配置文件,為了規避namespace.與sql關聯的id,傳入的參數,返回值這種寫法容易出錯的毛病,采用接口試編程。

  • mybatis接口式編程的步驟:
    1.創建一個接口
    2.統一命名空間【接口所在類的全線類名作為xml文件的namespace】
    2.想要為哪條SQL語句代言,就在接口中定義和id相同名的方法
    3.SQL語句的返回值類型就是接口的返回值類型
    Dao層中MessageDao類新建一個方法,想要查詢數據表Message中的信息。首先新建一個接口IMessage,接口中創建一個方法queryMessage(),然后再Message配置文件中新建一個select標簽,標簽id為方法名queryMessage,并在標簽中填寫完整的SQL語句,MessageDao類中可以直接調用接口使用,通過SqlSession獲取接口(IMessage imessage=sqlSession.getMapper(IMessage.class);),然后通過接口調用其中的方法(imessage.queryMessage),獲取數據庫中的信息
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容