03.SSM框架集~Mybatis(一)

03.SSM框架集~Mybatis(一)

本文是上一篇文章的後續,詳情點擊該鏈接

jar包        zeju

       在上一篇文章裏面,我們對JDBC的知識進行了複習整理,對JDBC的操作也進行了很多優化。那麼今天我們就來學習第一個框架:Mybatis

Mybatis

        MyBatis 本是Apache的一個開源項目iBatis, 2010年這個項目由Apache Software Foundation 遷移到了Google Code,且改名爲MyBatis 。2013年11月遷移到GitHub。iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。

        MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對象)映射成數據庫中的記錄。

        關鍵字:框架、ORM、持久層

認識ORM

        JDBC的缺點:需要手動的完成面向對象的Java語言、面向關係的數據庫之間數據的轉換,代碼繁瑣無技術含量,影響了開發效率。

        JDBC查詢需要手動的將結果集的列數據轉換爲Java對象的屬性;而添加操作時需要手動將Java對象的屬性轉換爲數據庫表的列字段。

        關於面向對象的Java語言、面向關係的數據庫之間數據的轉換必須要做,問題在於這個轉換是否可以不由開發者來做。可以的。ORM框架就是專門來做這個問題的,相當於在面嚮對象語言和關係數據庫之間搭建一個橋樑。

        ORM,Object-Relationl Mapping,對象關係映射,它的作用是在關係型數據庫和對象之間作一個映射,這樣我們在具體的操作數據庫的時候,只要像平時操作對象一樣操作它就可以了,ORM框架會根據映射完成對數據庫的操作,就不需要再去和複雜的SQL語句打交道了。

        另外學習ORM必須知道兩個概念:持久化、持久層

