MyBatis知識點學習

阿木俠發表於2017-06-07
MyBatis中文官方文件:http://www.mybatis.org/mybatis-3/zh/getting-started.html(這大概是最好的學習材料了)
什麼是 MyBatis ?
官方解釋:MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

MyBatis結構圖:


MyBatis通過配置和註解簡化JDBC的操作,瞭解MyBatis,首先要了解他的配置資訊,XML配置對映檔案中,最重要的是設定(settings)和屬性(properties)資訊。

properties
設定屬性資訊,設定連線資料庫:
<properties resource="org/mybatis/example/config.properties">
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/wendao?useUnicode=true&characterEncoding=utf8"/>
  <property name="username" value="root"/>
  <property name="password" value="root"/>
</properties>
配置資料庫的連線有多種方法:
1,在config.properties的屬性檔案中配置
2,如上,在XML配置檔案中配置
3,在Java類中配置,通過方法引數傳遞屬性
同時,也可以靈活的結合這三種配置方法進行資料庫的配置,重複配置資訊時有些配置資訊就會被覆蓋掉,這三種方法有個優先順序的問題,高優先順序的會覆蓋掉低優先順序的。

如果屬性在不只一個地方進行了配置,那麼 MyBatis 將按照下面的順序來載入:
1,在 properties 元素體內指定的屬性首先被讀取。
2,然後根據 properties 元素中的 resource 屬性讀取類路徑下屬性檔案或根據 url 屬性指定的路徑讀取屬性檔案,並覆蓋已讀取的同名屬性。
3,最後讀取作為方法引數傳遞的屬性,並覆蓋已讀取的同名屬性。
也就是說:方法引數傳遞的屬性>resource/url中配置的屬性> properties 中設定的屬性

settings
設定屬性引數,這些引數會改變 MyBatis 的執行時行為。
一個配置完整的 settings 元素的示例如下:
<!– 配置設定 –>  
          <settings>  
               <!– 配置全域性性 cache 的 ( 開 / 關) default:true –>  
               <setting name=“cacheEnabled” value=“true”/>  
               <!– 是否使用 懶載入 關聯物件  同 hibernate中的延遲載入 一樣  default:true ,當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態–>  
               <setting name=“lazyLoadingEnabled” value=“true”/>  
               <!– [當物件使用延遲載入時 屬性的載入取決於能被引用到的那些延遲屬性,否則,按需載入(需要的是時候才去載入)] –>  
             <setting name=“aggressiveLazyLoading” value=“true”/>  
             <!– 是否允許單條sql 返回多個資料集  (取決於驅動的相容性) default:true –>  
             <setting name=“multipleResultSetsEnabled” value=“true”/>  
             <!– 是否可以使用列的別名 (取決於驅動的相容性) default:true–>  
             <setting name=“useColumnLabel” value=“true”/>  
             <!–允許JDBC 生成主鍵。需要驅動器支援。如果設為了true,這個設定將強制使用被生成的主鍵,有一些驅動器不相容不過仍然可以執行。  default:false–>  
             <setting name=“useGeneratedKeys” value=“false”/>  
             <!–指定 MyBatis 如何自動對映 資料基表的列
 NONE:不隱射 PARTIAL:部分  FULL:全部–>  
             <setting name=“autoMappingBehavior” value=“PARTIAL”/>  
             <!– 這是預設的執行型別   
                 SIMPLE :簡單    
                 REUSE:執行器可能重複使用prepared statements 語句   
                 BATCH:執行器可以重複執行語句和批量更新  –>  
             <setting name=“defaultExecutorType” value=“SIMPLE”/>  
             <!– 設定驅動等待資料響應的超時數  預設沒有設定–>  
             <setting name=“defaultStatementTimeout” value=“25000″/>  
             <!– [是否啟用 行內巢狀語句  defaut:false] –>  
            <setting name=“safeRowBoundsEnabled” value=“false”/>  
             <!– [是否 啟用  資料中 A_column 自動對映 到 Java類中駝峰命名的屬性 default:fasle] –>  
             <setting name=“mapUnderscoreToCamelCase” value=“false”/>  
             <!– 設定本地快取範圍 session:就會有資料的共享  statement:語句範圍 (這樣就不會有資料的共享 ) defalut:session –>  
             <setting name=“localCacheScope” value=“SESSION”/>  
             <!– 設定但JDBC型別為空時,某些驅動程式 要指定值,default:OTHER –>  
             <setting name=“jdbcTypeForNull” value=“DEFAULT”/>  
             <!– 設定觸發延遲載入的方法  –>  
             <setting name=“lazyLoadTriggerMethods” value=“equals,clone,hashCode,toString”/>  
         </settings> 

