MyBatis簡介
Mybatis是Apache的一個Java開源項目,是一個支持動態Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。與JDBC相比:
- Mybatis通過參數映射方式,可以將參數靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(JDBC)
- Mybatis通過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)
- Mybatis可以通過Xml配置文件對數據庫連接進行管理。
MyBatis整體架構及運行流程
Mybatis整體構造由 數據源配置文件、Sql映射文件、會話工廠、會話、執行器和底層封裝對象組成。
1.數據源配置文件
通過配置的方式將數據庫的配置信息從應用程序中獨立出來,由獨立的模塊管理和配置。Mybatis的數據源配置文件包含數據庫驅動、數據庫連接地址、用戶名密碼、事務管理等,還可以配置連接池的連接數、空閑時間等。
一個SqlMapConfig.xml基本的配置信息如下:
<configuration> <!-- 加載數據庫屬性文件 --> <properties resource="db.properties"></properties> <environments default="development"> <environment id="development"> <!--使用JDBC實務管理--> <transactionManager type="JDBC"></transactionManager> <!--連接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> </configuration>
2.Sql映射文件
Mybatis中所有數據庫的操作都會基於該映射文件和配置的sql語句,在這個配置文件中可以配置任何類型的sql語句。框架會根據配置文件中的參數配置,完成對sql語句以及輸入輸出參數的映射配置。
Mapper.xml配置文件大致如下:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.sl.dao.ProductDao"> <!-- 根據id查詢product表 resultType:返回值類型,一條數據庫記錄也就對應實體類的一個對象 parameterType:參數類型,也就是查詢條件的類型 --> <select id="selectProductById" resultType="com.sl.po.Product" parameterType="int"> <!-- 這里和普通的sql 查詢語句差不多,對於只有一個參數,后面的 #{id}表示占位符,里面不一定要寫id,寫啥都可以,但是不要空着,如果有多個參數則必須寫pojo類里面的屬性 --> select * from products where id = #{id} </select> </mapper>
3.會話工廠與會話
Mybatis中會話工廠SqlSessionFactory類可以通過加載資源文件,讀取數據源配置SqlMapConfig.xml信息,從而產生一種可以與數據庫交互的會話實例SqlSession,會話實例SqlSession根據Mapper.xml文件中配置的sql,對數據庫進行操作。
4.運行流程
會話工廠SqlSessionFactory通過加載資源文件獲取SqlMapConfig.xml配置文件信息,然后生成可以與數據庫交互的會話實例SqlSession。會話實例可以根據Mapper配置文件中的Sql配置去執行相應的增刪改查操作。在SqlSession會話實例內部,通過執行器Executor對數據庫進行操作,Executor依靠封裝對象Mappered Statement,它分裝了從mapper.xml文件中讀取的信息(sql語句,參數,結果集類型)。Mybatis通過執行器與Mappered Statement的結合實現與數據庫的交互。
執行流程圖:
測試工程搭建
1. 新建maven工程
2. 添加依賴pom.xml

<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.sl</groupId> <artifactId>mybatis-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <junit.version>4.12</junit.version> <mybatis.version>3.4.1</mybatis.version> <mysql.version>5.1.32</mysql.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <!-- <scope>test</scope> --> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 日志處理 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> </project>
3.編寫數據源配置文件SqlMapConfig.xml

<?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 resource="db.properties"></properties> <environments default="development"> <!-- id屬性必須和上面的defaut一致 --> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <!--dataSource 元素使用標准的 JDBC 數據源接口來配置 JDBC 連接對象源 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!—申明mapper文件 --> <mappers> <!-- xml實現 注冊productMapper.xml文件 --> <mapper resource="mapper/productMapper.xml"></mapper> </mappers> </configuration>
4.編寫SQL映射配置文件productMapper.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.sl.mapper.ProductMapper"> <select id="selectAllProduct" resultType="com.sl.po.Product"> select * from products </select> </mapper>
5.編寫測試代碼TestClient.java

//使用productMapper.xml配置文件 public class TestClient { //定義會話SqlSession SqlSession session =null; @Before public void init() throws IOException { //定義mabatis全局配置文件 String resource = "SqlMapConfig.xml"; //加載mybatis全局配置文件 //InputStream inputStream = TestClient.class.getClassLoader().getResourceAsStream(resource); InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(inputStream); //根據sqlSessionFactory產生會話sqlsession session = factory.openSession(); } //查詢所有user表所有數據 @Test public void testSelectAllUser() { String statement = "com.sl.mapper.ProductMapper.selectAllProduct"; List<Product> listProduct =session.selectList(statement); for(Product product:listProduct) { System.out.println(product); } //關閉會話 session.close(); } }

public class Product { private int Id; private String Name; private String Description; private BigDecimal UnitPrice; private String ImageUrl; private Boolean IsNew; public int getId() { return Id; } public void setId(int id) { this.Id = id; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } public String getDescription() { return Description; } public void setDescription(String description) { this.Description = description; } public BigDecimal getUnitPrice() { return UnitPrice; } public void setUnitPrice(BigDecimal unitprice) { this.UnitPrice = unitprice; } public String getImageUrl() { return Name; } public void setImageUrl(String imageurl) { this.ImageUrl = imageurl; } public boolean getIsNew() { return IsNew; } public void setIsNew(boolean isnew) { this.IsNew = isnew; } @Override public String toString() { return "Product [id=" + Id + ", Name=" + Name + ", Description=" + Description + ", UnitPrice=" + UnitPrice + ", ImageUrl=" + ImageUrl + ", IsNew=" + IsNew+ "]"; } }
6.運行測試用例