IDEA 2020 MyBatis環境搭建及入門案例(使用xml方式和註解方式配置)

MyBatis入門

 

MyBatis環境搭建

使用IDEA搭建MyBatis環境

1.創建Maven工程並添加依賴

創建Maven工程
pom.xml中添加依賴:(log4j可以在控制檯輸出執行的sql語句,便於觀察)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13-beta-3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.創建實體類和dao的接口

注意包名,在src/main/java下創建包com.cjx.entity和com.cjx.dao

package com.cjx.entity;

import java.io.Serializable;
import java.util.Date;

/**
 * @author :
 * @date :Created in 2019/11/7 17:03
 * @description : user
 */
public class User implements Serializable {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.cjx.dao;

import com.cjx.entity.User;

import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/7 17:07
 * @description : dao
 */
public interface IUserDao {

    /**
     * @author      :
     * @description :查詢所有
     * @date        :Created in 2019/11/7
     */
    List<User> findAll();
}

3.創建MyBatis主配置文件:SqlMapConfig.xml

這裏要提前準備好一個數據庫,這裏取名爲eesy_mybatis,表名爲user,設計如下圖:
在這裏插入圖片描述
隨便往裏面添加一些數據。
在resources中創建文件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">
<!-- MyBatis的主配置文件 -->
<configuration>
    <!-- 配置環境 -->
    <environments default="mysql">
        <!-- 配置MySQL環境 -->
        <environment id="mysql">
            <!-- 配置事務類型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置數據源/連接池 -->
            <dataSource type="POOLED">
                <!-- 配置連接數據庫的4個基本信息  -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="1999"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射配置文件的位置 -->
    <mappers>
        <mapper resource="com/cjx/dao/IUserDao.xml"/>
    </mappers>
</configuration>

4.創建映射配置文件

在resources中創建目錄com.cjx.dao,然後創建文件IUserDao.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.cjx.dao.IUserDao">
    <!-- 配置查詢所有 -->
    <select id="findAll" resultType="com.cjx.entity.User">
        select * from user
    </select>
</mapper>

5.創建log4j的配置文件

與SqlMapConfig同級創建log4j.properties文件

log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.R.File=../logs/service.log
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug

搭建環境的注意事項

  1. 創建IUserDao.xml和IUserDao.java時名稱是爲了和以前的知識保持一致。在MyBatis中把持久層的操作接口名稱和映射文件也叫做Mapper。所以在其他項目中可能叫IUserMapper,到時候也要能看懂。
  2. 在idea中創建目錄時和包是不一樣的。包在創建是com.cjx.dao,這是一個三級的結構,而目錄com.cjx.dao,這是一個1級的目錄,目錄的名字就叫“com.cjx.dao”,創建目錄必須用斜槓,即com/cjx/dao,纔會創建三級目錄,在IDEA2019中會默認把目錄也摺疊成com.cjx.dao的形式,如果要創建一個service目錄,那麼就還在resources目錄下創建一個com/cjx/service,就可以正常創建。
    IDEA2019目錄結構

(此圖展示com/cjx/dao的情況下IDEA2019中會默認把目錄也摺疊成com.cjx.dao的形式)

  1. MyBatis的映射配置文件位置必須和dao接口的包結構相同,包在com.cjx.dao,那麼xml也必須在resources中的com/cjx/dao。
  2. 映射配置文件的mapper標籤的namespace屬性的取值必須是dao接口的全限定類名。
  3. 映射配置文件的操作配置(如select),id屬性的取值必須是dao接口的方法名,因爲查詢操作有返回值,所以必須指定一個返回的結果類型,屬性爲resultType,取值是返回值的類,這裏就是user。

當我們遵從了3、4、5點後,我們在開發中就無需再寫dao的實現類,剩下的功能會由MyBatis來實現。
 

MyBatis入門案例

創建測試函數實現數據庫查詢

在test/java中創建包com.cjx.test,創建類MybatisTest,在類中創建Main函數,主要有以下幾步:

  1. 讀取配置文件
  2. 創建SqlSessionFactory工廠
  3. 使用工廠生產一個SqlSession對象
  4. 使用SqlSession創建dao接口的代理對象
  5. 使用代理對象執行方法
  6. 釋放資源

代碼如下:

package com.cjx.test;

import com.cjx.dao.IUserDao;
import com.cjx.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/8 10:12
 * @description : 入門案例
 */
public class MybatisTest {
    /**
     * @author      :
     * @description :入門案例
     * @param       : [args]
     * @return      : void
     * @date        :Created in 2019/11/8
     */
    public static void main(String[] args) throws Exception {
        //1.讀取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.創建SqlSessionFactory工廠
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工廠生產一個SqlSession對象
        SqlSession session = factory.openSession();
        //4.使用SqlSession創建dao接口的代理對象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理對象執行方法
        List<User> users = userDao.findAll();
        for (User user :
                users) {
            System.out.println(user);
        }
        //6.釋放資源
        session.close();
        in.close();
    }
}

點擊運行後可能出現的一些問題

不支持發行版本 5

這是因爲Maven默認的Java版本是1.5,而大部分人裝的都是新的版本。解決方法如下:

  1. File->Settings->Build,Excution,Deployment->Compiler->Java Compiler中設置target bytecode version爲13(我的是13,其他人可能是1.8)在這裏插入圖片描述
  2. 在pom.xml中與<dependencies>同級的配置中加入
    <properties>
       <java.version>13</java.version>
       <maven.compiler.source>13</maven.compiler.source>
       <maven.compiler.target>13</maven.compiler.target>
   </properties>
  1. File->Project Structure->Project Settings->Project中修改兩處Project SDK
    在這裏插入圖片描述
  2. Modules中也修改一處Language Level
    在這裏插入圖片描述

訪問數據庫時可能出現的時區問題

解決方法:在數據庫鏈接後面加上時區參數"?serverTimezone=UTC",即修改SqlMapConfig.xml文件中的這一句

        <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>

使用註解方式重新運行此項目

使用註解方式就可以刪除掉映射配置文件,使用註解來代替,使項目更加簡潔。

1.在dao接口中添加註解指定sql語句

在創建dao接口時,在findAll方法上加註解@Select(“select * from user”)即可取代映射配置文件。代碼如下:

package com.cjx.dao;

import com.cjx.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author :
 * @date :Created in 2019/11/7 17:07
 * @description : dao
 */
public interface IUserDao {

    /**
     * @author      :
     * @description :查詢所有
     * @date        :Created in 2019/11/7
     */
    @Select("select * from user")
    List<User> findAll();
}

2.在主配置文件中配置mapper

在SqlMapConfig.xml中,配置mapper時使用class屬性指定dao接口的全限定類名,代碼如下:(主要是最後幾行發生了變化),配置完成後就可以把resources下的com.cjx.dao.IUserDao.xml文件刪掉,因爲註解可以完全取代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">
<!-- MyBatis的主配置文件 -->
<configuration>
    <!-- 配置環境 -->
    <environments default="mysql">
        <!-- 配置MySQL環境 -->
        <environment id="mysql">
            <!-- 配置事務類型 -->
            <transactionManager type="JDBC"/>
            <!-- 配置數據源/連接池 -->
            <dataSource type="POOLED">
                <!-- 配置連接數據庫的4個基本信息  -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1999"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 使用xml方式配置時這裏指定映射配置文件的位置,但是本次使用註解配置,應該使用class屬性指定被註解的dao全限定類名 -->
    <mappers>
        <mapper class="com.cjx.dao.IUserDao"/>
    </mappers>
</configuration>

刪除IUserDao.xml後再次點擊運行,仍然可以成功運行。

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