1. 程式人生 > >Mybatis學習系列(1) –– 入門簡介

Mybatis學習系列(1) –– 入門簡介

connector ring cti 行操作 底層 數據庫連接 lean lose style

MyBatis簡介

Mybatis是Apache的一個Java開開源項目,是一個支持動態Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。與JDBC相比:

  1. Mybatis通過參數映射方式,可以將參數靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(JDBC)
  2. Mybatis通過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)
  3. 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查詢user表
        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類可以通過加載資源文件,讀取數據源配置SqlNapConfig.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>
View Code

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>
View Code

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>
View Code

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();    
    }

}
View Code 技術分享圖片
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+ "]";
    }
}
View Code

6.運行測試用例

技術分享圖片

Mybatis學習系列(1) –– 入門簡介