天天看點

MyBatis學習總結 11 Mybatis簡介2 入門

Mybatis 學習總結 1

  • 1 Mybatis簡介
  • 2 入門
      • 2.1 環境搭建:
      • 2.2 配置檔案mybatis-config.xml 檔案
      • 2.3 SqlSessionFactory的建構
          • 1. SqlSessionFactory對象:
          • 2. SqlSessionFactory執行個體化
          • 3. SqlSession對象
          • 4. SqlSession對象執行個體化
      • 2.4 持久層的mapper檔案以及javaBean
      • 2.5 使用mybatis對資料庫執行CRUD操作

1 Mybatis簡介

官網: http://www.mybatis.org/

github:https://github.com/mybatis/mybatis-3

MyBatis的持久化解決方案是将使用者從原始的JDBC通路中解放出來,使用者隻需要定義需要操作的SQL語句,無須關注底層的JDBC操作,就可以以面向對象的方式來進行持久化層操作.底層資料庫連接配接的擷取,資料通路的實作,事務控制等都無須使用者關心,進而将應用層從底層的JDBC/JTA API抽取出來.通過配置檔案管理JDBC連接配接,讓MyBatis解決持久化的實作.

1.支援普通SQL查詢,存儲過程和進階映射的 持久層架構。

2.消除了幾乎所有的JDBC代碼和參數的手工設定以及對結果集的檢索封裝

3.使用簡單的XML或注解用于配置和原始映射

2 入門

2.1 環境搭建:

1 JDK - JRE 安裝

2 開發工具 – Eclipse Idea 等

3 建立一個普通java項目 或者 java web 項目

MyBatis學習總結 11 Mybatis簡介2 入門

4 引入jar包

  • mybatis

    mybatis-3.4.6.jar

  • 對應的資料庫驅動包

    mysql-connector-java-8.0.11.jar

    MyBatis學習總結 11 Mybatis簡介2 入門
    如果使用Maven建構項目,在pom.xml檔案中添加如下依賴
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
           

mybatis的入門學習中,配置檔案config.xml 檔案 和 SqlSession是兩個關鍵的學習内容。

2.2 配置檔案mybatis-config.xml 檔案

mybatis支援使用xml配置的方法,對持久層連接配接對象資訊進行配置,以及映射的注冊。

代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- DTD 文檔類型定義(Document Type Definition)
xml支援自定義标簽,是以文檔格式沒有一個統一的标準,通過dtd檔案來規範标簽使用
mybatis 的配置xml檔案的 dtd檔案為:http://mybatis.1org/dtd/mybatis-3-config.dtd-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--配置标簽-->
<!--"configuration" 的内容必須比對,即标簽前後順序需按照如下順序
 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"-->
<configuration>

    <!--引入外部properties檔案-->
    <properties resource="jdbc.properties" />
    <!--設定集标簽-->
    <settings>
        <!--設定标簽 === 駝峰轉換-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--環境集标簽-->
    <environments default="development" >
        <!--環境标簽-->
        <environment id="development">
            <!--調用JDBC的事務管理-->
            <transactionManager type="JDBC"/>
            <!-- 配置資料庫連接配接資訊 -->
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.jdbc.driverClass}" />
                <property name="url" value="${mysql.jdbc.url}" />
                <property name="username" value="${mysql.jdbc.username}" />
                <property name="password" value="${mysql.jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!--映射注冊-->
    <mappers>
        <mapper resource="mapping/UserMapper.xml" />
    </mappers>
</configuration>
           

jdbc.properties檔案

# mysql Driver
mysql.jdbc.driverClass=com.mysql.cj.jdbc.Driver
# mysql db connection url
mysql.jdbc.url=jdbc:mysql://localhost:3306/kern?useSSL=true&serverTimezone=UTC
# mysql db connection username
mysql.jdbc.username=root
# mysql db connection password
mysql.jdbc.password=hjt13512
           

2.3 SqlSessionFactory的建構

