1. 程式人生 > >.Net轉Java自學之路—Mybatis框架篇一(入門)

.Net轉Java自學之路—Mybatis框架篇一(入門)

spa dstat namespace devel word nvi lose 列名 優化

原生態JDBC程序問題總結:

  1、數據庫連接,使用時就創建,不使用立即釋放。該操作是對數據庫進行頻繁連接開啟和關閉,造成數據庫資源浪費,影響數據庫性能。
    解決:使用數據庫連接池管理數據庫連接。

  2、將sql語句硬編碼到java代碼中,若sql語句修改,需要重新編譯java代碼,不利於維護。
    解決:將sql語句配置在xml配置文件中,即使sql變化,也不需要對java代碼進行重新編譯。

  3、在向PreparedStatement中設置參數時,對占位符位置和設置參數值,硬編碼在Java代碼中,不利於維護。
    解決:將sql語句及占位符和參數全部配置在xml配置文件中。

  4、從ResutSet中遍歷結果集數據時,存在硬編碼,將獲取表的字段進行硬編碼,不利於維護。
    解決:將查詢的結果集,自動映射成Java對象。

Mybatis簡述:

  mybatis是一個持久層框架,是Apache下的頂級項目。mybatis的前身是ibatis。mybatis開始是托管到goolecode下,再後來托管到github下(https://github.com/mybatis/mybatis-3/releases)
  mybatis讓程序將主要精力放在sql上,通過mybatis提供的映射方式,自由靈活生成(半自動)滿足需要sql語句。
  mybatis可以將向PreparedStatement中的輸入參數自動進行輸入映射,將查詢結果集靈活映射成Java對象(輸出映射)

Mybatis框架原理:

  SqlMapConfig.xml:mybatis的全局配置文件,名稱不固定;配置了數據源、事務等mybatis運行環境。mybatis還需要配置mapper.xml、mapper.xml等,mapper.xml就是映射文件(配置sql語句)。
  SqlSessionFactory:會話工廠。根據配置文件創建工廠。作用就是創建SqlSession。
  SqlSession:會話。是一個接口,面向用戶的接口。作用,進行crud數據庫操作。
  Executor:執行器。是一個接口,存在倆個實現:基本執行器、緩存執行器。作用,SqlSession內部通過執行器進行crud數據庫操作。

  mapped statement:底層封裝對象。作用,對crud數據庫操作存儲封裝,包含sql語句、輸入參數、輸出結果類型。

Mybatis入門程序:

  映射文件:

    1、映射文件命名:User.xml(原始ibatis命名。),mapper代理開發映射文件名稱為:XXXMapper。如:UserMapper.xml

技術分享圖片
<?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">
<!-- namespace命名空間,作用就是對sql進行分類化管理,理解sql隔離
    註意:使用mapper代理方法開發,namespace有特殊重要的作用 -->
<mapper namespace="test">
    <!-- 再映射文件中配置很多的sql語句:
        select標簽執行數據庫查詢
            id:標識映射文件中的sql,將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id
            parameterType:指定輸入參數的類型。
            resultType:輸出類型。指定sql輸出結果的所映射的java對象類型,select指定resultType表示將單條記錄映射成的Java對象。
            #{}:表示一個占位符號
            #{id}:其中的id表示接入輸入的參數,參數名稱就是id,如果輸入參數是簡單類型,#{}中的參數名可以任意;可以是value或其他名稱。
             -->
    <select id="findUserById" parameterType="參數的類型。如:int" resultType="">
        select * from t_User where id=#{id}
    </select>
    <!-- 無論sql語句返回的是單條記錄或多條記錄都是所映射的Java對象類型
        ${}:表示拼接sql串,將接收到參數的內容不加任何修飾拼接在sql中。使用${}拼接sql,會引起sql註入。
        ${value}:接收輸入參數的內容,若傳入類型是簡單類型,${}中只能使用value -->
    <select id="findUserByName" parameterType="String" resultType="cn.ccir.mybatis.entity.User">
        select * from t_User where username like ‘%${value}%‘
    </select>
    <!-- 添加配置 
        parameterType:指定輸入參數類型是pojo(普通的java對象)
        #{}中指定pojo的屬性名,接收到pojo對象的屬性值,mybatis通過OGNL獲取對象的屬性值 -->
    <insert id="insertUser" parameterType="cn.ccir.mybatis.entity.User">
        
        <!-- 將插入數據的自增主鍵值返回,返回到user對象中
            select LAST_INSERT_ID():得到剛insert的記錄主鍵值,只適用於自增主鍵
            keyProperty:將查詢到主鍵值設置到parameterType指定對象的那個屬性
            order:select LAST_INSERT_ID()的執行順序,相對於insert語句來說它的指定順序
            resultType:指定select LAST_INSERT_ID()的結果類型 -->>
        <selectKey keyProperty="id" order="AFTER" resultType="java.long.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        <!---->
        <!-- 將插入數據的非自增主鍵值返回,uuid()得到主鍵,在insert語句之前執行。
            通過uuid()得到主鍵,將主鍵設置到user對象的id屬性中。其次在insert執行時,從user對象中去除id屬性值 -->
        <selectKey keyProperty="id" order="BEFORE" resultType="java.long.String">
            select uuid()(mysql)/select 序列名.nextval()(oracle)
        </selectKey>
        insert into user(id,username,birthday,sex,address)value(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
    
    <!-- 刪除配置 -->>
    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete from t_User where id=#{id}
    </delete>
    
    <!-- 修改配置
        parameterType:指定user對象,包括id和更新信息。註:id必須在User對象中存在
        #{}:從輸入User對象中獲取id屬性值 -->>
    <update id="updateUserById" parameterType="cn.ccir.mybatis.entity.User">
        update t_User set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
</mapper>
UserMapper.xml

    2、在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>
    <!-- 和spring整合後environments配置將廢除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事務管理,事務控制由mybatis -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 數據庫連接池,有mybatis管理 -->
            <dataSource type="POOLED">
                <property name="driver" value=""/>
                <property name="url" value=""/>
                <property name="username" value=""/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 加載映射文件 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
SqlMapConfig.xml 技術分享圖片
public void findUserById() throws IOException{
    //加載配置文件得到流對象
    String resource="SqlMapConfig.xml";
    InputStream inputStream=Resources.getResourceAsString(resource);
    //創建會話工廠
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    //通過工廠得到SqlSession
    SqlSession sqlSession=sqlSessionFactory.openSession();
    //通過SqlSession來curd數據庫
    //第一個參數:映射文件中是statement的id,等於namespace+"."+statement的id
    //第二個參數:指定和櫻色和文件中所匹配的parameterType類型的參數。
    //sqlSession.selectOne結果是與映射文件中所匹配的resultType類型的對象。查詢出的是一條記錄。
    //sqlSession.selectList查詢出的是多條記錄。
    User user = sqlSession.selectOne("test.findUserById",parameter,1);
        //方法名:findUserByName
    List<User> list = sqlSession.selectList("test.findUserByName","條件值");
    
    //添加   方法名: insertUser
    User user=new User();
    user.setUsername("");
    user.setBirthday(new Date());
    user.setSex("");
    user.setAddress("");
    ......
    sqlSession.insert("test.insertUser",user);
    sqlSession.commit();//提交事務
    
    //刪除    方法名:deleteUserById
    sqlSession.delete("test.deleteUserById",1);
    sqlSession.commit();//提交事務
    user.getId();//獲取主鍵id值。
    
    //修改    方法名:updateUserById
    User user=new User();
    user.setId("");
    user.setUsername("");
    user.setBirthday(new Date());
    user.setSex("");
    user.setAddress("");
    ......
    sqlSession.insert("test.updateUserById",user);
    sqlSession.commit();//提交事務
    
    //釋放資源
    sqlSession.close();
}
Crud實例

#{} 與 ${}:

  #{}:表示一個占位符,接收輸入參數,類型可以時簡單類型、pojo(簡單java對象)、hashmap。
    若#{}接收簡單類型,#{}中可以寫成value或其他名稱。
    若#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性。

  ${}:表示一個拼接符號,會引用sql註入,所以不建議使用${}。接收輸入參數,類型可以時簡單類型、pojo、hashmap。
    若${}接收簡單類型,${}中只能寫成value。
    若${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性。

Mybatis和Hibernate本質區別及應用場景:

  Hibernate:是一個標準的ORM框架(對象關系映射)。入門門檻較高,不需要書寫sql語句,hibernate會自動生成。對sql進行優化、修改比較困難。

  Mybatis:專註是sql本身,需要書寫sql語句,sql的優化、修改比較方便。Mybatis不是一個完全的ORM框架,雖然可以實現映射(輸入、輸出框架),但還需要書寫sql。

    

.Net轉Java自學之路—Mybatis框架篇一(入門)