1. 程式人生 > 實用技巧 >封裝MyBatis輸出結果

封裝MyBatis輸出結果

目錄

一、resultType

resultType: 執行 sql 得到 ResultSet 轉換的型別,也就是要返回的結果型別,使用型別的完全限定名或別名。

注意如果返回的是集合,那應該設定為集合包含的型別,而不是集合本身。

resultType 和 resultMap,不能同時使用

1. 簡單型別(掌握)

介面方法:

int countStudent();

mapper檔案

<!--sql執行後返回一行一列-->
<select id="countStudent" resultType="int">

select count(*) from student

</select>

測試方法

@Test
public void testRetunInt(){
	int count = studentDao.countStudent();
	System.out.println(" 學生總人數:"+ count);
}

2. 物件型別(掌握)

介面方法

Student selectById(int id);

mapper檔案

<select id="selectById" resultType="com.md.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>

返回的是集合

介面方法

List<Student> selectStudents();

mapper檔案,返回的結果型別是這個集合所包含的集合型別

<select id="selectStudents" resultType="com.md.domain.Student">
	select id,name,email,age from student
</select>

Student類中要寫set和get方法

3. Map(瞭解)

sql 的查詢結果作為 Map 的 key 和 value。推薦使用 Map<Object,Object>。
注意:Map 作為介面返回值,sql 語句的查詢結果最多隻能有一條記錄。大於一條記錄是錯誤。

列名是map的key, 列值是map的value

介面方法

//定義方法返回Map
    Map<Object,Object> selectMapById(Integer id);

mapper檔案

<!--使用的少-->
    <select id="selectMapById" resultType="java.util.HashMap">
        select id,name,email from student where id=#{stuid}
    </select>

測試方法

@Test
public void testReturnMap(){
	Map<Object,Object> retMap = studentDao.selectMapById(1002);
	System.out.println(" 查詢結果是 Map:"+retMap);
}

二、resultMap(瞭解)

resultMap 可以自定義 sql 的結果和 java 物件屬性的對映關係。更靈活的把列值賦值給指定屬性。
常用在列名和 java 物件屬性名不一樣的情況,具體看下面

使用方式:

  • 先定義 resultMap,指定列名和屬性的對應關係
  • 在<select>中把 resultType 替換為 resultMap

介面方法

 List<Student> selectAllStudents();

mapper檔案

 <!--定義resultMap
        id:自定義名稱,表示你定義的這個resultMap
        type:java型別的全限定名稱
    -->
    <resultMap id="studentMap" type="com.md.domain.Student">
        <!--列名和java屬性的關係-->
        <!--主鍵列,使用id標籤
            column :列名
            property:java型別的屬性名
        -->
        <id column="id" property="id" />
        <!--非主鍵列,使用result-->
        <result column="name" property="name" />
        <result column="email" property="email" />
        <result column="age" property="age" />

  	</resultMap>

  <select id="selectAllStudents" resultMap="studentMap">
        select id,name, email , age from student
    </select>

三、實體類屬性名和列名不同

1. 使用resultMap

介面方法

List<MyStudent> selectMyStudent();

此時的情況就是實體類的屬性名和表中的列名不同,

實體類:

public class MyStudent {
    private Integer stuid;
    private String stuname;
    private String stuemail;
    private Integer stuage;
    // get、set、等方法
}    

mapper檔案

<resultMap id="myStudentMap" type="com.md.domain.MyStudent">
        <!--列名和java屬性的關係-->

        <id column="id" property="stuid" />
        <!--非主鍵列,使用result-->
        <result column="name" property="stuname" />
        <result column="email" property="stuemail" />
        <result column="age" property="stuage" />


    </resultMap>
    <!--列名和屬性名不一樣:第一種方式-->
    <select id="selectMyStudent" resultMap="myStudentMap">

         select id,name, email , age from student
    </select>

測試方法

 @Test
    public void testSelectMyStudent(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        List<MyStudent> myStudentList = dao.selectMyStudent();
        myStudentList.forEach(stu-> System.out.println(stu));

        sqlSession.close();

    }

// 列印的結果
MyStudent{stuid=1001, stuname='唐三', stuemail='[email protected]', stuage=18}
MyStudent{stuid=1002, stuname='無邪', stuemail='[email protected]', stuage=20}
MyStudent{stuid=1003, stuname='白昊天', stuemail='[email protected]', stuage=18}
MyStudent{stuid=1004, stuname='劉桑', stuemail='[email protected]', stuage=18}
MyStudent{stuid=1005, stuname='李白', stuemail='[email protected]', stuage=30}
MyStudent{stuid=1006, stuname='王昭君', stuemail='[email protected]', stuage=30}

2. 使用列別名和resultType

此時的實體類還是

public class MyStudent {
    private Integer stuid;
    private String stuname;
    private String stuemail;
    private Integer stuage;
    // get、set、等方法
} 

介面方法

List<MyStudent> selectDiffColProperty();

mapper檔案

 <!--列名和屬性名不一樣:第二種方式
       resultType的預設原則是 同名的列值賦值給同名的屬性, 使用列別名(java物件的屬性名)
    -->
    <select id="selectDiffColProperty" resultType="com.md.domain.MyStudent">
        select id as stuid ,name as stuname, email as stuemail , age stuage from student
    </select>

測試方法

    @Test
    public void testSelectDiffColProperty(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        List<MyStudent> myStudentList = dao.selectDiffColProperty();
        myStudentList.forEach(stu-> System.out.println(stu));

        sqlSession.close();
    }

結果和使用resultMap是一樣的,所以這兩種方法使用哪一種都行

四、模糊查詢like

模糊查詢的實現有兩種方式

  1. java 程式碼中給查詢資料加上“%”
  2. 在 mapper 檔案 sql 語句的條件位置加上“%”

1. 第一種

介面方法

    /*第一種模糊查詢, 在java程式碼指定 like的內容*/
//   例如:唐%
    List<Student> selectLikeOne(String name);

mapper檔案

<!--第一種 like , java程式碼指定 like的內容-->
    <select id="selectLikeOne" resultType="com.md.domain.Student">
        select id,name,email,age from student where name like #{name}
    </select>

測試檔案

   @Test
    public void testSelectLikeOne(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        List<Student> studentList = dao.selectLikeOne("唐%");
        studentList.forEach(stu-> System.out.println(stu));

        sqlSession.close();
    }

可以看出這種方法非常的方便

2. 第二種

介面方法

/* name就是唐這個值, 在mapper中拼接 like  "%" 李 "%" */
    List<Student> selectLikeTwo(String name);

mapper檔案

 <!--第二種方式:在mapper檔案中拼接 like的內容-->
    <select id="selectLikeTwo" resultType="com.md.domain.Student">
        select id,name,email,age from student where name  like "%" #{name} "%"
    </select>

測試

 @Test
    public void testSelectLikeTwo(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        List<Student> studentList = dao.selectLikeTwo("白");
        studentList.forEach(stu-> System.out.println(stu));

        sqlSession.close();
    }

這種的是直接在mapper中寫死了sql模糊查詢,不利於擴充套件

推薦第一種方式

五、總結

1. resultType

表示sql語句的執行結果,轉換為java物件的型別

  • 型別的全限定名稱

2. resultMap

自定義列名和java物件的屬性名對應關係

3. 列名和屬性名不同

  • 使用resultMap
  • 使用列別名

4. like

  • 在java程式碼中指定like的內容
  • 在mapper檔案中拼接like