MyBatis初探

一、瞭解什麼是Mybatis

     MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。2013年11月遷移到Github。iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源 (classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創建的實例。MyBatis有一個實用類 ----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。

二、前期準備

下載jar包或者使用maven加入依賴,如果使用maven,可加入以下依賴:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.0</version>
</dependency>

三、配置整體Mybatis配置文件(Configuration.xml)

基本配置文件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>
<!-- 這些先暫時不用
  <settings>
    //有很多屬性可以設置,比如是否使用自動生成的主鍵,等等。。。
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="useColumnLabel" value="true"/>
  </settings>
 -->
<!--定義別名,方便別處引用,不是必須的-->
  <typeAliases>
    <typeAlias alias="UserAlias" type="com.gusi.demo.chat.pojo.User"/>
  </typeAliases>
 
  <!--設置數據庫相關的連接信息等-->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC">
        <property name="" value=""/>
      </transactionManager>
      <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/autochat"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <!--設置實體類的映射配置文件xml-->
  <mappers>
    <mapper resource="com/gusi/demo/chat/pojo/User.xml"/>
  </mappers>
</configuration>

四、書寫實體類以及映射配置文件( User.java, User.xml)

User.java 省略

User.xml:

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="User">//命名空間,需要唯一
 
  <resultMap type="com.gusi.demo.chat.pojo.User" id="UserResult">//將查詢結果映射成JavaBean
    <id column="id" jdbcType="INTEGER" property="id"/>//數據庫中主鍵映射
    <result column="username" jdbcType="VARCHAR" property="username"/>//column表示sql查詢返回的列名
    <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>//property表示JavaBean中屬性名
    <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>//jdbcType表示數據庫字段類型
  </resultMap>
 
//該語句通過命名空間和ID唯一標識,在java代碼中調運該語句即可執行該語句對應的sql
//parameterType是參數類型,可以是基本類型,也可是JavaBean類型
//resultMap表示使用定義的哪個映射關係將結果集合轉換爲JavaBean
  <select id="find" parameterType="long" resultMap="UserResult">
   SELECT * FROM user WHERE id = #{id:INTEGER}
  </select>
 
//如果返回的是基本數據類型,就不用resultMap,直接使用resultType指定返回數據類型
  <select id="version" parameterType="long" resultType="int">
    SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}
  </select>
 
//如果沒有返回結果,resultMap和resultType都不需要
  <delete id="delete" parameterType="com.gusi.demo.chat.pojo.User">
    DELETE FROM user WHERE id = #{id:INTEGER}
  </delete>
 
//在此可以使用別名,方便書寫,比如下面的UserAlise是在整體的配置文件中聲明的別名
  <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">
    INSERT INTO user
    ( id,
    username,
    password,
    administrator
    )
    VALUES
    ( #{id},
    #{username,jdbcType=VARCHAR},
    #{password.encrypted:VARCHAR},
    #{administrator,jdbcType=BOOLEAN}
    )
  </insert>
 
  <update id="update" parameterType="UserAlias">
    UPDATE user SET
    username = #{username,jdbcType=VARCHAR},
    password = #{password.encrypted,jdbcType=VARCHAR},
    administrator = #{administrator,jdbcType=BOOLEAN}
    WHERE
    id = #{id,jdbcType=INTEGER}
  </update>
 
  <!--   Unique constraint check -->
  <select id="isUniqueUsername" parameterType="map" resultType="boolean">
    SELECT (count(*) = 0)
    FROM user
    WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS
    NULL)  <!-- other than me -->
    AND (username = #{username,jdbcType=VARCHAR})
  </select>
</mapper>

五、通過Mybatis獲取的數據庫的會話session

// 1通過配置文件獲取數據庫連接信息
InputStream inputStream = Resources.getResourceAsStream("Configuration.xml");
//創建SessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//通過SessionFactoryBuilder獲得SessionFactory
SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
//通過SessionFactory獲得session
SqlSession sqlSession = sqlSessionFactory.openSession();

六、通過session,對數據庫操作(編寫dao類)

SqlSession sqlSession = sessionFactory.openSession();//獲得session
List list = sqlSession.selectList("Namespace.sqlId", paramObj);//查詢列表集合
Object obj = sqlSession.selectOne("Namespace.sqlId", paramObj);//查詢一條記錄
sqlSession.insert("Namespace.sqlId", paramObj);//插入記錄
sqlSession.update("Namespace.sqlId", paramObj);//修改記錄
sqlSession.delete("Namespace.sqlId", paramObj);//刪除記錄
sqlSession.commit();//默認事物是不提交的,需要手動自動提交

七、編寫測試

@Test
public void shouldInsertNestedPasswordFieldOfComplexType() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
  //Create User
  User user = new User();
  user.setId(500000L);
  user.setPassword(new EncryptedString("secret"));
  user.setUsername("johnny" + Calendar.getInstance().getTimeInMillis());//random
  user.setAdministrator(true);
 
  sqlSession.insert("User.insert", user);
 
  //Retrieve User
  user = (User) sqlSession.selectOne("User.find", user.getId());
 
  assertNotNull(user.getId());
 
  sqlSession.rollback();
} finally {
  sqlSession.close();
}
}

    到此基本流程完畢!接下來重點說明配置文件User.xml等

