繁体   English   中英

MyBatis Java-查询未返回数据?

[英]MyBatis Java - query not returning data?

我试图在使用MyBatis的应用程序上运行一些JUnit测试。 但是,查询按预期返回数据时遇到一些问题。 我尝试使用多个表,但都不返回数据。

示例测试用例:

public class PLUMapperTest {

    private SqlSessionFactory sessionFactory;
    private static final String RES_PATH = "mybatis-config.xml";

    @Before
    public void setup() throws IOException {
        var inputStream = Resources.getResourceAsStream(RES_PATH);
        this.sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }

    @Test
    public void testAllAvailable() {
        try (var session = this.sessionFactory.openSession()) {
            var mapper = session.getMapper(PLUMapper.class);
            var activePLUs = mapper.selectAllAvailable();
            assertThat(activePLUs.size()).isGreaterThan(0);
            for (var plu : activePLUs) {
                assertThat(plu.getPluNum()).isNotBlank();
                assertThat(plu.getCategoryUID()).isGreaterThan(0);
                assertThat(plu.getShortName()).isNotBlank();
                assertThat(plu.getTypeUID()).isGreaterThan(0);
                assertThat(plu.getUnavailable()).isFalse();
            }

        }
    }

}

测试案例失败,因为“ activePLU”映射没有数据。 与数据库的连接成功,并且我可以(通过psql)验证数据确实在数据库中。

我的映射器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="com.midamcorp.data.mapper.PLUMapper">

    <select id="selectAllAvailable" resultType="PLU">
    SELECT * FROM plu WHERE unavailable = FALSE
    </select>

    <select id="selectActiveByTypeUID" parameterType="int" resultType="PLU">
    SELECT * FROM plu WHERE type_uid = #{id} AND unavailable = FALSE
    </select>

    <select id="selectActiveByCategoryUID" parameterType="int" resultType="PLU">
    SELECT * FROM plu WHERE category_uid = #{id} AND unavailable = FALSE
    </select>

</mapper>

...以及相应的界面:

public interface PLUMapper {

    public List<PLU> selectAllAvailable();

    public List<PLU> selectActiveByTypeUID(int id);

    public List<PLU> selectActiveByCategoryUID(int id);
}

我试图在语句中删除WHERE子句,以防出现问题,但没有成功。 我还尝试在界面上使用注释(@Select(“ ..”))。

MyBatis配置文件(为简便起见,省略了一些行):

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">


<configuration>
    <properties resource="db-config.properties">
    </properties>
    <typeAliases>

        <typeAlias alias="PLU" type="com.midamcorp.data.model.PLU" />

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

        <mapper resource="PLUMapper.xml" />

    </mappers>
</configuration>

我的PLU课程(更少的获取器和设置器)

package com.midamcorp.data.model;

public class PLU {

    private String pluNum;
    private int typeUID;
    private int categoryUID;
    private String shortName;
    private double price;
    private boolean unavailable;

}

我以前使用过MyBatis,但从未遇到过此问题。 任何建议表示赞赏。

编辑:

有关表格的架构:

CREATE TABLE public.plu (
    plunum varchar NOT NULL,
    type_uid int4 NOT NULL,
    category_uid int4 NOT NULL,
    short_name varchar NOT NULL,
    price numeric(5,2) NOT NULL,
    unavailable bool NOT NULL DEFAULT false,
    CONSTRAINT plu_pkey PRIMARY KEY (plunum),
    CONSTRAINT plu_category_uid_fkey FOREIGN KEY (category_uid) REFERENCES plu_categories(plu_categories_uid),
    CONSTRAINT plu_type_uid_fkey FOREIGN KEY (type_uid) REFERENCES plu_types(plu_type_uid)
);

请注意,查看查询后,我更新了PLU类中的“ plunum”,“ categoryUID”和“ typeUID”属性。

编辑:更新的映射文件:

<resultMap id="pluMap"  type="PLU">
 <result property="pluNum" column="plunum"/>
  <result property="typeUID" column="type_uid"/>
    <result property="categoryUID" column="category_uid"/>
   <result property="shortName" column="short_name"/>
    <result property="price" column="price"/>
        <result property="unavailable" column="unavailable"/>
</resultMap>

<select id="selectAvailablePLUs" resultMap="pluMap">
    SELECT * FROM plu WHERE unavailable = FALSE
    </select>

    <select id="selectPLUsByType" parameterType="int" resultType="PLU">
    SELECT * FROM plu WHERE type_uid = #{id} AND unavailable = FALSE
    </select>

    <select id="selectPLUsByCat" parameterType="int" resultType="PLU">
    SELECT * FROM plu WHERE category_uid = #{id} AND unavailable = FALSE
    </select>

</mapper>
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 58613637.
Setting autocommit to false on JDBC Connection [org.postgresql.jdbc.PgConnection@37e5f85]
==>  Preparing: SELECT plunum, type_uid, category_uid, short_name, price, unavailable FROM public.plu WHERE unavailable = FALSE 
==> Parameters: 
<==    Columns: plunum, type_uid, category_uid, short_name, price, unavailable
<==        Row: 50000199, 200, 99, DRIVE THRU #1, 0.00, f
<==        Row: 200, 17, 81, Crew Meal 200, 0.00, f
<==        Row: 30000000, 5, 90, CASH, 0.00, f
<==        Row: 30000002, 17, 81, GUEST SATISFACTION, 1.00, f
<==        Row: 20000001, 12, 89, TOTAL   SALES, 0.00, f
<==        Row: 20000002, 11, 86, SUBTOTAL DINE IN, 0.00, f
<==        Row: 20000003, 11, 86, SUBTOTAL TAKE OUT, 0.00, f
<==        Row: 20000004, 11, 86, SUBTOTAL DRIVE THRU, 0.00, f
```

模式上的字段之间的映射不会映射到PLU模型类上的映射。

例如,在表上,您具有字段type_uid,但在PLU类上,它称为typeUid。 除非您提供帮助,否则MyBatis根本不知道如何进行映射。 您可以将Java类上的字段名称更改为与表上的字段相同,也可以使用MyBatis TypeAlias(更好的解决方案),有关如何使用TypeAlias的信息,请参见此处http:// www .mybatis.org / mybatis-3 / sqlmap-xml.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM