1.1 resultType
resultType:sqlを実行してResultSetの変換されたタイプを取得し、そのタイプの完全修飾名またはエイリアスを使用します。
注:返品がコレクションの場合は、コレクション自体ではなく、コレクションに含まれるタイプに設定する必要があります。resultTypeとresultMapを同時に使用することはできません。
A、シンプルタイプ
インターフェイスメソッド:
int countStudent();
マッパーファイル:
<!--resultType简单类型-->
<select id="countStudent" resultType="int">
select count(*) from student
</select>
または:
<!--resultType简单类型-->
<select id="countStudent" resultType="java.lang.Integer">
select count(*) from student
</select>
注:resultType結果タイプの値
- タイプの完全修飾名
- タイプエイリアス。たとえば、java.lang.Integerエイリアスはintです。
テストファイル:
@Test
public void testReturnInt(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class); // 这句代码可以自动创建dao接口的实现类对象
int count = dao.countStudent();
System.out.println("学生总人数:"+ count);
}
B.オブジェクトタイプ
インターフェイスメソッド:
public Student selectStudentById(@Param("studentId") Integer id);
マッパーファイル:
<select id="selectStudentById" resultType="com.zep.domain.Student">
select id,name,email,age from student where id=#{studentId}
</select>
テストファイル:
@Test
public void testSelectStudentById() {
/**
* 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
* getMapper能够获取dao接口对应的实现类对象。
*/
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class); // 这句代码可以自动创建dao接口的实现类对象
//调用dao的方法,执行数据库的操作
Student student = dao.selectStudentById(1001);
System.out.println("学生=" + student);
}
注:Daoインターフェイスメソッドはコレクションタイプを返します。コレクション自体ではなく、コレクションでタイプを指定する必要があります。
mybatisでは、カスタムタイプにエイリアスを指定することもできます。
メソッド:
1)mybatisメイン構成ファイルで<typeAlias>
定義してエイリアスを定義します。
<!--定义别名-->
<typeAliases>
<!--可以指定一个类型一个自定义别名
type:自定义类型的全限定名称
alis:别名(短小,容易记忆)
-->
<typeAlias type="com.zep.domain.Student" alias="stu"/>
<typeAlias type="com.zep.vo.ViewStudent" alias="vstu"/>
</typeAliases>
2)resultTypeでカスタムエイリアスインターフェイスメソッドを使用できます
:
public Student selectStudentById(@Param("studentId") Integer id);
マッパーファイル:
<select id="selectStudentById" resultType="stu">
select id,name,email,age from student where id=#{studentId}
</select>
テストファイル:
@Test
public void testSelectStudentById() {
/**
* 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
* getMapper能够获取dao接口对应的实现类对象。
*/
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class); // 这句代码可以自动创建dao接口的实现类对象
//调用dao的方法,执行数据库的操作
Student student = dao.selectStudentById(1001);
System.out.println("学生=" + student);
}
または、パッケージスキャンを使用します<package>
:
1)mybatisメイン構成ファイルで<package>
定義してエイリアスを定義します
<typeAliases>
<!--
第一种方式:
可以指定一个类型一个自定义别名
type:自定义类型的全限定名称
alis:别名(短小,容易记忆)
-->
<!--<typeAlias type="com.zep.domain.Student" alias="stu"/>
<typeAlias type="com.zep.vo.ViewStudent" alias="vstu"/>-->
<!--
第二种方式
<package> name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)
-->
<package name="com.zep.domain"/>
<package name="com.zep.vo"/>
</typeAliases>
2)resultTypeの値の<package>
タグ名属性に書き込まれたコンテンツは省略できます。クラス名を書き込むだけでよく、クラス名はエイリアスです。
マッパーファイル:
<select id="selectStudentById" resultType="Student">
select id,name,email,age from student where id=#{studentId}
</select>
テストファイル:
@Test
public void testSelectStudentById() {
/**
* 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
* getMapper能够获取dao接口对应的实现类对象。
*/
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class); // 这句代码可以自动创建dao接口的实现类对象
//调用dao的方法,执行数据库的操作
Student student = dao.selectStudentById(1001);
System.out.println("学生=" + student);
}
C、地図
sqlのクエリ結果は、マップのキーと値として使用されます。Map <Object、Object>の使用をお勧めします。
注:インターフェースの戻り値としてマップします。sqlステートメントのクエリ結果には、最大で1つのレコードしか含めることができません。複数のレコードはエラーです。
インターフェイスメソッド:
//定义方法返回Map
Map<Object,Object> selectMapById(Integer id);
マッパーファイル:
<!--
返回Map
1)列名是map的key,列值是map的value
2)只能最多返回一行记录。多于一行会报错
-->
<select id="selectMapById" resultType="map">
select id,name from student where id=#{stuid}
</select>
または:
<select id="selectMapById" resultType="java.util.HashMap">
select id,name from student where id=#{stuid}
</select>
テストファイル:
// 返回Map
@Test
public void testSelectMap() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class); // 这句代码可以自动创建dao接口的实现类对象
//调用dao的方法,执行数据库的操作
Map<Object, Object> map = dao.selectMapById(1001);
System.out.println("m=" + map);
}
1.2 resultMap
resultMapは、SQL結果とJavaオブジェクト属性の間のマッピング関係をカスタマイズできます。指定された属性への列値のより柔軟な割り当て。
これは、列名がJavaオブジェクトの属性名と異なる場合によく使用されます。
使い方:
- 最初にresultMapを定義し、列名と属性の間の対応を指定します。
- で
<select>
resultTypeとこのresultMapを交換してください。
注:
resultMapとresultTypeを一緒に使用しないでください。2つのうちの1つを選択してください
インターフェイスメソッド:
/**
* 使用resultMap定义映射关系
*/
List<Student> selectAllStudents();
マッパーファイル:
<!--使用resultMap
1)先定义resultMap
2)在select标签中,使用resultMap来引用1中定义的。
-->
<!--定义resultMap
id:自定义名称,表示你定义的这个resultMap
type:java类型的全限定名称
-->
<resultMap id="studentMap" type="com.zep.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>
テストファイル:
/**/
@Test
public void testSelectAllStudents() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectAllStudents();
for (Student student : students) {
System.out.println("学生=" + student);
}
sqlSession.close();
}
異なる列名と属性名を持つ最初のソリューション:
ドメインフォルダの下に新しいMyStudent.javaを作成します。
package com.zep.domain;
public class MyStudent {
private Integer stuid;
private String stuname;
private String stuemail;
private Integer stuage;
@Override
public String toString() {
return "MyStudent{" +
"stuid=" + stuid +
", stuname='" + stuname + '\'' +
", stuemail='" + stuemail + '\'' +
", stuage=" + stuage +
'}';
}
public Integer getStuid() {
return stuid;
}
public void setStuid(Integer stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public String getStuemail() {
return stuemail;
}
public void setStuemail(String stuemail) {
this.stuemail = stuemail;
}
public Integer getStuage() {
return stuage;
}
public void setStuage(Integer stuage) {
this.stuage = stuage;
}
}
インターフェイスメソッド:
List<MyStudent> selectMyStudent();
マッパーファイル:
<resultMap id="myStudentMap" type="com.zep.domain.MyStudent">
<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> students = dao.selectMyStudent();
for (MyStudent student : students) {
System.out.println("学生=" + student);
}
sqlSession.close();
}
異なる列名と属性名の2番目の解決策:
列エイリアスを使用してデータベースの列名にエイリアスを指定し、エイリアスと属性名が同じになるようにします。
インターフェイスメソッド:
List<MyStudent> selectDiffColProperty();
マッパーファイル:
<!--列名和属性名不一样:第二种方式
resultType的默认原则是 同名的列的值赋值给同名的属性,
所以使用列别名(java对象的属性名)即可解决
-->
<select id="selectDiffColProperty" resultType="com.zep.domain.MyStudent">
select id as stuid,name as stuname,email as stuemail ,age as stuage from student
</select>
テストファイル:
@Test
public void testSelectDiffColProperty() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<MyStudent> students = dao.selectDiffColProperty();
for (MyStudent student : students) {
System.out.println("###学生=" + student);
}
sqlSession.close();
}