天天看點

SSM架構之Mybatis入門Mybatis入門

Mybatis入門

何為架構:

​ 架構(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件執行個體間互動的方法;另一種 定義認為,架構是可被應用開發者定制的應用骨架。前者是從應用方面而後者是從目的方面給出的定義。簡而言之,架構其實就是某種應用的半成品,就是一組元件,供你選用完成你自己的系統。簡單說就是使用别 人搭好的舞台,你來做表演。而且,架構一般是成熟的,不斷更新的軟體。 架構是半成品軟體。

​ 架構要解決的最重要的一個問題是技術整合的問題,在 J2EE 的 架構中,有着各種各樣的技術,不同的 軟體企業需要從 J2EE 中選擇不同的技術,這就使得軟體企業最終的應用依賴于這些技術,技術自身的複雜性和技 術的風險性将會直接對應用造成沖擊。而應用是軟體企業的核心,是競争力的關鍵所在,是以應該将應用自身的設計和具體的實作技術解耦。這樣,軟體企業的研發将集中在應用的設計上,而不是具體的技術實作,技術實作是應用的底層支撐,它不應該直接對應用産生影響。

架構一般處在低層應用平台(如 J2EE)和高層業務邏輯之間的中間層

SSM架構:

​ SSM(Spring+SpringMVC+MyBatis)架構集由Spring、MyBatis兩個開源架構整合而成(SpringMVC是Spring中的部分内容)。常作為資料源較簡單的web項目的架構。

Spring

  Spring就像是整個項目中裝配bean的大工廠,在配置檔案中可以指定使用特定的參數去調用實體類的構造方法來執行個體化對象。也可以稱之為項目中的粘合劑。

  Spring的核心思想是IoC(控制反轉),即不再需要程式員去顯式地

new

一個對象,而是讓Spring架構幫你來完成這一切。

SpringMVC

  SpringMVC在項目中攔截使用者請求,它的核心Servlet即DispatcherServlet承擔中介或是前台這樣的職責,将使用者請求通過HandlerMapping去比對Controller,Controller就是具體對應請求所執行的操作。SpringMVC相當于SSH架構中struts。

mybatis

  mybatis是對jdbc的封裝,它讓資料庫底層操作變的透明。mybatis的操作都是圍繞一個sqlSessionFactory執行個體展開的。mybatis通過配置檔案關聯到各實體類的Mapper檔案,Mapper檔案中配置了每個類對資料庫所需進行的sql語句映射。在每次與資料庫互動時,通過sqlSessionFactory拿到一個sqlSession,再執行sql指令。

作為持久層的架構,還有一個封裝程度更高的架構就是Hibernate,但這個架構因為各種原因目前在國内的 流行程度下降太多,現在公司開發也越來越少使用。目前使用 Spring Data 來實作資料持久化也是一種趨勢
           

​ 頁面發送請求給控制器,控制器調用業務層處理邏輯,邏輯層向持久層發送請求,持久層與資料庫互動,後将結果傳回給業務層,業務層将處理邏輯發送給控制器,控制器再調用視圖展現資料。

​ 架構的重要性在于它實作了部分功能,并且能夠很好的将低層應用平台和高層業務邏輯進行了緩和。為了實作軟體工程中的“高内聚、低耦合”。把問題劃分開來各個解決,易于控制,易于延展,易于配置設定資源。我們常見的 MVC 軟體設計思想就是很好的分層思想。

SSM架構之Mybatis入門Mybatis入門

今日份内容:

  1. MyBatis概述:

    ​ mybatis是一個優秀的基于 java 的持久層架構,它内部封裝了 jdbc,使開發者隻需要關注 sql語句本身, 而不需要花費精力去處理加載驅動、建立連接配接、建立 statement 等繁雜的過程。 mybatis通過xml 或注解的方式将要執行的各種statement配置起來,并通過java對象和statement 中 sql 的動态參數進行映射生成最終執行的 sql 語句,最後mybatis 架構執行 sql 并将結果映射為 java 對象并傳回。 采用 ORM 思想(Object Relational Mappging 對象關系映射,簡單來說就是把資料庫表和實體類及實體類的屬性對應起來讓我們可以操作實體類就實作操作資料庫表)解決了實體和資料庫映射的問題,對 jdbc進行了封裝,屏蔽了 jdbc api 底層通路細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作。

  2. 優缺點分析:

    優點:

    • 簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝隻要兩個jar檔案+配置幾個sql映射檔案易于學習,易于使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實作。
    • 靈活:mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便于統一管理和優化。通過sql基本上可以實作我們不使用資料通路架構可以實作的所有功能,或許更多。
    • 解除sql與程式代碼的耦合:通過提供DAL層,将業務邏輯和資料通路邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
    • 提供映射标簽,支援對象與資料庫的orm字段關系映射
    • 提供對象關系映射标簽,支援對象關系組建維護
    • 提供xml标簽,支援編寫動态sql。
    缺點:
    • 編寫SQL語句時工作量很大,尤其是字段多、關聯表多時,更是如此。
    • SQL語句依賴于資料庫,導緻資料庫移植性差,不能更換資料庫。
    • 架構還是比較簡陋,功能尚有缺失,雖然簡化了資料綁定代碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易适應快速資料庫修改。
    • 二級緩存機制不佳
  3. MyBatis的配置:

    下載下傳jar包,可以去MyBatis的GitHub下載下傳,也可以直接用這個連結下載下傳

    連結:https://pan.baidu.com/s/10RA42BRrWHVb3PkeqV6JKg 
    提取碼:99xz 
               

此壓縮包包含檔案:

(1)mybatis-3.5.2.jar

(2)mybatis-3.5.2.pdf mybatis 官方指導文檔

(3)還有mybatis-3.5.2.jar依賴的jar包

maven倉庫:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.2</version>
</dependency>
           
  1. MyBatis簡單入門:

1.建立預設的maven項目,配置POM.xml

<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>
           

2.建立資料庫以及對應的java實體類:

public class User implements Serializable {
    private Integer id;
    private String name;
    private String gender;
    private Integer age;
	//生成set和get方法,以及測試用的toString方法
}
           

3.在resources下添加SqlMapConfig檔案:

<?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">
<!-- mybatis的主配置檔案 -->
<configuration>
    <!-- 配置環境 -->
    <environments default="mysql">
        <!-- 配置mysql的環境-->
        <environment id="mysql">
            <!-- 配置事務的類型-->
            <transactionManager type="JDBC"/>
            <!-- 配置資料源(連接配接池) -->
            <dataSource type="POOLED">
                <!-- 配置連接配接資料庫的4個基本資訊 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///day17"/>
                <property name="username" value="root"/>
                <property name="password" value="425425"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置檔案的位置,映射配置檔案指的是每個Mapper(Dao)獨立的配置檔案 -->
    <mappers>
        <mapper resource="com/maoqian/sqlmap/UserMapper.xml"/>
    </mappers>
</configuration>
           

4.還是在資源路徑下添加上面mappers對應的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">
<!--命名空間,唯一辨別,作用之後再表-->
<mapper namespace="com.maoqian.sqlmap.UserMapper">
    <!--配置查詢所有-->
    <select id="findAll" resultType="com.maoqian.domain.User">
        select * from user
    </select>
    <insert id="insertUser" parameterType="com.maoqian.domain.User">
        insert into user(name, gender, age)  value (#{name},#{gender},#{age})
    </insert>
</mapper>
           

5.建立測試類:

public class MybatisDemo {
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession sqlSession;

    /**
     * before注解能夠在test1方法運作之前運作init方法,after與之相反
     * @throws IOException
     */
    @Before
    public void init() throws IOException {
        //加載配置檔案,得到輸入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //new SqlSessionFactoryBuilder得到工廠注冊類然後調用build方法将xml中的配置資訊擷取得到一個工廠對象
        factory = new SqlSessionFactoryBuilder().build(in);
        //通過工廠對象代理得到sqlsession對象
        sqlSession = factory.openSession();
    }

    @Test
    public void test1(){
        List<User> all = sqlSession.selectList("findAll");
        System.out.println(all);
    }

    @Test
    public void test2(){
        User user = new User();
        user.setName("lisi");
        user.setGender("男");
        user.setAddress("beijin");
        sqlSession.insert("insertUser",user);
    }

    @After
    public void destory() throws IOException {
        sqlSession.commit();
        in.close();
        sqlSession.close();
    }
}

           

持續更新中…