Mybatis入門

入門

安裝

如果使用 Maven 來構建項目,則需將下面的 dependency 代碼置於 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

配置文件

XML 配置文件(configuration XML)中包含了對 MyBatis 系統的核心設置,包含獲取數據庫連接實例的數據源(DataSource)和決定事務範圍和控制方式的事務管理器(TransactionManager)
示例(mybatisConfig.xml):

<!--文檔類型聲明,表明這是mybatis的配置文件-->
<?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">
      <!--事務管理器,type可選爲JDBC/MANAGED -->
      <transactionManager type="JDBC"/>
      <!--type爲數據源類型,可選爲POOLED/UNPOOLED/JNDI-->
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!--映射器,告訴mybatis去哪找映射文件,resource的值是XML映射文件的路徑-->
  <mappers>
    <mapper resource="com/ncusoft/mybatisdemos/mapper/UserMapper.xml"/>
  </mappers>
</configuration>

關於更多配置及用法,詳見官方文檔(翻譯中文版的)XML映射配置文件

Mapper映射器

創建一個user表

CREATE TABLE `users` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `sex` char(2) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

創建一個實體類Users

public class Users {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    // 這裏省略了Getter/Setter方法
    @Override
    public String toString() {
        return super.toString() + "users = " + this.id + " | "+ this.username + " | "
                + this.birthday + " | " + this.sex + " | " + this.address;
    }
}

寫一個接口來描述方法的接口

最後SQL語句的執行也是通過調用這個方法,再通過代理執行。

package com.ncusoft.mybatisdemos.mapper;
public interface UserMapper {
    /**
     * 根據用戶id獲取數據
     * @param id 用戶id
     * @return Users
     */
    Users findById(Integer id);
}

編寫XML映射文件(UsersMapper.xml)

它能直接映射到剛剛定義的接口中的方法,並在XML中定義要執行的SQL語句(有個要注意的是,Mapper接口和XML映射文件的路徑一定要一模一樣,不然就無法映射了)。
更多詳細用法見Mapper XML 文件

<!--文檔類型聲明,表明這是mybatis的映射文件-->
<?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">
<!--namespace是對應mapper接口的全限定名-->
<mapper namespace="com.ncusoft.mybatisdemos.mapper.UsersMapper">
    <!--id是對應接口中定義的方法名,resultType是返回的類型,parameterType是參數的類型,裏面包含的內容就是要執行的SQL語句,這裏用到了OGNL表達式-->
    <!--這裏的#{id}其實是調用了Users類的getId()方法,具體見OGNL表達式-->
    <select id="findById" resultType="com.ncusoft.mybatisdemos.entity.Users" parameterType="Integer">
        select * from users where id = #{id}
    </select>
</mapper>

使用

執行流程:
image.png

下面是一個使用示例,把這個代碼放在測試代碼中執行。

// 從配置文件中獲取字節流(通過類加載器的方法) 配置文件應該放在項目資源的根路徑下
InputStream in = Resources.getResourceAsStream("mybatisConfig.xml");
// 創建一個工廠的構建器
SqlSessionFactoryBuilder bulider = new SqlSessionFactoryBuilder();
// 構建器通過傳入字節流來構建一個SqlSessionFactory,
SqlSessionFactory factory = bulider.build(in);
// 通過工廠來創建一個SqlSession實例
SqlSession session = factory.openSession();
// 通過SqlSession對象來獲取Mapper接口的代理對象,用來實現Mapper接口的操作
UserMapper userMapper = session.getMapper(UserMapper.class);
// 通過剛剛創建的代理對象來執行Mapper接口中的方法
Users users = userMapper.findById(1);
System.out.println(users);

來看一下執行的結果日誌並分析一下:

// 打開一個數據庫連接
16:35:24.478 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
// 連接池中沒有空閒連接,於是新建了一個連接
16:35:25.197 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1832532108.
// 由於factory.openSession()使用的是默認方法,所以autocommit的值將會被設置爲false,也就是關閉了數據庫的自動事務提交
16:35:25.197 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 要執行的語句,這裏使用了SQL預處理,用?做佔位符
16:35:25.204 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==>  Preparing: select * from users where id = ? 
// 傳入的參數, Integer類型的1
16:35:25.263 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - ==> Parameters: 1(Integer)
// 查詢到的結果總數爲1
16:35:25.348 [main] DEBUG com.ncusoft.mybatisdemos.mapper.UserMapper.findById - <==      Total: 1
// 打印查出來的結果
com.ncusoft.mybatisdemos.entity.Users@5ba3f27ausers = 1 | 小熊 | Mon Dec 16 08:00:00 GMT+08:00 2019 | 男 | 江西九江
// SQL操作完畢,將autocommit重置爲true
16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 關閉當前數據庫連接
16:35:25.382 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d3a388c]
// 連接空閒,則放回連接池中
16:35:25.383 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1832532108 to pool.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章