最近幾天還是在看框架,都是爲了找工作。另外,鄭州的工作是真的不好找。
今天來寫一個搭建單個框架的練習,搭建的是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中的具體架構圖,圖事別人的,要是有問題,聯繫我,我刪除。
剩下就沒有什麼問題了,其他的問題以後再添加。結束。