什麼是“持久化”

        持久(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的數據存儲在關係型的數據庫中,當然也可以存儲在磁盤文件中、XML數據文件中等等。

什麼是 “持久層

        持久層(Persistence Layer),即專注於實現數據持久化應用領域的某個特定系統的一個邏輯層面,將數據使用者和數據實體相關聯。之前使用JDBC訪問數據庫的DAO層,後面採用MyBatis訪問數據庫的mapper層,就是持久層。

        Mybatis是一持久層的款半自動的ORM映射框架

和Hibernate的比較

        Hibernate是一個全自動的ORM框架。因爲Hibernate創建了Java對象和數據庫表之間的完整映射,可以完全以面向對象的思想來操作數據庫,程序員不需要手寫SQL語句,而MyBatis中還需要手寫SQL語句,所以是半自動化的,工作量要大於Hibernate。

        MyBatis需要手寫SQL語句,所以工作量要大於Hibernate。但是也正是由於自定義SQL語句,所以其靈活性、可優化性就超過了Hibernate。

        Hibernate封裝了SQL語句,由開發者對對象操作,Hibernate來生成SQL語句。雖然也可以通過映射配置來控制生成的SQL語句,但是對於要生成複雜的SQL語句,很難實現,或者實現後導致性能的丟失。

        MyBatis對存儲過程可提供很好的支持。另外MyBatis的開發工作量大不意味着學習成本大。對於新手,學習Hibernate時間成本比Mybatis大很多,Mybatis很快就上手了。

        總之,因爲MySQL具有相對輕量級,封裝少、映射多樣化、支持存儲過程、可以進行SQL語句優化等特點,符合互聯網高併發、大數據、高性能、高響應的要求,使它取代Hibernate成爲了Java互聯網中首選的持久框架。而對於對性能要求不高的比如內部管理系統、ERP等可以使用Hibernate。

mybatis主要類及執行流程
加入jar包(上面有百度雲盤鏈接)
編號 元素列表 作用
1 mybatis-3.5.2.jar Mybatis核心jar包
2 ant-1.10.3.jar 將軟件編譯、測試、部署等步驟聯繫在一起加以自動化的一個軟件構建工具
3 ant-launcher-1.10.3.jar 將軟件編譯、測試、部署等步驟聯繫在一起加以自動化的一個軟件構建工具
4 asm-7.0.jar 代碼生成,代碼混淆,代碼轉換等等以字節碼爲操作目標的工作,一定程度上類似javac的功能
5 cglib-3.2.10.jar 實現動態代理的技術,延遲加載時使用
6 javassist-3.24.1-GA.jar 可用來檢查、”動態”修改及創建 Java類。功能與JDK自帶反射功能類似,但比反射功能更強大
7 ognl-3.2.10.jar 對象導航圖語言的縮寫,功能強大的表達式語言工具包。在動態SQL和${param}中使用
8 commons-logging-1.2.jar 日誌包
9 slf4j-api-1.7.26.jar 日誌包
10 slf4j-log4j12-1.7.26.jar 日誌包
11 log4j-1.2.17.jar 日誌包
12 log4j-api-2.11.2.jar 日誌包
13 log4j-core-2.11.2.jar 日誌包

準備核心配置文件

        在src下定義MyBatis的配置文件,無固定名稱。但是大多數情況下用Mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!-- xml文檔約束 約束xml文檔中可以有哪些標籤,哪些屬性,以及標籤的包含關係和順序....
dtd 約束
schema 約束
-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--配置數據庫鏈接信息-->
    <environments default="mysql">
        <!--數據源1-->
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <!--一個數據源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--加載映射文件的-->
    <mappers>
        <!--  映射文件的路徑 -->
        <mapper resource="com/alvin/mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

Mapper映射文件

<?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="com.alvin.mapper.StudentMapper">
    <!--  
    
        select          專門用於定義查詢語句的標籤
        id              sql語句的唯一標識
        parameterType   參數的數據類型 目前沒有參數,省略不寫
        resultType      查詢的結果要封裝成哪個類的對象

        resultType      好比是方法的返回值
        id              好比方法名
        paramaterType   好比方法的參數列表
    
    -->
    <select id="stu" resultType="com.alvin.pojo.Student">
        <!--  查詢所有學生信息 -->
        select * from student;
    </select>

</mapper>

Java代碼

public class Test {
    public static void main(String[] args) throws IOException {
        //1獲取sqlsession

        //SqlSessionFactory創建工具 專門用戶創建SqlSessionFactory

        SqlSessionFactoryBuilder ssfb =new SqlSessionFactoryBuilder();

        // SqlSessionFactory sql語句會話對象工廠,專門用於生產SqlSession對象

        InputStream is = Resources.getResourceAsStream("mybatis.xml");

        // build方法中需要傳入一個輸入流作爲參數  輸入流要指向我們的mybatis核心配置文件

        SqlSessionFactory factory=ssfb.build(is);

        //sql語句會話對象 專門用於執行sql語句和返回結果

        SqlSession sqlSession=factory.openSession();

        //2用sqlsession執行sql語句,完成映射關係處理

        // selectOne中方的是要執行的sql語句的id

        List<Student>list = sqlSession.selectList("stu");

        //3關閉sqlsession 釋放資源

        sqlSession.close();

        //遍歷結果
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

        項目的搭建很費勁,搭建完畢之後,後面所有的增刪改查就變的簡單了,套路在mapper映射文件定義一個sql語句,使用sqlsession調用sql語句即可,再也不用編寫原生JDBC代碼了,再也不用手動處理ResultSet 封裝成java對象. 再也不用手動的設置sql語句的參數了,完全由mybatis自動完成映射處理

MyBatis配置細節

        在mybatis.cfg.xml中配置MyBatis所使用的具體日誌實現。如果不指定將自動搜索。可能會搜到log4j,但是如果優先搜到了其他的日誌實現呢,所以還是設置爲好。這一來log4j就跑不了了。

        將log4j.properties文件負責到src下。另外在其中可以將全局的日誌級別調高,避免大量debug信息的干擾。同時將對映射文件的操作調低,可以用來顯示SQL語句的調試信息。開發階段,建議啓動控制的日誌。

#定義全局日誌級別調試階段推薦debug
log4j.rootLogger=debug,stdout 
#包級別日誌 調試階段推薦debug
log4j.logger.com.alvin.mapper=debug

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=d:/alvin.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n

        可以查看mybatis核心配置文件中都可以配置哪些東西

<settings>
    <!--設置日誌處理方式-->
    <setting name="logImpl" value="LOG4J"/>
</settings>
事務配置(Mybatis.xml)

        在mybatis核心配置文件中 emvirment中 通過transactionManager配置事務的處理策略

        JDBC – 這個配置直接簡單使用了 JDBC 的提交和回滾設置。它依賴於從數據源得到的連接來管理事務範圍

        MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連接。而它會讓容器來管理事務的整個生命週期(比如 Spring 或 JEE 應用服務器的上下文) 默認情況下它會關閉連接。然而一些容器並不希望這樣, 因此如果你需要從連接中停止它,將 closeConnection 屬性設置爲 false. mybatis本身並不做事務的處理,交給其他框架去處理事務,如spring

映射文件的加載方式(Mybatis.xml)
實體類別名處理(Mybatis.xml)
   <typeAliases>
        <!--
        通過包掃描給所有的實體類起別名
        給指定報名下的所有類起別名
        默認每個實體類的別名是首字母小寫的類名

        Student student
        -->
        <package name="com.alvin.pojo"/>
    </typeAliases>

        這樣返回到到mapper文件裏resultType裏面就只需要student,而不是com.alvin.pojo.student了(映射文件)

外部屬性配置文件存儲數據庫鏈接信息

這個時候回到Mybatis.xml

這樣下來就簡單多了~

Mybatis三種查詢方式(單個,List,Map)

        前面我們已經寫過一遍Mybatis基於List查詢,現在我們把一些固定的操作給封裝在一個工具類裏,省的每次都要寫,可以提高開發效率。

編寫工具類

public class SqlSessionUtil {
    private static SqlSessionFactory factory;
    static {
        InputStream ins = null;
        try {
            ins = Resources.getResourceAsStream("mybatis.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        factory = builder.build(ins);
    }
    public static SqlSession getSqlSession(boolean autoCommit){
        /*
        * factory.openSession(true) 事務自動提交
        * 如果不傳入 true 默認爲false
        * */
        SqlSession sqlSession = factory.openSession(autoCommit);
        return sqlSession;
    }
    //方法重載
    public static SqlSession getSqlSession(){
        /*
        * factory.openSession(true) 事務自動提交
        * 如果不傳入 true 默認爲false
        * */
        SqlSession sqlSession = factory.openSession();
        return sqlSession;
    }
}

創建實體類,每個參數對應sql字段

public class Student {
    private String son;
    private String realname;
    private String password;
    private String classname;
    private Double score;
    //Get Set就不在文章裏面寫了
    }

三種查詢操作

<?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="com.alvin.mapper.StudentMapper">

    <!--   查詢全部信息 -->
    <select id="findall" resultType="student">
        select * from student;
    </select>

    <!--  查詢單個信息 -->
    <select id="findbyname" resultType="student">
        <!--  比較類似於JDBC裏面的 ?佔位符  -->
        select * from student where realname = #{param};
    </select>

    <!--  查詢多個信息(使用map) -->
    <select id="findbymap" resultType="student">
        select * from student where realname = #{param1} and password = #{param2};
    </select>

</mapper>

Java代碼
public class Test {
    public static void main(String[] args) throws IOException {
        FindOne();
        FindList();
        FindMap();
    }

    //查詢單個信息
    public static void FindOne(){
        //鏈接工具類
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        //接收數據                              前面是id   後面是 #{param} 參數
        Student student = sqlSession.selectOne("findbyname","黃貴根");
        //關閉sqlSession
        sqlSession.close();
        //查看結果
        System.out.println(student);
    }

    //查詢多個信息
    public static void FindMap(){
        //鏈接工具類
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        //輸入參數
        Map<String,Object> map = new HashMap<>();
        //注意:這個時候map的 key 必須和 #{param} 名字相同, 然後根據對應的名字輸入對應的value
        map.put("param1","黃貴根");
        map.put("param2","66666");
        //查詢
        List<Student> list = sqlSession.selectList("findbymap",map);
        //關閉sqlSession
        sqlSession.close();
        //結果:
        System.out.println(list);
    }

    //查詢全部信息
    public static void FindList(){
        //鏈接工具類
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        //接收
        List<Student> list = sqlSession.selectList("findall");
        //關閉
        sqlSession.close();
        //結果:
        System.out.println(list);
    }
}

好了,關於Mybatis的學習,今天就到這裏了!我們下期再見!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章