MyBatis初始

  MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis MyBatis是一個基於Java持久層框架。iBATIS提供的持久層框架包括SQL MapsData Access ObjectsDAOMyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java POJOsPlain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

  1. 框架:

       應用的半成品

    一個框架程序員可以配置的選擇/選項越多,認爲這款框架的可擴展性強。

    面向SQL的一個框架  SQL程序員入參自動裝配返回值自動裝配

       可重用的公共結構

       按一定規則組織的一組組件

  2. 組件

      Component

       對數據和方法的簡單封裝

       封裝了特定功能和屬性的一個對象

  3. 持久化,ORM

       持久化是程序數據在瞬時狀態和持久狀態間轉換的過程

    ORM:(Object Relational Mapping)對象關係映射

     

    第一步創建核心配置文件

    第二步創建數據庫表對應的實體類

    第三步創建Mapper配置文件,再加入核心配置文件

    第四步加載核心配置文件,創建SqlSessionFactory,使用工廠產生SqlSession

    第五步使用MyBatis的各種方法完成增刪查改操作

     

     所使用的jar包需要:

    Idea創建maven工程慢的解決方案:

    -DarchetypeCatalog=internal:

    第一步:

    創建項目,我的完整版如下:

    大配置(mybatis-config.xml)裏面寫連接數據庫的字符串:

package cn.ljl.test;

import cn.ljl.dao.DeptDao;
import cn.ljl.entity.Dept;
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 org.junit.Test;

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

public class MyBatisTest01 {
    /*查詢所有*/
    @Test
    public void testall() {
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList");
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*按照id查詢姓名*/
    @Test
    public void testgetMapper() {
        System.out.println("mapper");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            List<Dept> list = dao.getAllList();
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //02.帶條件查詢  resultMap的使用
    @Test
    public void testGetOneDeptResultMap() {
        System.out.println("resultMap");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            Dept dept = dao.getDeptResultMapById(1);
            System.out.println(dept.getUname());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

 

第二步:

  1. 編寫MyBatis配置文件 mybatis-config.xml(以下是我的mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--根節點-->
    <typeAliases>
        <package name="cn.ljl.entity" ></package>
    </typeAliases>
    <environments default="development">  <!--環境-->
        <environment id="development">
            <transactionManager type="JDBC"/><!--事務管理機制:JDBC|Managed-->
            <dataSource type="POOLED">  <!--UNPooled,JNDI-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatiits"/>
                <property name="username" value="sa"/>
                <property name="password" value="ljl19980427"/>
            </dataSource>
        </environment>

    </environments>
    <mappers>
        <mapper resource="cn/ljl/dao/DeptDao.xml"/>
    </mappers>
</configuration>
  1. 創建實體類:(Dept

 public class Dept {
    private Integer uid;
    private String uname;
(不要忘記屬性封裝getset
    }
  1. 創建SQL映射文件 DeptDao.xml

    (我這裏是三個方法)(這個是小配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
        PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.ljl.dao.DeptDao">
    <!--resultMap-->
    <resultMap id="deptResultMap" type="Dept">
        <id property="uid" column="uid"></id>
        <result property="uname" column="uname"></result>
    </resultMap>
    <!--查詢所有-->
    <select id="getAllList" resultType="Dept">
       select * from userinfo
</select>
    <!--按照id查詢姓名-->
    <select id="getDeptById" parameterType="int" resultType="Dept">
          select * from userinfo where uid=#{uid}
</select>
    <!--按照id查詢姓名 返回resultMap-->
    <select id="getDeptResultMapById" parameterType="int" resultMap="deptResultMap">
           select * from userinfo where uid=#{uid}
</select>
</mapper>
  1. 書寫測試類

  package cn.ljl.test;

import cn.ljl.dao.DeptDao;
import cn.ljl.entity.Dept;
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 org.junit.Test;

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

public class MyBatisTest01 {
    /*查詢所有*/
    @Test
    public void testall() {
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSessionFactoryBuilderSqlSessionFactory沒有關係,但是要用到)
            SqlSession session = factory.openSession();
            List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList");
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*按照id查詢姓名*/
    @Test
    public void testgetMapper() {
        System.out.println("mapper");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            List<Dept> list = dao.getAllList();
            for (Dept dept : list) {
                System.out.println(dept.getUname());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //02.帶條件查詢  resultMap的使用
    @Test
    public void testGetOneDeptResultMap() {
        System.out.println("resultMap");
        String path = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(path);
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            SqlSession session = factory.openSession();
            DeptDao dao = session.getMapper(DeptDao.class);
            Dept dept = dao.getDeptResultMapById(1);
            System.out.println(dept.getUname());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
這裏需要注意一個知識點:
 
 * MyBatis中執行事務的方式(執行完畢某個操作成功後以後不進行數據回滾)
 * 第一種方式:直接在openSession方法中添加參數true,自動提交的方式
 * 第二種方式:在完成整個邏輯操作後,添加代碼session.commit();,完成事務的手動提交

以上就是上課的時候的一個小例子,下面介紹MyBatis的其他:

1、 mybatis配置 
SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。 
mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

2、 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠 
3、 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。 
4、 mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。 
5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。 
6、 Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的Java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。 
7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

輸出映射(返回的結果集可以有哪些類型)

1)基本類型

2)pojo類型

3)List類型

動態sql:動態的拼接sql語句,因爲sqlwhere條件有可能多也有可能少

1)where:可以自動添加where關鍵字,還可以去掉第一個條件的and關鍵字

2)if:判斷傳入的參數是否爲空

3)foreach:循環遍歷傳入的集合參數

4)sql:封裝查詢條件,以達到重用的目的

 

對單個對象的映射關係:

1)自動關聯(偷懶的辦法):可以自定義一個大而全的pojo,然後自動映射其實是根據數據庫總的字段名稱和

pojo中的屬性名稱對應.

2)手動關聯: 需要指定數據庫中表的字段名稱和javapojo類中的屬性名稱的對應關係.

使用association標籤

 

對集合對象的映射關係

只能使用手動映射:指定表中字段名稱和pojo中屬性名稱的對應關係

使用collection標籤

springmybatis整合

整合後會話工廠都歸spring管理

1)原生Dao實現:

需要在spring配置文件中指定dao實現類

dao實現類需要繼承SqlSessionDaoSupport超類

dao實現類中不要手動關閉會話,不要自己提交事務.

2)Mapper接口代理實現:

spring配置文件中可以使用包掃描的方式,一次性的將所有mapper加載

 

逆向工程:自動生成Pojo,還可以自動生成Mapper接口和映射文件

注意:生成的方式是追加而不是覆蓋,所以不可以重複生成,重複生成的文件有問題.

如果想重複生成將原來生成的文件刪除

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章