用maven搭建的MyBatis環境,目錄結構如下
配置文件在src/main/resources目錄下,是configuration.xml
1:先看一下簡單的配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" > <configuration> <!-- 可以配置多個運行環境,但是每個SqlSessionFactory 實例只能選擇一個運行環境 --> <environments default="work"> <environment id="work"> <transactionManager type="JDBC"></transactionManager> <!-- UNPOOLED POOLED JNDI --> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="密碼" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/zhao/mapper/StudentMapper.xml"/> </mappers> </configuration>
congfiguration:根元素
<configuraion>
environments:配置MyBatis環境,可以配置過個運行環境,但是SqlSessionFactory只能選擇一個運行環境
<environments default="development">
<environment id="development">
transactionManager:事務管理器
type=JDBC或者MANAGED
JDBC:使用JDBC的提交和回滾設置;
MANAGED:讓容器管理事務的整個生命周期
<transactionManager type="JDBC"></transactionManager>
dataSource:數據源
dataSource 元素使用標准的JDBC 數據源接口來配置JDBC 連接對象源。
MyBatis 內置了三種數據源類型:
UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉連接。它有一點慢, 這是對簡單應用程序的一個很好的選擇, 因為它不需要及時的可用連接。 不同的數據庫對這 個的表現也是不一樣的, 所以對某些數據庫來說配置數據源並不重要, 這個配置也是閑置的。 UNPOOLED 類型的數據源僅僅用來配置以下 5 種屬性:
-
-
- driver – 這是 JDBC 驅動的 Java 類的完全限定名(如果你的驅動包含,它也不是 數據源類)。
- url – 這是數據庫的 JDBC URL 地址。
- username – 登錄數據庫的用戶名。
- password – 登錄數據庫的密碼。
- defaultTransactionIsolationLevel – 默認的連接事務隔離級別。
-
作為可選項,你可以傳遞數據庫驅動的屬性。要這樣做,屬性的前綴是以“driver.”開 頭的,例如:
-
-
- driver.encoding=UTF8
-
這 樣 就 會 傳 遞 以 值 “ UTF8 ” 來 傳 遞 屬 性 “ encoding ”, 它 是 通 過 DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。
POOLED – 這是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例 時必要的初始連接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方 法。
除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置 POOLED 數據源:
poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連 接的數量。默認值:10
poolMaximumIdleConnections – 任意時間存在的空閑連接數。
-
-
- poolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認 值:20000 毫秒(也就是 20 秒)
- poolTimeToWait – 這是給連接池一個打印日志狀態機會的低層次設置,還有重新 嘗試獲得連接, 這些情況下往往需要很長時間 為了避免連接池沒有配置時靜默失 敗)。默認值:20000 毫秒(也就是 20 秒)
- poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且准備 接受請求。默認是“NO PING QUERY SET” ,這會引起許多數據庫驅動連接由一 個錯誤信息而導致失敗。
- poolPingEnabled – 這是開啟或禁用偵測查詢。如果開啟,你必須用一個合法的 SQL 語句(最好是很快速的)設置 poolPingQuery 屬性。默認值:false。
- poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一次。 這可以被設置匹配標准的數據庫連接超時時間, 來避免不必要的偵測。 默認值: 0(也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled 為 true 時適用)。
-
JNDI – 這個數據源的實現是為了使用如 Spring 或應用服務器這類的容器, 容器可以集 中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這個數據源配置只需要兩個屬 性:
-
-
- initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 ( 也 就 是 initialContext.lookup(initial——context) 。這是個可選屬性,如果被忽略,那么 data_source 屬性將會直接以 initialContext 為背景再次尋找。
- data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 initial_context 查詢返回的環境為背景來查找,如果 initial_context 沒有返回結果時,直接以初始 上下文為環境來查找。
-
和其他數據源配置相似, 它也可以通過名為 “env.” 的前綴直接向初始上下文發送屬性。 比如:
-
- env.encoding=UTF8
在初始化之后,這就會以值“UTF8”向初始上下文的構造方法傳遞名為“encoding” 的屬性。
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
</dataSource>
</environment>
</environments>
mapper:指定映射文件或映射類
<mappers>
<mapper resource="com/zhao/mapper/StudentMapper.xml"/>
</mappers>
</configuration>:
2:StudentMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" > <mapper namespace="com.zhao.mapper.StudentMapper"> <insert id="saveStudent" parameterType="com.zhao.entity.Student"> insert into student values(default,#{name},#{password}) </insert> </mapper>
這個是個簡單的插入過程,我們的parameterType是個全路徑com.zhao.entity.Student,如果每個都寫這么全的話 會很麻煩,所以我們可以配置它的別名,當然,別名要配置在configuration.xml中
<typeAliases> <typeAlias type="com.zhao.entity.Student" alias="Student"/> </typeAliases>
以后再StudentMapper.xml中直接寫Student就好了,這么看就方便多了。
目前就用到這么多內容,configuration.xml就先說到這。
接下來說說StudentMapper.xml,在這個文件中定義了我們的一些操作,比如說insert delete select等操作,我們都有標簽。在這個配置文件中主要有兩個東西需要記住,一個是
<mapper>標簽的namespace屬性,我們通過這個屬性來定位到這個配置文件。還有一個是<resultMap>,這個最有意思。
package com.zhao.entity; public class Student { private int id; private String name; private String password; public Student() { } public Student(String name, String password) { this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", password=" + password + "]"; } }
可看到我們的數據表的列和實體類的屬性並不一樣,所以需要進行簡單的配置。我們執行插入的操作可能還不那么明顯,如果我們執行的是查詢操作
<select id="selectStudentById" parameterType="int" resultType="Student"> select * from student where stu_id=#{id} </select>
前面我們已經設置了別名,resultType可以直接寫成Student,不用寫com.zhao.entity.Student了。接下來進行測試
@Test public void testSelect() throws IOException { Reader reader=Resources.getResourceAsReader("configuration.xml"); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader); SqlSession session=factory.openSession(); Student student=session.selectOne("com.zhao.mapper.StudentMapper.selectStudentById", 1); System.out.println(student); session.commit(); session.close(); }
返回值為Null,顯然我們從數據庫查出來的內容是stu_id stu_name stu_password ,可是我們的返回值類型是Student,沒辦法完成封裝,所以我們需要resultMap
<resultMap type="Student" id="result"> <id column="stu_id" property="id"/> <result column="stu_name" property="name"/> <result column="stu_password" property="password"/> </resultMap>
這里的Student依舊是我們的別名,然后通過下面的內容完成一一對應。還有 在select里也需要寫上resultMap="result"
接下來測試
這樣的結果才是對的。