最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis快速入門之環(huán)境搭建和單表映射

 更新時間:2017年03月28日 09:48:25   作者:落葉的博客  
一說起對象關系映射框架,大家第一時間想到的肯定是Hibernate。Hibernate作為一個著名的框架,功能十分強大。但是由于Hibernate如此強大的功能,導致了它的缺點。好吧,不多說了,具體詳情大家通過本文一起學習吧

一.MyBatis簡介

    一說起對象關系映射框架,大家第一時間想到的肯定是Hibernate。Hibernate作為一個著名的框架,功能十分強大。我們只需要配置好實體類和數據表之間的關系,Hibernate就會自動幫我們完成生成并執(zhí)行SQL語句,映射結果集這樣的工作。但是也正是由于Hibernate如此強大的功能,導致了它的缺點:一是非常笨重,啟動Hibernate的SessionFactory非常耗時,開銷巨大;二是配置復雜,學習成本較高,系統(tǒng)調優(yōu)也不容易;三是自定義查詢功能較弱,查詢結果如果不是映射的實體類,查詢起來就比較麻煩。因此另一個ORM框架MyBatis,越來越流行。

    前面說到的幾個Hibernate的缺點,反過來正好就是MyBatis的優(yōu)點:一是非常輕量,系統(tǒng)開銷??;二是配置簡單,易于學習,官方文檔我直覺上感覺比Log4j2的文檔還少;三正好就是MyBatis的特點,映射查詢結果非常靈活。另外MyBatis還有一個優(yōu)點就是自帶中文文檔,可能有些地方感覺不太通順,但是完全足夠我們學習和使用了。

二.配置環(huán)境

1.依賴引入

    添加MyBatis最簡單的辦法就是使用Maven或Gradle這樣的構建工具。在這里我使用Gradle。在項目中添加如下幾行即可。如果確定不使用新的Java 8 時間API,那么第二行的依賴還可以去掉。這里我用的數據庫是MySQL,因此還需要添加MySQL的JDBC驅動。

compile group: 'org.mybatis', name: 'mybatis', version: '3.4.2'
  compile group: 'org.mybatis', name: 'mybatis-typehandlers-jsr310', version: '1.0.2'
  compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'

2.配置文件

    然后我們需要編寫MyBatis的配置和映射文件。所有這些配置文件最好放在類路徑上,對于Gradle項目來說就是src/main/resources文件夾下。我們先來編寫一個配置文件。配置文件每個部分的詳細作用請參見官方文檔,這里只簡單說明一下。

        屬性部分。在這里定義MyBatis需要的屬性,可以用在下面的多個地方。另外屬性也可以從外部properties文件中導入。

        系統(tǒng)設置。在這里指定MyBatis的全局配置。詳細的配置參加文檔。

        簡寫名。在映射文件中需要指定Java實體類的全名,我們可以在這里指定簡寫名簡化配置。

        環(huán)境。在這里我們要指定數據庫連接、事務管理器等配置。還可以指定測試環(huán)境、生產環(huán)境等多個環(huán)境對應不同的數據庫配置。

        映射文件。在這里指定映射文件,或者也可以添加使用注解配置的類。

  <?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>
    <!--指定屬性-->
    <properties>
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/test"/>
      <property name="username" value="root"/>
      <property name="password" value="12345678"/>
      <property name="driver.useSSL" value="false"/>
    </properties>
    <!--系統(tǒng)設置-->
    <settings>
      <setting name="cacheEnabled" value="true"/>
      <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    <!--指定簡寫名-->
    <typeAliases>
      <package name="yitian.study.entity"/>
    </typeAliases>
    <!--配置環(huán)境,可以配置多個環(huán)境用于測試、調試和生產-->
    <environments default="development">
      <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
          <property name="driver" value="${driver}"/>
          <property name="url" value="${url}"/>
          <property name="username" value="${username}"/>
          <property name="password" value="${password}"/>
        </dataSource>
      </environment>
    </environments>
    <!--配置映射文件-->
    <mappers>
      <mapper resource="BaseEntityMapper.xml"/>
    </mappers>
  </configuration>

3.創(chuàng)建SqlSessionFactory

    有了配置文件,我們就可以開始使用MyBatis了。首先要做的事情是創(chuàng)建MyBatis的SqlSessionFactory,它和Hibernate的SessionFactory類似,是主要的工廠類,一個應用程序中只需要創(chuàng)建一個即可。
    下面是一個工具類,用雙檢鎖簡單的實現了一個線程安全的工具類。核心代碼在最內層的if判斷中。由于配置文件在類路徑上,所以我們只需要指定文件名即可。這里用到了MyBatis提供的Resources工具類,創(chuàng)建一個輸入流,然后交給SqlSessionFactoryBuilder來創(chuàng)建一個SqlSessionFactory。

 public abstract class MyBatisUtils {
    private static volatile SqlSessionFactory sqlSessionFactory;
    public static final String MyBatisConfigLocation = "configuration.xml";
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
      if (sqlSessionFactory == null) {
        synchronized (MyBatisUtils.class) {
          if (sqlSessionFactory == null) {
            InputStream input = Resources.getResourceAsStream(MyBatisConfigLocation);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
            input.close();
          }
        }
      }
      return sqlSessionFactory;
    }
  }

    創(chuàng)建好SqlSessionFactory之后,我們就可以開始使用MyBatis了。這里先回過頭看看如何創(chuàng)建MyBatis映射文件。然后我們在繼續(xù)使用MyBatis。

