mybatis-config.xml(配置文件)html
SqlSessionFactory:主要用於建立SqlSession,至關於整個數據庫在內存中的鏡像,因此說在一個項目中只能有一個工程。採用單利模式建立對象便可完成只有一個工廠類的操做。java
SqlSession:應用層與持久層進行交互的(執行sql語句) 在一個項目當中SqlSession能夠有多個,每當執行sql操做時就應當建立一個Sqlsession,執行完畢後最後關閉釋放資源便可。能夠建立一個工具類哦mysql
(1)Sqlssion中的一些重要方法sql
configuration標籤中的子標籤必定要按照順序來寫properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environment-s,databaseIdProvider,mappers數據庫
properties:是一個配置屬性的元素,一般用於將內部的標籤外在化。將四個鏈接數據庫的串單獨放到一個配置文件中進行編輯(db.properties)以鍵值對的方式來進行建立。在mybatis的配置文件中導入db.propertiessession
<properties resource="db.properties"></properties> <!--引入該屬性後再<dataSource>標籤中value值得地方替換成db.properties中的鍵名(關鍵字進行調用。關鍵字可自定義)--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource>
setting:一些標籤的開關能夠再次標籤中進行設置mybatis
typeAliases:能夠定義別名,在mapper映射文件中能夠直接使用別名app
<typeAliases> <!-- 設置類型的別名 若是不寫alias屬性,系統默認的別名爲類名的首字母小寫--> <!--<typeAlias alias="customer" type="com.ruanyuan.pojo.Customer" />--> <!-- <typeAlias alias="user" type="com.ruanyuan.pojo.User" />--> <!--能夠給整個實體類的包進行建立,默認是類名首字母小寫--> <package name="com.runayuan.pojo"/> </typeAliases>
typeHandlers:用於數據庫的數據類型和java的數據類型之間的轉換ide
environments:是環境配置的根元素,它包含一個default屬性,該屬性用於指定默認的環境ID。其中<enviroment>是它的子元素,能夠定義多個,其中ID屬性用於表示所定義環境的ID值。在子標籤中包含事務管理和數據源的配置信息,其中transactionManager 元素用於配置事務管理,它的type屬性用於指定事務管理的方式,即便用哪一個事務管理器;dataSource元素用於配置數據源,他的type屬性用於指定使用哪一種數據源。工具
在mybatis中,能夠配置兩種類型的事務管理器,分別是JDBC和MANACED。
<environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC" /> <!-- 啓動數據鏈接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
mappers:指定映射文件的具體位置其中第二種方式是隻有在使用接口的形式下才可使用
<mappers> <!--第一種--> <mapper resourse="com/mapper/UserMapper.xml"></mapper> <!--第二種使用包名引入--> <package name="com.mapper"/> </mappers>
在將來實際項目開發中,全部的標籤都必需要寫id屬性
select標籤中的paramterType屬性能夠省略不寫,resultType屬性必須得寫。但根據java開發手冊中的ORM映射規範來說 不要用 resultClass 當返回參數,即便全部類屬性名與數據庫字段一一對應,也須要 定義<resultMap>;反過來,每個表也必然有一個<resultMap>與之對應。 說明: 配置映射關係,使字段與 DO 類解耦,方便維護。
因此說最好使用resultMap標籤,當使用resultMap標籤時,不得使用resultType標籤。兩個標籤只能寫一個
<mapper namespace="">
對於<insert><update><delete>這3個標籤,一般咱們只寫id屬性,其餘屬性一律不寫。 在xml中寫sql語句時,涉及到傳參時要使用#{}的方式。其中的參數名稱要和實體類中屬性名稱保持一致,只有這樣在mybatis的ORM映射才能真正的起到做用。
namespace爲工做空間,其中的屬性都爲當前mapper文件的絕對路徑例:com.mapper,UserMapper
select:該標籤在你執行查詢語句時進行使用
<!--id具備惟一性,要將id的名稱和接口類中所定義的方法名保持一致 parameterType:傳入參數的類型 resultType:返回的數據類型 --> <select id="getCustomerById" parameterType="Integer" resultType="customer"> select <include refid="customerColums"></include> customer where cust_id = #{cust_id} </select>
模糊查詢時要用concat拼接。
例如:
<!--paramerType:傳入的參數類型,resultType:返回的數據類型--> <select id="getCustomerByName" parameterType="String" resultType="com.xiangyu.pojo.Customer"> select * from customer where cust_name like concat('%',#{value},'%') </select>
若是在查詢全部信息時,paramterType爲List集合中的泛型的絕對路徑
update:執行修改語句時進行使用
delete:執行刪除語句時進行使用
insert:執行插入語句時進行使用
在插入數據後想要經過對象獲取到該用戶id時,一般狀況下會獲取不到,因此咱們要來使用useGeneratedKeys="true" keyProperty="" 這兩個屬性來進行配置其中keyProperty中的值爲咱們定義的實體類中的數據庫的主鍵名稱。
<!-- 插入語句 數據庫能夠實現自動增加時 --> <insert id="isnertCustomer" parameterType="customer" useGeneratedKeys="true" keyProperty="custId"> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) </insert> <!-- 插入語句,數據庫不會實現自動增加時 --> <insert id="isnertCustomer" parameterType="customer"> <selectKey keyProperty="cust_id" resultType="Integer" order="BEFORE"> select if(max(cust_id) is null,1,max(cust_id)+1) as newId from customer </selectKey> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) </insert>
(1)resultMap
有的時候在建立數據庫中的字段時兩個單詞之間會用‘__’進行鏈接,但在定義java實體類中的屬性值時一般喜歡使用駝峯命名法來命名兩個單詞,而正由於如此在mybatis中orm映射機制會因爲實體類中的屬性值和數據庫中字段的值不一致而致使映射失敗,傳值無效報錯
解決方法:(1)在mybatis的配置文件中(mybatis-config.xml)
<!--configuration標籤中的settings標籤進行全局設置--> <!--在一般狀況下,java中的實體類中的屬性通常是採用駝峯命名命名的,而數據庫中表的字段則用下劃線區分字母。在這種狀況下,Mybatis提供了一個全局屬性mapUnderscoreToCamelCase來解決二者名字不一致的問題。--> <setting name="mapUnderscoreToCamelCase" value="true" />
(2)也能夠直接使用上文所說起到的resultMap進行自定義映射(important)
<resultMap id="BaseResultMap" type="com.ruanyuan.pojo.User"> <!--主鍵--> <id column="user_id" jdbcType="BIGINT" property="userId" /> <!--columu:數據庫中的字段名,jdbctype:字段的數據類型,property:你在實體類中本身定義的一個實體類屬性名稱--> <result column="user_code" jdbcType="VARCHAR" property="userCode" /> <result column="user_name" jdbcType="VARCHAR" property="userName" /> <result column="user_password" jdbcType="VARCHAR" property="userPassword" /> <result column="is_state" jdbcType="CHAR" property="state" /> </resultMap>
一個實體類對應一個mapper.xml文件,實體類的名稱和mapper的名稱保持一致,sql語句寫到mapper.xml文件z中,將mybatis-config配置文件放在根目錄下,在該文件中進行鏈接數據庫操做。而且還要映射有sql語句的mapper.xml文件。
(2)Sql元素:在一個映射文件中,一般須要定義多條sql語句,這些sql語句的組成可能有一部分是相同的
若是每個sql語句都重寫一遍相同的部分,那勢必會增長代碼量,致使映射文件過於臃腫
此時就須要使用sql元素將SQL語句中的相同的組成部分抽取出來,而後在須要的地方用<include>標籤進行插入便可。
<sql id="Base_Column_List"> user_id, user_code, user_name, user_password, is_state, create_time, update_time </sql> <select id="selectByPrimaryKey" parameterType="Integer" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from login_user where user_id = #{userId} </select>