大概瞭解了MyBatis的配置資訊,接下來通過一個增刪改查的Demo來系統的瞭解一下MyBatis的流程吧。工程只為測試,建一個Java工程就行。

新建一個Java工程,上圖是大體結構以及所使用到的包(沒有包是執行不了的):
db.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=1011
log4j.properties:
## Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
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

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>
	<!-- 載入屬性檔案 -->
	<properties resource="db.properties"></properties>
	<environments default="development">
		<environment id="development">
			<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>
		<mapper resource="org/mybatis/pojo/UserInfo.xml"></mapper>
	</mappers>
</configuration>


POJO類:
package org.mybatis.pojo;

public class UserInfo {
    private int id;
    private String username;
    private String password;
   
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public UserInfo() {
	super();
	// TODO Auto-generated constructor stub
    }
    public UserInfo(Integer id, String username, String password) {
	super();
	this.id = id;
	this.username = username;
	this.password = password;
    }
    
}


POJO對映檔案:
<?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">
<mapper namespace="mybatis_example">
	<select id="findUserInfo" parameterType="int" resultType="org.mybatis.pojo.UserInfo">
		select * from user_info where id = #{id}
	</select>
	<insert id="addUser" parameterType="org.mybatis.pojo.UserInfo">
		insert into user_info(username,password) value (#{username},#{password})
	</insert>
	<delete id="delUser" parameterType="org.mybatis.pojo.UserInfo">
		delete from user_info where id = #{value}
	</delete>
	<update id="updUser" parameterType="org.mybatis.pojo.UserInfo">
		update user_info set username=#{username},password=#{password} where id=#{id}
	</update>
</mapper>


接下來是測試類,使用單元測試:
package org.mybatis.example;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.mybatis.pojo.UserInfo;

public class MyBatisExample {
//    查詢
    @Test
    public void findUserInfo() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	//第一個引數:對映檔案的id,
	//第二個引數:指定和對映檔案parameterType所匹配的引數
	UserInfo user = sqlsession.selectOne("mybatis_example.findUserInfo",1);
	System.out.println("使用者名稱是:"+user.getUsername());
    }
//    新增
    @Test
    public void addUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	String name = "趙敏";
	String pass = "123";
	UserInfo ui = new UserInfo();
	ui.setUsername(name);
	ui.setPassword(pass);
	sqlsession.insert("mybatis_example.addUser",ui);
	sqlsession.commit();
	sqlsession.close();
    }
//    刪除
    @Test
    public void delUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	sqlsession.delete("mybatis_example.delUser",1);
	sqlsession.commit();
	sqlsession.close();
    }
//    修改
    @Test
    public void updUser() throws IOException{
	String resource = "sqlMapConfig.xml";
	InputStream input = Resources.getResourceAsStream(resource);
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
	SqlSession sqlsession = sqlSessionFactory.openSession();
	String name = "張無忌";
	String pass = "123";
	UserInfo ui = new UserInfo();
	ui.setId(2);
	ui.setUsername(name);
	ui.setPassword(pass);
	sqlsession.update("mybatis_example.updUser",ui);
	sqlsession.commit();
	sqlsession.close();
    }
}


程式碼中的名詞解釋:
parameterType:MyBatis中通過parameterType指定輸入的引數型別
resultType:MyBatis中通過resultType指定輸出的結果
#{}:表示的是佔位符,#{}接收的引數是輸入的引數,型別可以是簡單型別、pojo、hashmap
#{}如果接收的是簡單型別的話,裡面的值可以value或者其他名稱
#{}接收pojo物件,通過OGNL讀取物件中的屬性值,通過屬性.屬性的方式獲取。
selectOne:表示查詢出一條記錄,如果是使用selectone是可以實現的結果,selectList也是可以實現了(list中只有一個物件)
selectList:表示查詢出一個列表(多條記錄)進行對映的。如果是使用selectOne是不可以實現的。






相關文章