1. SqlSessionFactory對象:
  1. 每一個MyBatis的應用程式都以一個SqlSessionFactory對象的執行個體為核心。
  2. SqlSessionFactory是個單個資料庫映射關系經過編譯後的記憶體鏡像。
  3. SqlSessionFactory對象的執行個體可以通過SqlSessionFactoryBuilder對象類獲得,而SqlSessionFactoryBuilder則可以從XML配置檔案或一個預先定制的Configuration的執行個體建構出SqlSessionFactory的執行個體。
  4. SqlSessionFactory線程安全。
  5. SqlSessionFactory一旦被建立,在應用執行期間都存在,建議使用單例模式。
  6. SqlSessionFactory是建立SqlSession的工廠
2. SqlSessionFactory執行個體化

1.使用xml配置檔案建立

//mybatis的配置檔案相對路徑
        String resource = "mybatis-config.xml";
        //使用類加載器加載mybatis的配置檔案(它也加載關聯的映射檔案)
        InputStream in1 = main.class.getClassLoader().getResourceAsStream(resource);
        //建構sqlSession的工廠
        SqlSessionFactory sessionFactory1 = new SqlSessionFactoryBuilder().build(in1);

        //使用MyBatis提供的Resources類加載mybatis的配置檔案(它也加載關聯的映射檔案)
        InputStream in2 = Resources.getResourceAsStream(resource);
        //建構sqlSession的工廠
        SqlSessionFactory sessionFactory2 = new SqlSessionFactoryBuilder().build(in2);
        
        //使用MyBatis提供的Resources類加載mybatis的配置檔案(它也加載關聯的映射檔案)
        Reader reader = Resources.getResourceAsReader(resource);
        //建構sqlSession的工廠
        SqlSessionFactory sessionFactory3 = new SqlSessionFactoryBuilder().build(reader);
        
        //建立能執行映射檔案中sql的sqlSession
        SqlSession session = sessionFactory1.openSession();
           

2.使用java代碼實作SqlSessionFactory 的執行個體

//資料源連接配接池對象的建立
        PooledDataSource dataSource = new PooledDataSource();
        //設定資料庫驅動
        dataSource.setDriver("com.mysql.cj.jdbc.Driver");
        //設定url位址
        dataSource.setUrl("jdbc:mysql://localhost:3306/kern?useSSL=true&serverTimezone=UTC");
        //設定賬号以及密碼
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        //事務工廠
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        //mybatis内置的環境對象
        Environment environment = new Environment("mysql_datasource", transactionFactory , dataSource);
        //mybatis内置的配置對象
        Configuration configuration = new Configuration(environment);
        //建構sqlSession的工廠
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        //建立能執行映射檔案中sql的sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
           
3. SqlSession對象
  1. SqlSession是MyBatis的關鍵對象,是執行持久化操作的獨享,類似于JDBC中的Connection。
  2. 它是應用程式與持久層之間執行互動操作的一個單線程對象。
  3. SqlSession對象完全包含以資料庫為背景的所有執行SQL操作的方法,它的底層封裝了JDBC連接配接,可以用SqlSession執行個體來直接執行被映射的SQL語句.每個線程都應該有它自己的SqlSession執行個體。
  4. SqlSession的執行個體不能被共享,同時SqlSession非線程不安全的,絕對不能将SqlSeesion執行個體的引用放在一個類的靜态字段甚至是執行個體字段中.也絕不能将SqlSession執行個體的引用放在任何類型的管理範圍中,比如Servlet當中的HttpSession對象中。
  5. 使用SqlSession的執行個體執行增删改等改變資料庫資料的操作時,應該在操作執行完後送出事務。
  6. 使用完SqlSeesion之後應調用sqlSession.close方法進行關閉。
4. SqlSession對象執行個體化
//使用SqlSessionFactory對象的執行個體建立SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
           

到此為止,我們完成了SqlSession的執行個體化,獲得了持久層的一個單線程對象,但是我們并不能馬上對資料庫進行操作,我們還需要完成映射的配置以及與庫表對應的javaBean的建立。

2.4 持久層的mapper檔案以及javaBean

