使用springboot實現一個簡單的restful crud——02、dao層單元測試,測試從數據庫取數據


接着上一篇,上一篇我們創建了項目、創建了實體類,以及創建了數據庫數據。這一篇就寫一下Dao層,以及對Dao層進行單元測試,看下能否成功操作數據庫數據。

Dao

EmpDao

package com.jotal.springboot08restfulcrud.dao;

//將類掃描進spring ioc容器中
@Mapper
public interface EmpDao {
//    得到所有員工
    List<Employee> getAllEmp();
//    根據id得到員工
    Employee getEmpById(Integer id);
    //    保存員工
    void saveEmp(Employee employee);
    //添加員工
    void addEmp(Employee employee);
    //    刪除員工
    void delEmp(Integer emp_id);
}

EmpMapper.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.jotal.springboot08restfulcrud.dao.EmpDao">
    <select id="getAllEmp" resultMap="DeptInEmpMap">
        select * from employee,department
        where employee.department = department.departmentId
    </select>
    <select id="getEmpById" resultMap="DeptInEmpMap" parameterType="Integer">
        select * from employee,department
        where employee.emp_id=#{id} and department.departmentId=employee.department
    </select>

    <resultMap id="DeptInEmpMap" type="employee" autoMapping="true">
        <id property="emp_id" column="emp_id"/>
        <result property="lastName" column="lastName"/>
        <result property="email" column="email"/>
        <result property="gender" column="gender"/>
        <result property="birth" column="birth"/>
        <association property="department" javaType="department" autoMapping="true">
            <id column="departmentId" property="departmentId"/>
            <result column="departmentName" property="departmentName"/>
        </association>
    </resultMap>

    <delete id="delEmp" parameterType="Integer">
        delete from employee
        where emp_id=#{id}
    </delete>

    <insert id="addEmp" parameterType="employee">
        insert into employee(lastName,email,gender,birth,department)
         values (#{lastName},#{email},#{gender},#{birth},#{department.departmentId})
    </insert>

    <update id="saveEmp" parameterType="employee">
        update employee set
        lastName=#{lastName},email=#{email},gender=#{gender},department=#{department.departmentId},birth=#{birth}
        where emp_id=#{emp_id}
    </update>

</mapper>

我們重點看一下getEmpById( )的操作,也就是根據ID得到一個員工。因為員工類當中有一個department屬性,department部門類的引用,也就是說employee類的實例中會包含着一個department類的實例。那么這種情況在Mybatis中稱為"一對一",一個員工對應一個部門。

這種情況我們需要用resultMap,我們定義了一個resultMap,指定了id和類型: id="DeptInEmpMap",type="employee",這個類型我們指定了實體類中的employee,然后在result中將類的屬性和數據庫表中的字段一一對應,property是類中的屬性名,column是數據庫表的字段。id是表中的主鍵id。如果屬性名和字段名完全一致,就可以用autoMapping="true"來自動映射,不用寫result。

在association中映射我們包含在employee中的department實例。property="department"是屬性名,javaType="department"是類名。里面的id和result也和上面一樣。也可以用autoMapping="true"來自動映射

在select中使用該resultMap:resultMap="DeptInEmpMap"。


上面的有說到的是resultMap的嵌套結果的使用方式,resultMap還有一種嵌套查詢的使用方式。下面看一下實現方式:

嵌套查詢是分步完成的:

1、先按照員工id查詢員工信息

<select id="getEmpById" resultMap="DeptInEmpMap" parameterType="Integer">
    select * from employee
    where employee.emp_id=#{id}
</select>

2、根據員工實例中的部門實例的ID值去查詢部門信息

<select id="getDeptById" resultType="department" parameterType="Integer">
    select * from department
    where departmentId=#{id}
</select>

ps: getDeptById在DeptDao.xml里

3、將部門信息設置到員工中

<resultMap id="DeptInEmpMap" type="employee" autoMapping="true">
    <association property="department" column="department" select="com.jotal.springboot08restfulcrud.dao.DeptDao.getDeptById">
    </association>
</resultMap>

在這種方式中,association要設置三個值:property="department" column="department" select=""

select:表明當前屬性是調用select指定的方法查出的結果

column:指定將哪一列的值作為參數傳給這個方法

property:屬性名

同樣,修改一下getAllEmp的查詢語句也可以用嵌套查詢的方式實現getAllEmp。

Dao層單元測試、控制台輸出sql

單元測試可以在編碼的初期幫我們發現錯誤,盡快修正。如果編碼后期整個系統完整的時候再進行測試,需要走完整個系統流程,耗費時間精力資源。那么springboot怎么進行基本的單元測試呢?

依賴

<!--測試-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

測試類

這是idea為我們自動創建好的測試類,然后自己在里面添加測試方法就可以了。

@RunWith(SpringRunner.class)
//主啟動類
@SpringBootTest(classes = Springboot08RestfulcrudApplication.class)
public class Springboot08RestfulcrudApplicationTests {

    //自動裝配
    @Autowired
    EmpDao empDao;
    
    @Test
    public void contextLoads() {
    }
}

控制台輸出sql

為了更好地了解數據庫操作情況,還可以在項目中加入日志輸出,在控制台輸出sql語句。在配置文件中加入日志的配置。

com.jotal.springboot08restfulcrud.dao是包名

debug是日志的等級

#日志
logging:
  level:
    com.jotal.springboot08restfulcrud.dao: debug

下面進行進行兩個測試,在方法代碼處右鍵點擊Debug 方法名就可以了:

getAllEmpTest

@Test
public void getAllEmpTest() {
    List<Employee> employeeList = empDao.getAllEmp();
    System.out.println(empDao.getAllEmp());
    Iterator iterator = employeeList.iterator();
    int i=0;
    while (iterator.hasNext()) {
        Employee employee = (Employee) iterator.next();
        System.out.println(i+":"+employee);
        i++;
    }
}

基於resultMap的嵌套查詢,sql語句是分開執行的


getEmpByIdTest

@Test
public void getEmpByIdTest() {
    System.out.println(empDao.getEmpById(1002));
}

yoyo,成功地從數據庫拿到了數據。我們的項目進度取得了“重大”進展。其他方法的單元測試也是如此,就不在這里一一貼出來了。


這篇就講到這里,今天進行部分Dao層代碼的編寫,以及進行了Dao層代碼的單元測試,成功地從數據庫中拿到了數據。接下來就會從一個個功能入手,完成前后端的整合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM