封裝MyBatis輸出結果

1、resultType

resultType: 執行 sql 獲得 ResultSet 轉換的類型,也就是要返回的結果類型,使用類型的徹底限定名或別名。java

注意若是返回的是集合,那應該設置爲集合包含的類型,而不是集合自己。sql

resultType 和 resultMap,不能同時使用app

1. 簡單類型(掌握)

接口方法:dom

int countStudent();

mapper文件測試

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

select count(*) from student

</select>

測試方法ui

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

2. 對象類型(掌握)

接口方法3d

Student selectById(int id);

mapper文件code

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

返回的是集合xml

接口方法對象

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);
}

2、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>

3、實體類屬性名和列名不一樣

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='ts@qq.com', stuage=18}
MyStudent{stuid=1002, stuname='無邪', stuemail='wx@qq.com', stuage=20}
MyStudent{stuid=1003, stuname='白昊天', stuemail='ht@qq.com', stuage=18}
MyStudent{stuid=1004, stuname='劉桑', stuemail='ls@qq.com', stuage=18}
MyStudent{stuid=1005, stuname='李白', stuemail='li@qq.com', stuage=30}
MyStudent{stuid=1006, stuname='王昭君', stuemail='wzj@qq.com', 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是同樣的,因此這兩種方法使用哪種都行

4、模糊查詢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模糊查詢,不利於擴展

推薦第一種方式

5、總結

1. resultType

表示sql語句的執行結果,轉換爲java對象的類型

  • 類型的全限定名稱

2. resultMap

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

3. 列名和屬性名不一樣

  • 使用resultMap
  • 使用列別名

4. like

  • 在java代碼中指定like的內容
  • 在mapper文件中拼接like
相關文章
相關標籤/搜索