Mybatis框架入門

Mybatis官網:http://www.mybatis.org/mybatis-3/

Mybatis的介紹

Mybatis是一個操作數據庫的框架。最開始叫做ibatis,從apache基金會脫離,加入googleCode正式更名爲MyBatis。最終現在mybatis的代碼託管在github

這裏寫圖片描述

mybatis架構介紹

mybatis架構

1、 mybatis配置SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

2、 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

3、 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

4、 mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。

5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。

6、 Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement 設置參數

7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。



入門小demo

  • 依賴的jar包
<dependencies>
    <!-- mysql -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>

    <!-- mybatis 包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.7</version>
        </dependency>
  </dependencies>
  • 定義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>
    <!-- 連接數據庫操作 -->
      <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://192.168.52.250:3306/mybatis?characterEncoding=utf-8"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
          </dataSource>
        </environment>
      </environments>
      <!-- 加載對應的mapper文件 -->
          <mappers>
            <mapper resource="mapper.xml"/>
          </mappers>
</configuration>
  • 定義mapper.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="test">
    <select id="selectBlog" resultType="Blog">
     select * from blog where id = #{id}
    </select>
</mapper>
  • 測試代碼
    public class MyBatisDemo1 {
        SqlSessionFactoryBuilder builder = null;
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession sqlSession =  null;

        @Before
        public void init() throws IOException{
             builder = new SqlSessionFactoryBuilder();
            //通過Reources來獲取配置文件
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
             sqlSessionFactory = builder.build(resourceAsStream);
             sqlSession = sqlSessionFactory.openSession();
        }
        @Test
        public void testMybatis() throws Exception {
            User selectOne = sqlSession.selectOne("selectBlog", 1);
            String username = selectOne.getUsername();
            System.out.println(username);
            //關閉sqlSession
            sqlSession.close();
        }
        @After
        public void after(){
            sqlSession.close();
        }
    }


總結

  • parameterType和resultType
parameterType:指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。
resultType:指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射爲resultType指定類型的對象。
  • #{}和${}
#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
“%”#{name}”%”
${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。
  • selectOne和selectList
selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

selectList可以查詢一條或多條記錄。
  • resultMap

    resultType可以指定pojo將查詢結果映射爲pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
    如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關係 ,resultMap實質上還需要將查詢結果映射到pojo對象中。

    resultMap可以實現將查詢結果映射爲複雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。

這裏寫圖片描述

id :此屬性表示查詢結果集的唯一標識,非常重要。如果是多個字段爲複合唯一約束則定義多個id 。
Property:表示Orders類的屬性。
Column:表示sql查詢出來的字段名。
Column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性(set方法)上。
result:查詢結果的普通列映射關係。


自增主鍵返回

<selectKey keyProperty="id" resultType="java.lang.Integer" order="AFTER">
            select last_insert_id();
</selectKey>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章