6つ、パッケージMyBatisの出力結果resultType、resultMap、およびデータベーステーブル内の一貫性のない列名と返されたオブジェクト属性名に対する2つのソリューション(詳細な説明)

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結果タイプの値

  1. タイプの完全修飾名
  2. タイプエイリアス。たとえば、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オブジェクトの属性名と異なる場合によく使用されます。

使い方:

  1. 最初にresultMapを定義し、列名と属性の間の対応を指定します。
  2. <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();
    }

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_44827418/article/details/111468931