[英]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.