Mybatis 3学习笔记(一)
主要內容:
- What is MyBatis?
- Why MyBatis?
- Installing and configuring MyBatis
- Sample domain model
What is MyBaits?
MyBatis是一個開源持久化框架,用于簡化持久層的實現。Mybatis可以減少很多JDBC相關的模板樣式代碼,還提供了方便使用的數據庫API。
MyBatis發展自iBATIS,但是MyBatis 3對iBATIS進行了徹底的重構,從而可以使用注解(annotations)和映射器(Mappers)。
簡潔的設計和易用性使得MaBatis在J2EE開發中很快流行起來。在Java應用中,持久層的工作包括:將SQL語句從數據庫中查詢出的數據填充進Java對象中、使用SQL語句將Java對象中的數據保存進數據庫。
MyBatis提供了下列特性來簡化SQL查詢:(1)抽象底層的JDBC代碼;(2)自動將SQL查詢的結果集保存進對應的Java對象;(3)從Java對象中提取數據并存入數據庫中對應的表。
Why MyBatis?
企業級應用開發領域有很多持久化開發框架,MyBatis能夠脫穎而出的原因在于:
- 減少了很多JDBC的模板樣式代碼;
- 學習曲線低;
- 可以很好地適配遺留數據庫;
- 開發者需要自己寫SQL語句;
- 可以和Spring、Guice等框架整合使用;
- 支持第三方緩存庫;
- 具備良好的性能。
減少JDBC的模板樣式代碼
關于JDBC代碼的冗長,可以參考Spring實戰6-利用Spring和JDBC訪問數據庫一文中用過的例子。
直接使用JDBC的API,會有很多重復代碼:創建連接、創建statement、設置輸入參數,最后還需要關閉資源。MyBatis將這些通用功能抽象出來單獨完成,以便開發者可以專注于真正重要的事情,包括書寫SQL語句、構建Java對象等。
除了這些,MyBatis可以自動完成兩個工作:把Java對象中的屬性設置進SQL字符串的查詢參數、利用SQL查詢結果集的數據構造Java對象。實現方法如下:
可以看出,如果使用MyBatis框架,開發者不需要自己管理資源和處理異常,因為MyBatis會替你完成這些工作。除此之外,MyBatis還提供了其他特性,也可以簡化持久層的實現:
- 支持復雜SQL結果集到復雜對象的映射;
- 支持1-1和1-n映射,將結果集中的數據映射到Java對象中;
- 支持基于輸入數據構建動態SQL查詢。
學習曲線低
MyBatis的學習曲線很低,如果開發者之前熟悉Java和SQL開發,則只需要稍作學習就可以在項目中使用MyBatis。
可以很好地適配遺留數據庫
有時候,我們需要使用不規范的遺留數據庫。在維護老服務時經常遇到這種情況,使用類似Hibernate的ORM框架會非常麻煩,因為這類框架試圖將Java對象映射到數據庫中的表格里。
MyBatis可以自動將查詢結果映射到Java對象中,這個特性使得MyBatis非常適合使用遺留數據庫。
擁抱SQL語句
完全的ORM框架,例如Hibernate鼓勵開發者直接使用實體對象,而由框架自動產生SQL語句。正因如此,導致開發者不能使用特定數據庫的優化特性。Hibernate也允許開發者寫SQL語句,但這又違背了“持久層應該與數據庫獨立”的承諾。
MyBatis讓開發者自己寫SQL語句,因此可以利用特定數據庫的優化特性,例如支持使用數據庫存儲過程。
支持使用第三方緩存庫
MyBatis本身支持在SqlSession層面緩存SELECT查詢結果。除此之外,MyBatis也支持使用其他第三方緩存,例如EHCache、OSCache和Hazelcast。
更好的性能
大型企業級應用必須具備良好的性能。在性能分析時,一般使用調用鏈路分析法:業務操作、緩存操作和持久層。持久層的性能經常會成為應用的性能瓶頸。
- MyBatis支持使用數據庫連接池,從而避免為每個查詢請求創建數據庫連接;
- MyBatis擁有內置的緩存機制,可以在SqlSession層面緩存SQL查詢的結果——如果你在執行一個select查詢之后不久又再次遇到同樣的請求,則直接返回緩存區中的數據,從而節省一次數據庫查詢。
- MyBatis并沒有大量使用代理,因此比其他大量使用代理的ORM框架有更好的性能。
注意:在軟件開發中沒有萬能的工具。每個應用場景都有不同的需求,我們應該根據具體的應用場景選擇要使用的語言和框架。上文中講了很多MyBatis的優勢,不過,也有一些情況下并不適合使用MyBatis。如果應用是基于對象模型驅動并想動態生成SQL語句;另外,如果開發者希望在應用中使用透明的事務處理機制(持久化父對象的同時也持久化與之關聯的子對象),這兩種情況下都比較適合使用Hibernate。
安裝和配置MyBatis
在數據庫中創建students表,并插入例子數據;
create table students ( stud_id int(11) not null auto_increment, name varchar(50) not null, email varchar(50) not null, dob date default null, primary key (stud_id) ) engine=InnoDB auto_increment=1 default charset=latin1; insert into students(stud_id, name, email, dob) values(1, 'Student1', 'student1@gmail.com', '1983-06-25'); insert into students(stud_id, name, email, dob) values(2, 'Student2', 'student2@gmail.com', '1983-06-25');創建一個maven項目,配置jar依賴項,pom文件的內容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javadu</groupId><artifactId>leanMybatis</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>io.spring.platform</groupId><artifactId>platform-bom</artifactId><version>2.0.1.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>4.2.4.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version><scope>runtime</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.13</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies> </project>然后,在resources目錄下創建log4j.properties文件,填入如下內容:
log4j.rootLogger = DEBUG, stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d[%-5p] %c - %m%n創建mybatis-config.xml和StudentMapper.xml配置文件,mybatis-config.xml作為MyBatis的主配置文件,用于定義數據庫連接、類型別名等等;StudentMapper.xml配置文件包含操作students表的SQL語句。
-
首先,mybatis-config.xml文件的內容列舉如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org/DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases><typeAlias type="com.javadu.domain.Student" alias="Student" /> </typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/mybatis" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment> </environments><mappers><mapper resource="mybatis/mappers/StudentMapper.xml" /> </mappers> </configuration> -
然后,StudentMapper.xml文件的內容列舉如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org/DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mybatis.mappers.StudentMapper"> <resultMap id="studentResult" type="Student"><id property="studId" column="sutd_id" /><result property="name" column="name" /><result property="email" column="email" /><result property="dob" column="dob" /> </resultMap><select id="findAllStudents" resultMap="studentResult">SELECT * FROM students </select><select id="findStudentById" parameterType="int" resultType="Student">SELECT stud_id as studid, name, email, dobFROM studentsWHERE stud_id=#{id} </select><insert id="insertStudent" parameterType="Student">INSERT INTO students(stud_id, name, email, dob)VALUES (#{studId}, #{name}, #{email}, #{dob}) </insert> </mapper>
總結
以上是生活随笔為你收集整理的Mybatis 3学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thinkphp几个表的数据合并,并用数
- 下一篇: 多线程之:用户态和内核态的区别