1. 程式人生 > >MyBatis 筆記(一)——快速入門

MyBatis 筆記(一)——快速入門

簡介

MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。

入門

新增依賴

在使用 Mybatis 的時候,需要新增資料庫驅動包和 Mybatis 包,以 MySQL 為例,Maven 依賴:

<dependencies>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.4</version>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
      </dependency>
</dependencies>

MyBatis 配置檔案

使用 MyBatis 的時候需要一個 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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 基於XML配置檔案 -->
        <mapper resource="edu/wzm/mybatis/mapping/PersonMapper.xml"/>
    </mappers>
</configuration>

Mapping 對映檔案

在上一節 MyBatis 的配置檔案中,看到了一個 mapper 標籤,而它會指向一個對映檔案:

<?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,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的
  例如:namespace="edu.wzm.mybatis.mapping.PersonMapper"(userMapper.xml檔案去除字尾)
-->
<mapper namespace="edu.wzm.mybatis.mapping.PersonMapper">
  <!--
    在select、insert、update、delete標籤中編寫查詢的SQL語句, 設定標籤的id屬性值必須是唯一的,不能夠重複。使用parameterType屬性
    指明查詢時,使用的引數型別。resultType屬性指明查詢返回的結果集型別,resultType="edu.wzm.mybatis.domain.Person"就表示將查詢
    結果封裝成一個Person類的物件返回,Person類就是person表所對應的實體類。
  -->

  <insert id="insert" parameterType="edu.wzm.mybatis.domain.Person">
    insert into person(name, age) values(#{name}, #{age})
  </insert>

  <select id="getById" resultType="edu.wzm.mybatis.domain.Person">
    select *
    from person
    where id = #{id}
  </select>

  <select id="getAll" resultType="edu.wzm.mybatis.domain.Person">
    select * from person;
  </select>

  <update id="update" parameterType="edu.wzm.mybatis.domain.Person">
    update person set age = #{age} where id = #{id}
  </update>

  <delete id="delete" parameterType="int">
    delete from person where id = #{id}
  </delete>
</mapper>

使用到的資料庫表:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) DEFAULT '-1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

示例

在 Mapping 對映檔案中,可以看到引入了一個實體類 Person:

public class Person {

    private int id;
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person: [name=" + name + ", age=" + age + "]";
    }
}

在上述工作都完成的情況下,我們就可以編寫訪問資料庫的 CRUD 程式碼:

public class PersonServices {

    public void add(){
        Person person = new Person("Alice", 30);
        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
        /**
         * 對映sql的標識字串。
         * edu.wzm.mybatis.mapping.PersonMapper是PersonMapper.xml中mapper標籤的namespace屬性的值,
         * insert是insert標籤的id屬性值,通過update標籤的id屬性值就可以找到要執行的SQL。
         */
        int result = sqlSession.insert("edu.wzm.mybatis.mapping.PersonMapper.insert", person);

        System.out.println(result);
        sqlSession.close();
    }

    public void getAll(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        List<Person> persons = sqlSession.selectList("edu.wzm.mybatis.mapping.PersonMapper.getAll");

        System.out.println(persons);

        sqlSession.close();
    }

    public void getById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        Person person = sqlSession.selectOne("edu.wzm.mybatis.mapping.PersonMapper.getById", 1);

        System.out.println(person);

        sqlSession.close();
    }

    public void update(){
        Person person = new Person();
        person.setId(7);
        person.setAge(27);

        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
        int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.update", person);

        System.out.println(result);

        sqlSession.close();
    }

    public void delete(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession(true);
        int result = sqlSession.update("edu.wzm.mybatis.mapping.PersonMapper.delete", 6);
        System.out.println(result);

        sqlSession.close();
    }
}

之後,還要啟動 MyBatis 的 SQLSession 才能真正使用 MyBatis,下面是 MyBatis 的工具類:

public class MyBatisUtils {

    public static SqlSessionFactory getSqlSessionFactory(){
        InputStream is = MyBatisUtils.class.getClassLoader().getResourceAsStream(Const.MYBATIS_CONFIG_FILE);
        return new SqlSessionFactoryBuilder().build(is);
    }

    /**
     * @param autoCommit
     *      true: 表示建立的SqlSession物件在執行完SQL之後會自動提交事務
     *      false: 表示建立的SqlSession物件在執行完SQL之後不會自動提交事務,這時就需要我們手動呼叫sqlSession.commit()提交事務
     * @return
     */
    public static SqlSession getSqlSession(boolean autoCommit){
        return getSqlSessionFactory().openSession(autoCommit);
    }

    public static SqlSession getSqlSession(){
        return getSqlSessionFactory().openSession();
    }
}

測試程式碼:

public class Driver {

    public static void main(String[] args)throws Exception{
        PersonServices services = new PersonServices();
        services.getById();
        services.add();
        services.update();
        services.delete();
        services.getAll();
    }
}

參考文獻