搭建簡單的單個Mybatis框架

  最近幾天還是在看框架,都是爲了找工作。另外,鄭州的工作是真的不好找。

  今天來寫一個搭建單個框架的練習,搭建的是Mybatis,主要的原因是自己對於單個框架的原理不太懂,雖然前面的博客對於SSM框架進行了整合,但是最好還是自己在進行深入的瞭解。不再廢話了,直接開始。

  搭建框架最主要的是jar包,這次爲了從頭開始,Maven也不再使用。直接就是簡單的web項目。博客的目的也是爲了簡單的記錄自己的一些思路和想法。可能大家不太好照搬。

  下面就說一說具體的搭建思路。

  1.複製jar包,直接複製到WEB-INF下面的lib文件夾下,在build path。具體的jar包如圖,可能有些jar包有些多餘。

  2.配置Mybatis的配置文件,Mybatis的配置文件主要有兩類,一個是Mybatis的核心配置文件SQLMapConfig.xml(這裏名字可以隨意起,但是最好統一),還有一個就是映射文件***Mapper.xml(看具體的需求),這個映射文件可以有多個。因爲Mybatis封裝了JDBC,但是對於底層SQL的實現還是依賴於JDBC。所以Mybatis還要配置一個log4j.properties(這個配置文件可能和JDBC的一些設置有關)。

  SQLMapConfig.xml是Mybatis核心的配置文件,主要配置數據庫連接的一些參數和加載映射文件。本次項目的SQLMapConfig.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>
    <!-- 和spring整合後 environments配置將廢除 -->
    <environments default="development">
        <!-- 環境,開發和測試用到的環境不同 -->
        <environment id="development">
            <!-- 使用jdbc事務管理 -->
            <transactionManager type="JDBC" />
            <!-- 數據庫連接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件配置,加載映射文件 -->
    <mappers>
        <mapper resource="mybatis/UserMapper.xml"/>
    </mappers>
</configuration>

   log4j.properties的作用我這裏還不是很清楚,還是自己學習的太淺了,這個問題以後有機會我在研究。後來知道了,這是日誌輸出格式配置文件,主要和日誌輸出有關。代碼具體如下:

# Global logging configuration
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

   mapper.xml文件因爲和具體的需求有關,會在下面粘貼。

  3.搭建項目的具體的結構。在這裏因爲需要pojo類和dao層,因爲不再顯示在頁面上,這裏需要寫一個test包。具體的項目結構如下:

  pojo就是實體類對象,沒有什麼關鍵代碼可以寫的,記得要寫構造函數(無參和有參都要有),toString方法,get和set方法。其他的在看自己id需求。

  下面就說說代碼中具體怎麼使用Mybatis,首先要有一個mapper.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">