配置文件xml詳細解釋:

    整個框架的核心就是實體映射配置文件xxx.xml(User.xml)文件中。通過配置該文件,實現數據庫中的數據和JavaBean的交互(讀寫)。每一個和數據庫交互的語句都被放在一個selectinsertupdatedelete標籤內。每個這樣的標籤有一個唯一標識,java代碼就是通過該唯一標識去執行特定的語句,比如上面的sqlSession.selectList("Namespace.sqlId",parameObj)中的“NameSapce.sqlId”就是一條sql語句的唯一標識。標籤內的語句可以接受java代碼傳遞的參數,比如上面parameObj就是傳遞和接收的參數,該參數可以是具體的java基本類型和String類型,也可以是複雜的對象類型或者集合類型,如果是基本類型或者String類型那麼在配置文件中通過#{_parameter}獲取,如果是集合類型那麼在配置文件中通過#{list}獲取,如果是複雜對象類型那麼在配置文件中通過#{objattribute}直接獲取。然後根據條件以及接收的參數動態拼裝sql,動態拼裝sql的時候,會使用的ognl表達式一個各種條件標籤如<if><foreach><where><set><trim>等標籤。通過上面一系列的操作,最終會得到一個sql語句,Mybatis執行該sql語句以後如果有返回結果,返回結果是基本類型就直接用returnType限定,如果是複雜類型或者集合類型,就通過returnMap轉換,然後將轉化的結果返回給java代碼中的調運結果。整個流程簡單總結就是:參數映射->sql解析->sql執行->結果映射,對於數據寫入和讀取都是同樣流程。

配置文件xml標籤總結:

標籤類型

標籤

說明

定義sql語句

select

查詢語句


insert

插入語句


update

更新語句


delete

刪除語句

結果映射

resultMap

結果集合和javaBean映射配置


collection

一對多中多方集合映射


association

多對一中一放對象映射

動態sql拼接

if

條件標籤


choose/when/otherwise

條件選擇標籤


foreach

循環迭代標籤

格式化輸出

where

查詢時候快捷拼接條件


set

更新時候快捷拼接值


trim

指定前綴後綴等,可達到where/set效果

常量定義使用

sql

定義一段常量

常量引用使用

include

引用一段常量

配置文件xml中易錯點總結:

resultMap

結果集合映射到JavaBean中,返回的結果是JavaBean

resultType

結果返回的是一個Java基礎類型或者String類型,不需要映射

parameterMap

請求參數的JavaBean映射,不推薦使用

parameterType

定義請求參數的class類型,可以是JavaBean類型,也可以是基礎java類型或者String

#{}/${}

#{}表示的是問好(?)佔位符,更常用。${}表示的是直接用參數代替,不會加引號,一般在排序的時候可能會用到。

#{}/ognl內容取值

簡單類型參數用#{_parameter},集合類型用#{list},JavaBean類型直接用#{attribute}


    到此,Mybatis已經基本能完成日常使用,但是一個優秀的ORM框架怎麼可能只有這麼點東西?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章