封裝MyBatis輸出結果
阿新 • • 發佈:2020-08-07
目錄
一、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
模糊查詢的實現有兩種方式
- java 程式碼中給查詢資料加上“%”
- 在 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