Mybatis 入門介紹

發表於2024-02-27

MyBatis

MyBatis是一個一流的持久化框架,支援自定義SQL、儲存過程和高階對映。

MyBatis幾乎消除了所有的JDBC程式碼,手動設定引數和檢索結果的步驟。

MyBatis可以使用簡單的XML或註解進行配置,將基本型別、Map介面和Java POJO(普通的Java物件)對映到資料庫記錄。

mybatis

mybatis doc

tools

簡單介紹

MyBatis(原名為iBatis)是一款Java持久層框架,它提供了一種簡單而靈活的方式來訪問資料庫。

MyBatis的目標是透過消除冗餘的JDBC程式碼,使開發人員能夠更專注於SQL語句和結果對映。

以下是一些關鍵的特點和概念,幫助你更好地理解MyBatis:

  1. SQL對映:MyBatis使用XML或註解方式將SQL語句與Java方法進行對映。在XML檔案中,你可以編寫SQL語句,並指定引數和結果的對映關係。
  2. 引數對映:MyBatis支援多種引數對映方式,包括位置引數、命名引數和自定義型別處理器。這使得你可以靈活地將Java物件作為引數傳遞給SQL語句。
  3. 結果對映:MyBatis可以將SQL查詢的結果對映為Java物件。你可以定義對映規則,將查詢結果中的列與Java物件的屬性進行對應。
  4. 動態SQL:MyBatis提供了強大的動態SQL功能,可以根據條件來動態地生成SQL語句。你可以使用條件判斷、迴圈和片段等功能來構建靈活的SQL語句。
  5. 事務支援:MyBatis可以管理資料庫事務,你可以透過配置檔案或程式設計方式來控制事務的提交和回滾。
  6. 外掛機制:MyBatis提供了外掛機制,可以透過自定義外掛來擴充套件框架的功能。你可以在SQL語句執行前後進行攔截和修改,實現日誌記錄、效能監控等功能。

使用MyBatis的流程通常包括以下步驟:

  1. 配置資料來源:在配置檔案中指定資料庫連線資訊,包括資料庫型別、URL、使用者名稱和密碼等。
  2. 定義SQL對映:使用XML檔案或註解方式定義SQL語句和引數、結果的對映關係。
  3. 編寫Java程式碼:編寫Java程式碼,呼叫MyBatis提供的API來執行SQL語句。你可以使用會話(SqlSession)來執行增刪改查操作。
  4. 執行SQL語句:透過呼叫相應的方法來執行SQL語句,並獲取結果。

MyBatis是一款功能強大而靈活的持久層框架,它能夠有效地簡化資料庫訪問的開發工作。

它已經在許多Java專案中得到廣泛應用,成為了Java開發人員的首選之一。

mybatis 與 hibernate 的對比表格

下面是MyBatis和Hibernate的對比表格,以便更好地理解它們之間的區別:

特性MyBatisHibernate
資料庫支援支援多種關係型資料庫支援多種關係型資料庫
SQL控制提供靈活的SQL控制,開發者手動編寫和管理SQL語句自動建立和管理SQL語句,更物件導向的方式
物件關係對映(ORM)較弱的ORM支援,需要手動處理物件和資料庫表之間的對映關係強大的ORM支援,自動處理物件和資料庫表之間的對映關係
儲存過程和函式支援提供良好的儲存過程和函式支援提供有限的儲存過程和函式支援
快取機制提供一級快取和二級快取提供一級快取和二級快取
查詢效能查詢效能較高,可以最佳化SQL語句查詢效能較低,Hibernate會自動生成複雜的查詢語句
靈活性更靈活,可以直接編寫SQL語句較少靈活,需要按照Hibernate的規範進行操作
學習曲線相對較低,容易上手相對較高,需要掌握更多的概念和API

需要注意的是,MyBatis和Hibernate都是優秀的持久層框架,每個框架在不同的場景和需求下有其適用性。

MyBatis更適合對SQL語句的控制要求較高的專案,而Hibernate則更適合那些希望透過ORM來簡化資料訪問的專案。

Hello World

  • mybatis.jar & mysql-connector-java.jar
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
  • MyBatisUtil.java
public class MyBatisUtil {
    private MyBatisUtil(){}
    private static SqlSessionFactory sqlSessionFactory = null;

    static {
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(
                    Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}
  • mybatis-config.xml & jdbc.properties
<?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="jdbc.properties" />

    <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="${user}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/ryo/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf8
user=root
password=
  • UserMapper.java & UserMapper.xml
public interface UserMapper {
    User selectUser(Long id);
}
<?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.ryo.mapper.UserMapper">

    <!--定義所有列,方便使用,一般應該避免使用*-->
    <sql id="columns"> id,username,password,createdOn</sql>

    <!--id 對應方法名稱-->
    <select id="selectUser" parameterType="java.lang.Long" resultType="com.ryo.domain.User">
        SELECT
        <include refid="columns"/>
        FROM User WHERE id = #{id}
    </select>
</mapper>
  • sql & domain
CREATE TABLE user (
  id        BIGINT(20) PRIMARY KEY AUTO_INCREMENT NOT NULL
  COMMENT '主鍵, 自增',
  username  VARCHAR(64)                           NOT NULL
  COMMENT '使用者名稱',
  password  VARCHAR(128)                          NOT NULL
  COMMENT '密碼',
  createdOn DATETIME                              NOT NULL
  COMMENT '建立時間',

  UNIQUE INDEX `username_UNIQUE` (`username`)
)
  COMMENT '使用者表';

INSERT INTO `user` (username, password, createdOn) VALUES (
  'ryo', '123456', '2016-07-28 14:32:30'
);
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private Date createdOn;

    //getter & setter

    //toString()
}
  • UserMapperTest.java & result
public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

    @Test
    public void testSelectUser() throws IOException {
        UserMapper userMapper = sqlSessionFactory.openSession().getMapper(UserMapper.class);
        System.out.println(userMapper.selectUser(1L));
    }
}
User{id=1, username='ryo', password='123456', createdOn=Thu Jul 28 14:32:30 CST 2016}

Process finished with exit code 0
本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章