mybatis學習筆記(二):增、刪、改、查


接上一篇 mybatis學習筆記(一):第一個 Mybatis 例子,Mybatis 的基本用法


修改 StudentMapper.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">

<!-- namespace 是名稱空間,理論上可以隨便寫,但必須保證唯一 -->
<mapper namespace="studentNamespace">

    <!--
        resultMap 標籤:映射實體與表的關係;
            當實體類中的屬性名 和 表中的字段名 不一樣的時候,<resultMap> 標籤表示的映射關係必須要寫;
            但是如果 實體類中的屬性名 和 表中的字段名 完全一樣的時候,<resultMap> 標籤可以省略不寫;

            id:爲實體與表的映射 取一個任意的唯一編號;
            type:實體的全路徑名;
        注意:
            映射實體類與表的關係時,此處並沒有指定表的名字,
            是因爲下面的 insert 語句中指出了要操作的表的名字;
    -->
    <resultMap id="studentMap" type="com.mybatis.demo.Student">
        <!--
            id 標籤:映射主鍵屬性;
                property:表示實體類中的屬性;
                column:表示表中的主鍵;
        -->
        <id property="id" column="id"/>

        <!--
            result 標籤:映射非主鍵屬性;
                property:表示實體類中的屬性;
                column:表示表中的字段;
        -->
        <result property="name" column="name"/>
        <result property="sal" column="sal"/>
    </resultMap>

    <!--
        insert 標籤:表示標籤中要寫的是插入 sql 語句;
            id:爲插入 sql 語句取一個任意唯一的編號;
        parameterType:表示 dao 中調用執行此 SQL 語句時傳入的參數類型;如果是類的話,必須使用全路徑名;
            如果 SQL 語句不需要接收參數,可以不寫 parameterType 屬性;

        在 sql 語句中用佔位符取值 (#{id}, #{name}, #{sal}),實際上是調用 Student 對象的 getter 方法取值;
            Student 對象是 dao 中調用此 SQL 語句時傳入的;
    -->
    <insert id="add" parameterType="com.mybatis.demo.Student">
        insert into students(id, name, sal) values (#{id}, #{name}, #{sal})
    </insert>

    <!--
        select 標籤:根據 id 查詢單個學生;
            resultType:表示 dao 中調用執行此 SQL 語句的方法返回的類型;
            resultMap:表示將查詢出來的記錄,根據 id 爲 studentMap 的 <resultMap> 標籤中的映射關係,自動封裝到對應的實體類中;
                當實體類中的屬性名 和 表中的字段名 不一樣的時候,必須要寫這個屬性,而且 <resultMap> 表示的映射關係也必須要寫;
                但是如果 實體類中的屬性名 和 表中的字段名 完全一樣的時候,這個屬性可以省略,並且 <resultMap> 這個標籤也可以省略;

        注意:如果參數不是一個實體類,只是一個普通變量,比如 int、double、String 等,
            佔位符中的變量理論上可以隨便寫,即 #{id} 寫成 #{xxxyyy} 也可以;
            但是建議寫成和方法的形參一樣,便於閱讀;
    -->
    <select id="findById" parameterType="int" resultType="com.mybatis.demo.Student"  resultMap="studentMap">
        select * from students where id = #{id}
    </select>

    <!--
        select 標籤:查詢所有學生;
            resultType:表示 dao 中調用執行此 SQL 語句的方法返回的類型;
                理論上應該返回 List 集合的類型,但這裏只需要寫 list 集合中的 元素類型即可;
    -->
    <select id="findAll" resultType="com.mybatis.demo.Student">
        select * from students
    </select>

    <!--
        update 標籤:表示標籤中要寫的是修改 sql 語句;
    -->
    <update id="update" parameterType="com.mybatis.demo.Student">
        update students set name=#{name},sal=#{sal} where id=#{id}
    </update>

    <!--
        delete 標籤:表示標籤中要寫的是刪除 sql 語句;
    -->
    <delete id="delete" parameterType="com.mybatis.demo.Student">
        delete from students where id=#{id}
    </delete>

    <!--
        注意:insert、update、delete 標籤只是一個模板,在操作數據庫時,是以 SQL 語句爲核心的;
            即在做 增、刪、改 時,insert、update、delete 標籤可通用;
            但是,做查詢操作時,只能用 select 標籤;
            建議做什麼操作用什麼標籤;
        即下面將 delete 語句寫在 insert 標籤中的做法也是可以的。
    -->
    <insert id="delete2" parameterType="com.mybatis.demo.Student">
        delete from students where id=#{id}
    </insert>

</mapper>

修改 StudentDao.java 測試文件爲:

package com.mybatis.demo;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * 持久層:測試 增、刪、改、查
 */
public class StudentDao {

    /**
     * 增加學生
     */
    public void add(Student student) throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            /**
             * 執行 insert 操作;
             * insert 的 sql 語句是從 StudentMapper.xml 映射文件中讀取的;
             * 參數爲:名稱空間.insert標籤的id;
             * 即 執行 insert 操作的 sql 語句是從 id 爲 add 的 <insert/> 標籤中讀取的;
             */
            int num = sqlSession.insert("studentNamespace.add", student);
            System.out.println("本次操作影響了 " + num + "行");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();          // 回滾事務
        }finally {
            sqlSession.commit();            // 提交事務
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    /**
     * 根據 id 查詢單個學生
     */
    public Student findById(int id) throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            /**
             * 執行 selectOne 操作:查詢一條數據
             */
            return sqlSession.selectOne("studentNamespace.findById", id);
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();          // 回滾事務
            throw e;
        }finally {
            sqlSession.commit();            // 提交事務
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    /**
     * 查詢所有學生(查詢操作可以不在事務的環境下執行)
     */
    public List<Student> findAll() throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            /**
             * 執行 selectList 操作:查詢批量數據
             */
            return sqlSession.selectList("studentNamespace.findAll");
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    /**
     * 修改學生
     */
    public void update(Student student) throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            /**
             * 執行 update 操作:更新數據
             */
            int num = sqlSession.update("studentNamespace.update", student);
            System.out.println("本次操作影響了 " + num + "行");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();          // 回滾事務
        }finally {
            sqlSession.commit();            // 提交事務
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    /**
     * 刪除學生
     */
    public void delete(Student student) throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            /**
             * 執行 delete 操作:刪除數據
             */
            int num = sqlSession.delete("studentNamespace.delete", student);
            System.out.println("本次操作影響了 " + num + "行");
        }catch (Exception e){
            e.printStackTrace();
            sqlSession.rollback();          // 回滾事務
        }finally {
            sqlSession.commit();            // 提交事務
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    /**
     * 測試
     */
    public static void main(String[] args) throws Exception{
        StudentDao dao = new StudentDao();

        // 增加數據
//        dao.add(new Student(1, "哈哈", 7000D));
//        dao.add(new Student(2, "嘿嘿", 8000D));
//        dao.add(new Student(3, "呵呵", 9000D));
//        dao.add(new Student(4, "嘻嘻", 8800D));

        // 根據 id 查詢單個學生
//        Student student = dao.findById(3);
//        System.out.println(student);

        // 查詢所有學生
//        List<Student> all = dao.findAll();
//        for (Student student : all)
//            System.out.println(student);

        // 更新數據
//        Student student = dao.findById(2);
//        student.setName("張三");
//        dao.update(student);

        // 刪除數據
        Student student = dao.findById(2);
        dao.delete(student);
    }
}

 

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