首先在資料庫建立user表,設計如下

MyBatis學習總結 11 Mybatis簡介2 入門

sql語句

--建立users表格
CREATE TABLE users (
id BIGINT KEY AUTO_INCREMENT,
user_name VARCHAR(30) NOT NULL,
password VARCHAR(100) NOT NULL);

--執行插入語句
INSERT INTO users (user_name,password) VALUES('kern','123456');
INSERT INTO users (user_name,password) VALUES('john','123456');
           

建立javabean UsersBO

package Model;

/**
 * @author Kern
 * @Title: UsersBO
 * @ProjectName MyBatis_Study
 * @Description: TODO
 * @date 2019-4-1011:10
 */
public class UsersBO {

    private Long id;

    private String userName;

    private String password;

    public Long getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "使用者資訊[" +
                " 使用者id:" + id +
                " 使用者名:" + userName +
                " 密  碼:" + password +
                ']';
    }
}

           

建立mapper檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis映射mapper檔案的規範檔案http://mybatis.org/dtd/mybatis-3-mapper.dtd-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 為這個mapper指定一個唯一的namespace,
namespace的值習慣上設定成包名+sql映射檔案名,這樣就能夠保證namespace的值是唯一的
例如namespace="mapping.usersMapper"就是mapping(包名)+usersMapper(usersMapper.xml檔案去除字尾) -->
<mapper namespace="mapping.UserMapper">
    <!-- 在select标簽中編寫查詢的SQL語句,
    設定select标簽的id屬性為getUser,id屬性值必須唯一,id用于sql語句塊的查詢
    使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢傳回的結果集類型
    resultType="Model.UsersBO"就表示将查詢結果封裝成一個UsersBO類的對象傳回
    UsersBO類就是users表所對應的實體類
    -->
    <select id="getUser" parameterType="long" resultType="Model.UsersBO">
        SELECT * from users where id = #{id}
    </select>

    <!--當主鍵支援自增長時,可以使用useGeneratedKeys屬性,在新增結束後傳回主鍵到對應實體類的具體執行個體中
    keyColumn 庫表主鍵字段 keyProperty bean中對應的主鍵屬性-->
    <insert id="addUser" parameterType="Model.UsersBO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO
        users (user_name , password)
        VALUES (#{userName},#{password})
    </insert>

    <select id="getUsers" resultType="Model.UsersBO">
        SELECT * from users
    </select>
</mapper>
           

我們在mapper檔案中書寫了三個sql語句。

建立完mapper檔案後,我們需要在mybatis配置的xml檔案或者Configuration 對象的執行個體中對mapper檔案進行注冊。

xml檔案中注冊mapper

<!--映射注冊 加載映射檔案-->
    <mappers>
        <mapper resource="mapping/UserMapper.xml" />
    </mappers>
           

java代碼中注冊mapper

//建立一個mapper.xml檔案namespace屬性指定的mapper接口
public interface UserMapper {

    UsersBO getUser(Long id);

    void addUser(UsersBO usersBO);

    List<UsersBO> getUsers();
}
           
//建立一個mapper.xml檔案namespace屬性指定的mapper接口
Configuration configuration = new Configuration(environment);
//注冊mapper檔案
configuration.addMapper(UserMapper.class);
//設定字段駝峰轉換
configuration.setMapUnderscoreToCamelCase(true);
//建構sqlSession的工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
           

2.5 使用mybatis對資料庫執行CRUD操作

我們先檢視SqlSession的源碼

public interface SqlSession extends Closeable {

    <T> T selectOne(String var1);

    <T> T selectOne(String var1, Object var2);

    <E> List<E> selectList(String var1);

    <E> List<E> selectList(String var1, Object var2);

    <E> List<E> selectList(String var1, Object var2, RowBounds var3);

    <K, V> Map<K, V> selectMap(String var1, String var2);

    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);

    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);

    <T> Cursor<T> selectCursor(String var1);

    <T> Cursor<T> selectCursor(String var1, Object var2);

    <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);

    void select(String var1, Object var2, ResultHandler var3);

    void select(String var1, ResultHandler var2);

    void select(String var1, Object var2, RowBounds var3, ResultHandler var4);

    int insert(String var1);

    int insert(String var1, Object var2);

    int update(String var1);

    int update(String var1, Object var2);

    int delete(String var1);

    int delete(String var1, Object var2);

    void commit();

    void commit(boolean var1);

    void rollback();

    void rollback(boolean var1);

    List<BatchResult> flushStatements();

    void close();

    void clearCache();

    Configuration getConfiguration();

    <T> T getMapper(Class<T> var1);

    Connection getConnection();

           

