天天看點

Mybatis架構----->(2)詳解映射檔案和配置檔案

一、建立映射檔案

要求

  1. 在dao包中建立檔案StudentDao.xml
    Mybatis架構----->(2)詳解映射檔案和配置檔案
  2. 要求StudentDao.xml檔案名稱和接口StudentDao一樣,區分大小寫
<?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.StudentDao">
    <select id="selectStudens" resultType="Student">
      select * from student order by id
    </select>
    <!--插入操作-->
    <insert id="insertStudent">
        insert into student values (#{id},#{name},#{email},#{age})
    </insert>
</mapper>
        
           
  1. 解析裡面的參數:
  • namespace值:
推薦使用dao接口的全限定名稱,這裡為 com.hcz.dao.StudentDao
  • select标簽:

表示查詢操作;除此之外

update标簽表示更新資料庫的操作;

insert标簽表示插入操作;

delete标簽表示删除操作

  • id值:
表示要執行的SQL語句的唯一辨別,mybatis會使用這個id的值來找到要執行的SQL語句,可以自定義,但是要求你使用dao接口中的方法名稱,這裡查詢的接口方法名稱為selectStudens
  • resultType值:
表示結果類型,是SQL語句執行後得到ResultSet,周遊這個ResultSet得到Java對象類型,它的值要使用全限定名稱,這裡為com.hcz.dao.Student
  1. 近似jdbc中的代碼
<select id="selectStudens" resultType="Student"> 
      select id,name from student 
</select>
           

近似等價于以下jdbc代碼

//執行查詢,建立記錄集
        rs = st.executeQuery("select * from text ");
        while (rs.next()){
            Student stu = new Student();
            stu.setId(rs.getInt("id"));
            stu.setName(rs.getString("name"));
            //從資料庫取出的資料轉為Student對象,封裝到List集合中
            stuList.add(stu);
        }
           

二、建立配置檔案

<?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>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

    <!--配置mybatis環境:資料庫的連接配接資訊-->
    <environments default="mysql">
        <!--id:資料源的名稱-->
        <environment id="mysql">
            <!--配置事務類型:使用jdbc事務(使用Connection的送出和復原)-->
            <transactionManager type="JDBC"/>
            <!--資料源dataSource:建立資料庫Connection對象的commit,rollback做事務處理
                type:POOLED使用資料庫的連接配接池
            -->
            <dataSource type="POOLED">
                <!--連接配接池四要數-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3366/ssm?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="com/hcz/dao/StudentDao.xml"/>
    </mappers>
</configuration>
           

解析裡面的标簽屬性:

  • 1、< settings >标簽
mybatis.xml 檔案加入日志配置,可以在控制台輸出執行的 sql 語句和參數
  • 2、< transactionManager >标簽

mybatis送出事務,復原事務的方式

type屬性:事務處理的類型

1)JDBC:表示mybatis底層是調用JDBC中的Connection對象的,然後送出事務commit和復原事務rollback

2)MANAGED:把mybatis的事務處理委托給其他的容器(spring容器等)

  • 3、< dataSource >标簽

表示資料源,建立資料庫Connection對象的commit,rollback做事務處理

type屬性:使用資料源類型

1)POOLED:使用資料庫的連接配接池,mybatis會建立 PooledDateSource類

2)UPOOLED:不使用連接配接池,在每次執行SQL語句,先建立連接配接,再執行sql,再關閉連接配接mybatis會建立UnPooledDateSource類

  • 4、使用資料庫屬性配置檔案
為了友善對資料庫連接配接的管理,資料庫連接配接四要素資料一般都是存放在一個專門的屬性檔案中的。目的是便于修改,儲存,處理多個資料庫的資訊。下面給出具體的配置步驟:

步驟:

(1)在 classpath 路徑下,建立 properties 檔案

在 resources 目錄建立一個屬性配置檔案, xxxx.properties ,格式是 key=value ,例如 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3366/ssm?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
           

(2)在mybatis的主配置檔案,使用指定檔案的位置

<!--指定properties檔案的位置,從類路徑根(/resource)開始找檔案-->
<properties resource="jdbc.properties"/>
           

(3)使用 key 指定值

<!--連接配接池四要數-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
           
  • 5、< mappers >标簽映射器:映射檔案的位置

(1)第一種方式:< mapper resource=" " />

一次隻能找一個映射檔案,使用相對于類路徑的資源,從 classpath 路徑查找檔案,例如:

(2)第二種方式:< package name=""/> ,

使用包名,這個包中的所有xml檔案都可以一次性找到,例如:

注意:

1.映射檔案名稱需要和接口名稱一樣,區分大小寫

2.映射檔案和dao接口需要在同一個目錄下

三、建立測試類

public class MyTest {

    public static void main(String[] args) {
        //通路mybatis讀取student資料
        try {
            //1.定義mybatis主配置檔案,從類路徑的根開始(target/classes)
            String config = "mybatis.xml";
            //2.讀取配置檔案,Resources: mybatis中的一個類, 負責讀取主配置檔案
            InputStream in = Resources.getResourceAsStream(config );
            //3.建立SqlSessionFactoryBuilder對象 : 建立SqlSessionFactory對象
            SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
            //4.建立SqlSessionFactory對象
            SqlSessionFactory factory = builder.build(in);
            //5.擷取SqlSession對象,從SqlSessionFactory中擷取SqlSession
            /**
             * 1. openSession() :無參數的, 擷取是非自動送出事務的SqlSession對象
             * 2. openSession(boolean): openSession(true)  擷取自動送出事務的SqlSession.
             *       openSession(false)  非自動送出事務的SqlSession對象
             *
             */
            SqlSession sqlSession = factory.openSession();
            /**
             * SqlSession接口 :定義了操作資料的方法 例如 selectOne() ,selectList() ,
             *                  insert(),update(), delete(), commit(), rollback()
             */
            //6.【重要】指定要執行的SQL語句的辨別,sql映射檔案中的namespace+"."+标簽的id值
            String sqlId = "com.hcz.dao.StudentDao"+"."+"selectStudens";
            //7.【重要】執行SQL語句,通過sqlId找到語句
            List<Student> studentList = sqlSession.selectList(sqlId);
            //8.輸出結果
            //studentList.forEach(student -> System.out.println(student));
            for (Student student:studentList){
                System.out.println(student);
            }
            //9.關閉連接配接
            sqlSession.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
           
  • 等價代碼
//6.【重要】指定要執行的SQL語句的辨別,sql映射檔案中的namespace+"."+标簽的id值
String sqlId = "com.hcz.dao.StudentDao"+"."+"selectStudens";
//7.【重要】執行SQL語句,通過sqlId找到語句
List<Student> studentList = sqlSession.selectList(sqlId);
           

近似等價于jdbc代碼

Connection conn = 擷取連接配接對象 
String sql=” select id,name,email,age from student” 
PreparedStatement ps = conn.prepareStatement(sql); 
ResultSet rs = ps.executeQuery();