三.單表映射

1.數據表和實體類

    在配置文件最后的mapper部分定義的就是映射文件。映射文件也是我們需要重點學習的地方。在映射文件中我們需要定義各種SQL語句,并建立它們和Java實體類之間的關系。這里我們使用最簡單的單表映射:數據表和實體類之間屬性名相同,一一對應。

    首先先來添加一個實體類。

 public class Person {
    private int id;
    private String username;
    private LocalDate birthday;
  }

    對應的數據庫表如下。

 CREATE TABLE person (
   id    INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(255) NOT NULL UNIQUE,
   birthday DATE
  );

2.映射文件

    然后我們來編寫映射文件。映射文件包含5條SQL語句,分別是增刪查改以及按名稱查找。每一條語句都需要一個標識符,將會在后面再代碼中用到。如果是查詢語句還需要resultType,指定返回類型。MyBatis會將數據表列明和這里指定的類型屬性按名稱自動映射起來。如果需要在語句中傳入參數,可以使用 parameterType屬性,指定Java實體類的全名或簡寫,然后就可以在SQL語句中使用#{}來訪問參數的屬性了。如果是簡單的映射,那么parameterType屬性還可以省略,MyBatis會自動從傳入的Java對象中獲取相應的屬性。對于某些數據庫(例如MySQL),還可以在插入的時候指定useGeneratedKeys="true",讓數據庫自動生成主鍵。

 <?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="yitian.study.dao.mapper">
    <select id="selectPerson"
        resultType="Person" parameterType="Person">
      SELECT *
      FROM Person
      WHERE id = #{id}
    </select>
    <select id="selectPersonByName"
        resultType="Person">
      SELECT *
      FROM Person
      WHERE username = #{username}
    </select>
    <insert id="insertPerson"
        useGeneratedKeys="true">
      INSERT INTO Person (username, birthday) VALUES (#{username}, #{birthday})
    </insert>
    <update id="updatePerson">
      UPDATE Person
      SET birthday = #{birthday}
      WHERE id = #{id}
    </update>
    <delete id="deletePerson">
      DELETE FROM Person
      WHERE id = #{id}
    </delete>
  </mapper>

四.使用MyBatis

    以上這些都配置好之后,我們就可以來使用MyBatis了。這里我們使用一個單元測試來查看MyBatis的功能。在創(chuàng)建SQLSessionFactory之后,我們需要獲取MyBatis最核心的對象SqlSession,所有操作都需要SqlSession來進行。另外它是非線程安全的對象,不能放在類的靜態(tài)字段上,最好也不要作為實例字段。我們要在需要的時候創(chuàng)建它,不用的時候及時釋放。
    常用的方法有增刪查改這幾個方法。這些方法的第一個參數是前面我們在映射文件中定義的語句ID,第二個參數是要傳入的參數。對于查詢來說有selectOne和selectList方法,它們的區(qū)別主要在于返回個數,如果確定只返回一個對象就使用selectOne方法。

 import static org.assertj.core.api.Assertions.*;
  public class MyBatisTest {
    private static SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;
    @BeforeClass
    public static void init() throws IOException {
      sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    }
    @Before
    public void before() {
      sqlSession = sqlSessionFactory.openSession(true);//自動提交
    }
    @After
    public void after() {
      sqlSession.close();
    }
    @Test
    public void testMyBatisUtils() {
      assertThat(sqlSessionFactory).isNotNull();
    }
    @Test
    public void testInsert() {
      Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
      sqlSession.insert("insertPerson", p);
      Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
      assertThat(s).isNotNull();
      System.out.println(s);
      sqlSession.delete("deletePerson", s);
    }
    @Test
    public void testUpdate() {
      Person p = new Person(1, "leo", LocalDate.of(1993, 5, 6));
      sqlSession.insert("insertPerson", p);
      p = sqlSession.selectOne("selectPersonByName", p.getUsername());
      LocalDate b = LocalDate.of(1987, 7, 8);
      p.setBirthday(b);
      sqlSession.update("updatePerson", p);
      Person s = sqlSession.selectOne("selectPersonByName", p.getUsername());
      assertThat(s.getBirthday()).isEqualTo(b);
      System.out.println(s);
      sqlSession.delete("deletePerson", s);
    }
  }

    另外默認情況下MyBatis的事務管理是開啟的,意味著我們必須顯式使用commit()方法才能提交事務。這里在打開SqlSession的時候指定了自動提交,這樣我們的所有更改都會立即反映到數據庫中。

五.使用映射類

    在前面的例子中,使用的都是字符串來指定要使用的查詢。但是這樣做非常不方便,字符串容易發(fā)生錯誤,而且無法獲得IDE的智能補全。所以MyBatis提供了另一種方式來執(zhí)行SQL語句,這就是使用映射類。
    映射類其實就是一個簡單的接口。該接口中的方法和映射文件中定義的語句一一對應。接口方法的名稱必須和語句id完全相同,接口方法的返回值和參數和相應的語句相對應。

public interface PersonMapper {
    Person selectPerson(int id);
    Person selectPersonByName(String name);
    void insertPerson(Person person);
    void updatePerson(Person person);
    void deletePerson(Person person);
  }

       僅僅增加映射類還不夠,我們需要修改映射文件,以便讓MyBatis能找到這個映射類。做法就是將映射文件的命名空間改為對應的映射文件的類名。

<mapper namespace="yitian.study.mapper.PersonMapper">

    映射類定義和配置好之后,我們就可以使用了。使用方法很簡單,在SqlSession上調用getMapper方法,并傳入要獲取的Mapper類即可。

 PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
  Person p = new Person(0, "yitian", LocalDate.of(1993, 5, 6));
  mapper.insertPerson(p);
  Person s = mapper.selectPersonByName(p.getUsername());
  assertThat(s).isNotNull();
  System.out.println(s);
  mapper.deletePerson(p);

    有了映射對象,我們就可以以類型安全的方式來存取對象了,同時還可以獲得IDE的補全功能。

以上所述是小編給大家介紹的MyBatis快速入門之環(huán)境搭建和單表映射,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • java代碼抓取網頁郵箱的實現方法

    java代碼抓取網頁郵箱的實現方法

    下面小編就為大家?guī)硪黄猨ava代碼抓取網頁郵箱的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Intellij IDEA 關閉和開啟自動更新的提示?

    Intellij IDEA 關閉和開啟自動更新的提示?

    這篇文章主要介紹了Intellij IDEA 關閉和開啟自動更新的提示操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 基于@RequestBody注解只能注入對象和map的解決

    基于@RequestBody注解只能注入對象和map的解決

    這篇文章主要介紹了@RequestBody注解只能注入對象和map的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringCloud?微服務數據權限控制的實現

    SpringCloud?微服務數據權限控制的實現

    這篇文章主要介紹的是權限控制的數據權限層面,意思是控制可訪問數據資源的數量,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • springboot集成Mybatis的詳細教程

    springboot集成Mybatis的詳細教程

    今天給大家?guī)淼倪€是關于springboot的相關知識,文章圍繞著springboot集成Mybatis的詳細教程展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 阿里dubbo出錯提示Thread pool is EXHAUSTED問題及解決方法

    阿里dubbo出錯提示Thread pool is EXHAUSTED問題及解決方法

    這篇文章主要介紹了阿里dubbo出錯提示Thread pool is EXHAUSTED的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java實戰(zhàn)之利用POI生成Excel圖表

    Java實戰(zhàn)之利用POI生成Excel圖表

    Apache POI是Java生態(tài)中處理Office文檔的核心工具,這篇文章主要為大家詳細介紹了如何在Excel中創(chuàng)建折線圖,柱狀圖,餅圖等常見圖表,需要的可以參考下
    2025-02-02
  • JMeter配置元件詳解

    JMeter配置元件詳解

    JMeter提供了豐富的配置元件,常用的包括參數化配置元件、HTTP請求默認值、HTTP信息頭管理器、計數器等,本文就詳細的介紹一下這些元件的使用,感興趣的可以了解一下
    2021-12-12
  • Java動態(tài)初始化數組,元素默認值規(guī)則詳解

    Java動態(tài)初始化數組,元素默認值規(guī)則詳解

    動態(tài)初始化數組涉及先定義數組長度,后填充具體數據,適用于數據量已知但具體值未定的情況,這種初始化方式允許程序運行過程中賦值,并會根據數據類型設定默認值,如整型為0,字符串為null,動態(tài)初始化與靜態(tài)初始化格式不能混用
    2024-10-10
  • JAVA 線程通信相關知識匯總

    JAVA 線程通信相關知識匯總

    這篇文章主要介紹了JAVA 線程通信相關知識,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06

最新評論

平塘县| 子长县| 思茅市| 仙桃市| 台东县| 鄂尔多斯市| 汶上县| 辽中县| 崇文区| 关岭| 南澳县| 开鲁县| 定日县| 乌拉特前旗| 余庆县| 建昌县| 蒲江县| 乌拉特前旗| 巴塘县| 巍山| 托克逊县| 渭源县| 禹城市| 龙门县| 循化| 仙桃市| 根河市| 临清市| 北票市| 佳木斯市| 萨嘎县| 江津市| 绿春县| 田林县| 贺兰县| 开原市| 长乐市| 宜春市| 宁远县| 凌海市| 云浮市|