SqlSession接口提供了支援CRUD操作的方法,根據sql标簽和參數類型有多個方法。

具體實作

/**
         * 查詢清單
         */
        String statement = "mapping.UserMapper.getUsers";
        List<UsersBO> users1 = session.selectList(statement);
        System.out.println("第一次執行==查詢清單"+users1);


        /**
         * 映射sql的辨別字元串,
         * mapping.UserMapper是UserMapper.xml檔案中mapper标簽的namespace屬性的值,
         * getUser是select标簽的id屬性值,通過select标簽的id屬性值就可以找到要執行的SQL
         */
        statement = "mapping.UserMapper.getUser";//映射sql的辨別字元串
        //執行查詢傳回一個唯一user對象的sql
        UsersBO user1 = session.selectOne(statement, 1L);
        System.out.println("第二次執行==查詢"+user1);

        UserMapper userMapper = session.getMapper(UserMapper.class);
        UsersBO user2 = userMapper.getUser(2L);
        System.out.println("第三次執行==查詢"+user2);

        /**
         * 事務操作 -- 增删改
         * 映射sql的辨別字元串,
         * mapping.UserMapper是UserMapper.xml檔案中mapper标簽的namespace屬性的值,
         * addUser是insert标簽的id屬性值,通過insert标簽的id屬性值就可以找到要執行的SQL
         */
        statement = "mapping.UserMapper.addUser";
        UsersBO user3 = new UsersBO();
        user3.setUserName("jack");
        user3.setPassword("123456");
        session.insert(statement, user3);
        System.out.println("第四次執行==插入"+user3);

        /**
         * 事務操作 -- 增删改
         * 也可以通過xml的映射接口檔案擷取mapper映射,
         * 調用接口方法實作操作
         */
        UsersBO user4 = new UsersBO();
        user4.setUserName("mark");
        user4.setPassword("123456");
        userMapper.addUser(user4);
        System.out.println("第五次執行==插入"+user4);

        /**
         * 查詢清單
         */
        statement = "mapping.UserMapper.getUsers";
        List<UsersBO> users2 = session.selectList(statement);
        System.out.println("第六次執行==查詢清單"+users2);

        //有事務操作時,需要對session進行送出
        session.commit();

        //session一定要執行關閉
        session.close();
           

執行代碼 -->控制台輸出

第一次執行==查詢清單[使用者資訊[ 使用者id:1 使用者名:kern 密  碼:123456], 使用者資訊[ 使用者id:2 使用者名:john 密  碼:123456]]
第二次執行==查詢使用者資訊[ 使用者id:1 使用者名:kern 密  碼:123456]
第三次執行==查詢使用者資訊[ 使用者id:2 使用者名:john 密  碼:123456]
第四次執行==插入使用者資訊[ 使用者id:3 使用者名:jack 密  碼:123456]
第五次執行==插入使用者資訊[ 使用者id:4 使用者名:mark 密  碼:123456]
第六次執行==查詢清單[使用者資訊[ 使用者id:1 使用者名:kern 密  碼:123456], 使用者資訊[ 使用者id:2 使用者名:john 密  碼:123456], 使用者資訊[ 使用者id:3 使用者名:jack 密  碼:123456], 使用者資訊[ 使用者id:4 使用者名:mark 密  碼:123456]]
           

檢視資料庫

MyBatis學習總結 11 Mybatis簡介2 入門

繼續閱讀