6

「trains」テーブルからすべての行を選択して、簡単なMyBatisの例を実行しようとしています。

問題は、クエリが実行されることですが、正しい数の要素を含むリストが返されますが、null値が入力されます。JDBCPreparedStatementで直接実行された同じクエリは正常に機能します。

構成の問題かもしれませんが、何が間違っているのか理解できません。

これがコードです。前もって感謝します。

Train.java

package org.example.mybatis.domain;

public class Train implements Serializable
{
private int id;
private String type;

    // getters and setters
}

TrainMapper.java

package org.example.mybatis.persistence;

public interface TrainMapper {

List<Train> getAllTrains();
}

TrainSelector.java

package org.example.mybatis.test;

public class TrainSelector implements TrainMapper {

    private static String resource = "mybatis-config.xml";
    private static SqlSessionFactory factory = null;

    private SqlSessionFactory getSqlSessionFactory()
    {
        if (factory == null)
        {
            try {
                InputStream inputStream = Resources.getResourceAsStream(resource);
                factory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
         }
         return factory;
    }

    @Override
    public List<Train> getAllTrains()
    {
        List<Train> trains = null;

        SqlSession session = getSqlSessionFactory().openSession();
        try {
            TrainMapper mapper = session.getMapper(TrainMapper.class);
            trains = mapper.getAllTrains();
        } finally {
            session.close();
        }   
        return trains;
    }

    public static void main(String[] args) {
        List<Train> trains = null;

        TrainSelector trainSelector = new TrainSelector();
        trains = trainSelector.getAllTrains();

        System.out.println(trains);
    }

}

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
  <properties resource="database.properties" />

  <typeAliases>
    <typeAlias alias="Train" type="org.example.mybatis.domain.Train" />
    <!--package name="org.example.mybatis.domain" />-->
  </typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="org/example/mybatis/persistence/TrainMapper.xml" />
  </mappers>
</configuration>

TrainMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.example.mybatis.persistence.TrainMapper">

  <cache />

  <select id="getAllTrains" parameterType="list" resultType="Train">
    SELECT * 
    FROM trains
  </select>
</mapper>

JdbcStatementExample.java

package org.example.mybatis.test;

public class JdbcStatementExample {

    private static void selectAllTrains() throws SQLException
    {
        String sql = "SELECT * FROM trains";
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String url = "jdbc:mysql://localhost/testing";
        String user = "test";
        String password = "test";

        try {
            conn = DriverManager.getConnection(url, user, password);
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                String id = rs.getString("train_id");
                String type = rs.getString("train_type");
                System.out.println("id: " + id);
                System.out.println("type: " + type);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            if (ps != null) {
                ps.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }

    public static void main(String[] args)
    {
        try {
            selectAllTrains();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
4

4 に答える 4

9

結果セットの列の名前は、Trainオブジェクトのプロパティの名前とは異なります。Mybatisにどの列をどのプロパティにマップするかを知らせるには、明示的な結果マップが必要です。

<resultMap id="trainMap" type="Train>
        <id property="id" column="train_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
        <result property="type" column="train_type" javaType="java.lang.String" jdbcType="VARCHAR"/>
</resultMap>

選択した要素を

<select id="getAllTrains" parameterType="list" resultType="trainMap">
    SELECT * FROM trains
</select>
于 2012-12-19T14:20:12.937 に答える
1

他のオプションは、列名、エイリアスを使用することです。

列名はデータベースのものになり、エイリアスはTrainオブジェクトのプロパティと一致するように設定されます。

<select id="getAllTrains" parameterType="list" resultType="trainMap">
  SELECT 
  train_id as id,
  train_type as type
  FROM trains
</select>
于 2019-02-28T10:02:42.610 に答える
0

結果は、Seetaまたは公式ドキュメントの説明に従ってマッピングできます: https ://mybatis.org/mybatis-3/sqlmap-xml.html

MyBatis 3.xでは、 resultTypeではなくresultMapを設定する必要があるため、この例は機能しません。また、両方を同時に設定しないでください。実例は次のようになります。

<select id="getAllTrains" parameterType="list" resultMap="trainMap">
    SELECT * FROM trains
</select>
于 2021-03-30T16:14:48.953 に答える
0

同じ問題が発生しましたが、複数の単語を含むフィールドでのみ発生しました。もちろん、SQLでの私の命名規則はuser_idであり、javaでの命名規則はuserIdでした。mybatis-config.xmlファイル内のこの設定は1日を節約しました:

<settings>   
    <setting name="mapUnderscoreToCamelCase" value="false"/> 
</settings>

またはプロパティファイルの場合:

mybatis.configuration.map-underscore-to-camel-case = true

クレジット:https ://chois9105.github.io/spring/2017/12/31/configuring-mybatis-underscore-to-camel-case.html

于 2021-10-28T04:24:19.633 に答える