国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MyBatis快速入門(一) 搭建環境和單表映射

2019-11-08 01:35:12
字體:
來源:轉載
供稿:網友

MyBatis簡介

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

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

配置環境

依賴引入

添加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'

配置文件

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

屬性部分。在這里定義MyBatis需要的屬性,可以用在下面的多個地方。另外屬性也可以從外部PRoperties文件中導入。系統設置。在這里指定MyBatis的全局配置。詳細的配置參加文檔。簡寫名。在映射文件中需要指定Java實體類的全名,我們可以在這里指定簡寫名簡化配置。環境。在這里我們要指定數據庫連接、事務管理器等配置。還可以指定測試環境、生產環境等多個環境對應不同的數據庫配置。映射文件。在這里指定映射文件,或者也可以添加使用注解配置的類。<?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> <!--系統設置--> <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> </settings> <!--指定簡寫名--> <typeAliases> <package name="yitian.study.entity"/> </typeAliases> <!--配置環境,可以配置多個環境用于測試、調試和生產--> <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>

創建SqlSessionFactory

有了配置文件,我們就可以開始使用MyBatis了。首先要做的事情是創建MyBatis的SqlSessionFactory,它和Hibernate的SessionFactory類似,是主要的工廠類,一個應用程序中只需要創建一個即可。

下面是一個工具類,用雙檢鎖簡單的實現了一個線程安全的工具類。核心代碼在最內層的if判斷中。由于配置文件在類路徑上,所以我們只需要指定文件名即可。這里用到了MyBatis提供的Resources工具類,創建一個輸入流,然后交給SqlSessionFactoryBuilder來創建一個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; }}

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

單表映射

數據表和實體類

在配置文件最后的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);

映射文件

然后我們來編寫映射文件。映射文件包含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的功能。在創建SQLSessionFactory之后,我們需要獲取MyBatis最核心的對象SqlSession,所有操作都需要SqlSession來進行。另外它是非線程安全的對象,不能放在類的靜態字段上,最好也不要作為實例字段。我們要在需要的時候創建它,不用的時候及時釋放。

常用的方法有增刪查改這幾個方法。這些方法的第一個參數是前面我們在映射文件中定義的語句ID,第二個參數是要傳入的參數。對于查詢來說有selectOne和selectList方法,它們的區別主要在于返回個數,如果確定只返回一個對象就使用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的時候指定了自動提交,這樣我們的所有更改都會立即反映到數據庫中。

使用映射類

在前面的例子中,使用的都是字符串來指定要使用的查詢。但是這樣做非常不方便,字符串容易發生錯誤,而且無法獲得IDE的智能補全。所以MyBatis提供了另一種方式來執行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的補全功能。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岳普湖县| 孝感市| 宜川县| 六安市| 仁怀市| 玉田县| 东乡县| 武威市| 建平县| 通州区| 新干县| 拜城县| 莱西市| 营山县| 西乌| 准格尔旗| 夏河县| 安龙县| 柳林县| 两当县| 枝江市| 仁怀市| 山阳县| 博白县| 安西县| 手游| 盐亭县| 琼海市| 盐边县| 五寨县| 亚东县| 合江县| 普格县| 府谷县| 扶风县| 渝中区| 耒阳市| 若尔盖县| 泾源县| 北海市| 班戈县|