1. 程式人生 > >Day1 Mybatis初識(一)

Day1 Mybatis初識(一)

定義 gen 細節 manager mapping out 開發效率 導入jar 工廠

框架

將重復的,繁瑣的代碼實現封裝,讓程序員將更多的精力放在業務的理解和分析上。

框架的作用

提高開發效率

隱藏細節

三大框架SSH --> SSM

1) 表述層: 用戶交互 servlet SpringMVC/Struts2

2) 業務邏輯層:業務處理 javabean/ejb Spring

3) 數據持久層:數據庫交互 jdbc Mybatis/Hibernate

傳統JDBC的不足

1) 四個參數的使用有硬編碼(配置文件)

2) statement的使用中有硬編碼

3) 頻繁打開和關閉連接(數據源(連接池))

Mybatis框架

MyBatis 是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。

Mybatis是一個優秀的ORM框架

ORM:Object Relationship Mapping(對象關系映射)

Mybatis不需要開發人員過多關註數據庫的連接關閉,stmt對象的創建;著重關註sql

關註映射: 輸入參數 和 輸出結果

1) mybatis下載

apache ibatis前身。

google code à Mybatis

github

2) https://github.com/mybatis/mybatis-3/releases

Mybatis的開發

1)配置文件 (xml)

  a)xfg.xml:核心配置文件(全局配置文件)

   連接信息的配置(連接池),事務管理

  b) mapper.xml:映射文件

2) SqlSessionFactory:session工廠

3)SqlSession:面向程序員的接口(增刪改查)

4)搭建

a) 創建java項目,導入jar

技術分享圖片

b)配置核心配置文件(xml)

核心配置文件:

<!-- DTD:定義/約束 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd"
> <!-- Mybtais核心配置文件:任何的地方都可以獲取 --> <configuration> <!-- environments:環境集合(mysql/oracle) default:默認(環境的id) --> <environments default="development"> <!-- environment:代表一個環境 id:唯一標識 transactionManager:事務管理器(管理事務) type:jdbc dataSource:數據源(連接池) 連接池:當項目啟動,向數據庫請求初始化連接數條連接放置在連接池中管理; 當連接的請求多於初始化連接數,此時會根據步長來增加連接數(創建連接); 最大不超過最大連接數,人就不夠時需要根據超時時間進行等待; 當連接的請求遠低於當前的連接數,此時會根據最小連接數釋放相應的連接。 好處:減少了連接的頻繁關閉。 缺點:連接需要占用資源 必須配置四個參數 driver url username password 流行的數據源:DBCP C3P0 DROID type="POOLED"("池") --> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///bd1711"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <mapper resource="BookMapper.xml"/> </mappers> </configuration>

mapper映射文件

<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!-- 
       mapper:描述對象和記錄之間的映射關系
               namespace:隔離sql,在mapper代理時由特殊用法
   -->
<mapper namespace="com.lee">

   <!--  查詢的映射:  (Statement對象) 
               id:該標簽的唯一標識
               resultType:結果類型 (輸出結果的映射) 
               #{}:代表占位符 
               parameterType:輸入參數類型(輸入參數的映射)(可省略)
   -->
  <select id="selectBook" resultType="entity.Book">
    select * from book where bid = #{bid}
  </select>

</mapper>

測試代碼

//加載配置文件為流
            InputStream is = Resources.getResourceAsStream("Mybatis.xml");
            //創建SqlSessionFactory(加載)
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
            //核心接口(發送增刪改查語句) 
            SqlSession session = ssf.openSession();
            
            Book book = session.selectOne("com.lee.selectBook", 1);
            System.out.println(book);
            
            //釋放資源
            session.close();

配置詳解

核心配置文件

?    properties
<!-- 1.配置(動態替換) 
            1.1 java的屬性文件外部引入   resource="jdbc.properties"
            1.2 property標簽中配置
            
            當兩者沖突時,最終使用java的屬性文件的配置。
       -->
    <properties resource="jdbc.properties">
        <!--  <property name="driver" value="com.mysql.jdbc.Driver"/> --> 
    </properties>
?    settings
<!--2.settings 調整:影響整個Mybatis的行為  -->
    <settings>
        <!--  緩存總開關:  默認true,開啟緩存    /  false關閉緩存  -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 延遲加載總開關:   默認false,默認是立即加載   /  true延遲加載 -->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
?    typealiases
<!-- 3.別名
        typeAlias:單一類型起別名
            type:需要設置別名的全限定名稱
            alias:別名
        package:包      
            默認別名就是類型(首字母大小寫均可)
     -->
    <typeAliases>
        <!-- <typeAlias type="entity.Book" alias="book"/> -->
        <package name="entity"/>
    </typeAliases>
?    typeHandlers:
類型處理器
?    objectFactory:對象工廠
?    enviroment
<environment id="development">
        <!-- 事務管理器: 
            JDBC: 和JDBC使用同樣的提交和回滾策略
            MANAGED:依賴於應用服務器上下文(context)的配置(必須在服務器上運行)
        -->
      <transactionManager type="JDBC"/>
      <!-- 數據源:      c3p0,droid
              UNPOOLED:請求時連接,完畢時關閉
              POOLED:連接池
              JNDI:依賴於應用服務器(在上下文配置數據源,然後在java獲取上下文的引用從而獲取數據源)
       -->
      <dataSource type="POOLED">
        <property name="driver" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.user}"/>
        <property name="password" value="${db.pwd}"/>
      </dataSource>
    </environment>
?    mappers
<!-- 映射器   :作用  尋找映射文件,sql-->
  <mappers>
      <!-- 1.相對於src映射文件的相對路徑  -->
    <mapper resource="BookMapper.xml"/>
    <!-- 2.url:全路徑 -->
    <!-- 3.class:使用mapper接口的class -->
    <!-- 4.package:註冊整個包下所有的文件(mapper代理開發) -->
  </mappers>

映射文件

<!-- 1.使用二級緩存  -->
    <cache></cache>
    <!-- 2.引用其他命名空間緩存  -->
    <cache-ref namespace=""/>

<!-- 3.實現復雜的類型封裝 -->
    <resultMap type="" id=""></resultMap>

<!-- 4.可被重用的語句塊  -->
    <sql id="bookCols">
        bid,bname,author,price
    </sql>

查詢:  select   (查詢一個,查詢所有,模糊查詢,分頁查詢)
<!-- 模糊查詢  :缺陷  有sql註入的風險     /  但是使用不同字段作排序時必須使用    -->
  <select id="selectLike" resultType="book">
      select * from book where bname like ‘%${value}%‘
  </select>
  
  <!-- 分頁查詢
      1.編寫類
      2.map
      3.rowbounds
   -->
  <select id="selectByPage"  resultType="book" parameterType="map">
      select * from book limit #{startRow},#{length}
  </select>
  
  <select id="selectByPage2"  resultType="book">
      select * from book
  </select>


增刪改:insert   update   delete
   主鍵返回
    <!-- 插入
          主鍵返回(用於建立多表之間的關系)
   -->
  <insert id="insertBook" parameterType="book" useGeneratedKeys="true" keyProperty="bid">
     insert into book(bname,author,price) values(#{bname},#{author},#{price})
  </insert>
  
  <insert id="insertBook2" parameterType="book">
      <selectKey keyProperty="bid" order="AFTER" resultType="int">
          <!-- select LAST_INSERT_ID() -->
          <!-- select SEQ_BOOK.nextval from dual -->
      </selectKey>
     insert into book(bname,author,price) values(#{bname},#{author},#{price})
  </insert>

Eclipse導入本地dtd約束

技術分享圖片

Day1 Mybatis初識(一)