<!-- namespace:命名空間,用於隔離SQL語句 -->
<mapper namespace="user">
    <!-- 一般自己編寫查詢語句是要注意SQL優化,不可以查詢全部。 -->
    <!-- parameterType是傳參的數據類型,resultType是結果的數據類型 -->
    <!-- #{id}是佔位符,相當於jdbc中“?”,“id”可以隨便起 -->
    <select id="getUserById" parameterType="int" resultType="com.psq.MybatisTrain.pojo.User">
        select * from user where id=#{id}
    </select>
    
    <!-- 如果返回的類型爲集合,只需要設置元素的類型 -->
    <!-- '%${value}%' 設置字符串的拼接指令。 -->
    <select id="getUserByUserName" parameterType="String" resultType="com.psq.MybatisTrain.pojo.User">
        select * from user where username like '%${value}%'
    </select>
    
    <!-- 這裏要注意  ` 和 ' 的區別,也可以不用` -->
    <insert id="insertUser" parameterType="com.psq.MybatisTrain.pojo.User" useGeneratedKeys="true" keyProperty="id">
        <!-- 主鍵返回,selectKey:用於配置主鍵返回,keyProperty:要綁定的pojo屬性
            ,resultType:屬性數據類型,order:指定什麼時候執行,AFTER之後
                                    也可以在insert屬性中配置  useGeneratedKeys="true" keyProperty="id"
         -->
        <!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey> -->
        insert into user(username,birthday,sex,address) 
            values (#{username},#{birthday},#{sex},#{address})    
    </insert>
</mapper>

   映射文件寫完了,具體的一些細節問題我都寫在註釋裏了,這裏不再敘述。因爲要讓系統知道mapper文件的位置,所以上面Mybatis的核心配置文件中已經聲明瞭。也不再敘述。

  下面就是代碼,因爲要使用到@Test註解,所以這裏沒有其他的東西,直接在方法裏面查詢。下面就說說具體的步驟。

  (1)創建 SqlSessionFactoryBuilder(這個類可以被實例化,使用和丟棄。一旦你創建了 SqlSessionFactory 後,這個類就不需 要存在了。因此 SqlSessionFactoryBuilder 實例的最佳範圍是方法範圍(也就是本地方法變量))。

  (2)創建核心配置文件的輸入流。

  (3)創建SqlSessionFactory對象,用於開啓Session(一旦被創建,SqlSessionFactory 實例應該在你的應用程序執行期間都存在。沒有理由來 處理或重新創建它。使用 SqlSessionFactory 的最佳實踐是在應用程序運行期間不要重複創建 多次)。

  (4)開啓session(每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不能共享使用,它也是 線程不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將 SqlSession 實例的引用放在 一個類的靜態字段甚至是實例字段中。也絕不能將 SqlSession 實例的引用放在任何類型的管 理範圍中)。

  (5)執行SQL語句。

  (6)關閉session。

  具體的代碼如下:

		// 創建 SqlSessionFactoryBuilder
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

		// 創建核心配置文件的輸入流
		InputStream inputStream = Resources.getResourceAsStream("SQLMapConfig.xml");

		// 創建SqlSessionFactory對象,用於開啓Session
		SqlSessionFactory factory = builder.build(inputStream);

		// 開啓session
		SqlSession session = factory.openSession();

		// 執行查詢 參數一是sql語句的id 參數二是傳入sql語句的參數
		User user = session.selectOne("user.getUserById", 1);

		// 輸出user對象,實現了tostring方法
		System.out.println(user);

		// 關閉session資源
		session.close();

   上面的代碼有加載Mybatis的核心配置文件,在實際的應用中有一些要改進的地方,其中,如果和Spring整合的時候完全不需要創建,直接依賴注入就可以了,這是後話。到這裏,其實已經完成了大部分的工作,剩下的就都是一些細節性的問題,因爲都是開發中遇到的問題,這裏提也有一些繁瑣。這裏還是提一下,給自己一個提醒,但是不再舉出解決方案,估計以後會用到更好的。

  首先是可以看到上面的代碼有些多,其中我也列舉出SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession各自存在的區域和理由,所以這個可以寫一個工具類,實現就是單例模式的實現,因爲SqlSessionFactory只要有一個就可以。具體的實現可以自己下去找找。

  其次是插入數據時需求是要有主鍵返回值,這裏用到了Mybatis的解決方案,具體的實現還是利用了框架,另外,插入時因爲有緩存的存在,所以插入要立即看到效果就要立即提交Session(事務)。

  在其次就是Mybatis Dao開發,有兩種方式,一個是比較老的dao開發,就是直接開發,寫完dao接口在寫實現類。最後調用。另一種我在前面SSM整合中使用到,是接口動態代理的方式,只寫一個dao接口,在調用接口。實現接口的動態代理要有四個規則。如下:1 namespace必需是接口的全路徑名。2 接口的方法名必需與映射文件的sql id一致。3 接口的輸入參數必需與映射文件的parameterType類型一致。4 接口的返回類型必須與映射文件的resultType類型一致。

  最後,粘貼一個圖片,就是Mybatis中的具體架構圖,圖事別人的,要是有問題,聯繫我,我刪除。

 

  剩下就沒有什麼問題了,其他的問題以後再添加。結束。

 

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